Replaces UIDocumentBrowserViewController with UIDocumentPickerViewController on iOS 17+

Prior to iOS 17, UIDocumentPickerViewController was too buggy to reliably use with iCloud Drive.
This commit is contained in:
Riley Testut 2023-06-19 19:05:27 -05:00
parent 4cf705f141
commit 8bd6fe1e11

View File

@ -8,6 +8,7 @@
import UIKit import UIKit
import MobileCoreServices import MobileCoreServices
import UniformTypeIdentifiers
import ObjectiveC import ObjectiveC
import DeltaCore import DeltaCore
@ -147,18 +148,38 @@ class ImportController: NSObject
private func presentDocumentBrowser() private func presentDocumentBrowser()
{ {
let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(ImportController.cancel)) let supportedTypes = self.documentTypes.compactMap { UTType($0) }
let documentBrowserViewController = UIDocumentBrowserViewController(forOpeningFilesWithContentTypes: Array(self.documentTypes)) let presentedViewController: UIViewController
if #available(iOS 17, *)
{
// Prior to iOS 17, UIDocumentPickerViewController was too buggy to reliably use with iCloud Drive.
let documentPickerViewController = UIDocumentPickerViewController(forOpeningContentTypes: supportedTypes, asCopy: true)
documentPickerViewController.delegate = self
documentPickerViewController.overrideUserInterfaceStyle = .dark
documentPickerViewController.allowsMultipleSelection = true
presentedViewController = documentPickerViewController
}
else
{
let documentBrowserViewController = UIDocumentBrowserViewController(forOpening: supportedTypes)
documentBrowserViewController.delegate = self documentBrowserViewController.delegate = self
documentBrowserViewController.modalPresentationStyle = .fullScreen documentBrowserViewController.modalPresentationStyle = .fullScreen
documentBrowserViewController.browserUserInterfaceStyle = .dark documentBrowserViewController.browserUserInterfaceStyle = .dark
documentBrowserViewController.allowsPickingMultipleItems = true documentBrowserViewController.allowsPickingMultipleItems = true
documentBrowserViewController.allowsDocumentCreation = false documentBrowserViewController.allowsDocumentCreation = false
let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(ImportController.cancel))
documentBrowserViewController.additionalTrailingNavigationBarButtonItems = [cancelButton] documentBrowserViewController.additionalTrailingNavigationBarButtonItems = [cancelButton]
self.presentedViewController = documentBrowserViewController presentedViewController = documentBrowserViewController
self.presentingViewController?.present(documentBrowserViewController, animated: true, completion: nil) }
self.presentedViewController = presentedViewController
self.presentingViewController?.present(presentedViewController, animated: true, completion: nil)
} }
} }
@ -195,9 +216,22 @@ extension ImportController
} }
} }
extension ImportController: UIDocumentPickerDelegate
{
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt documentURLs: [URL])
{
self.finish(with: Set(documentURLs), errors: [])
}
func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController)
{
self.cancel()
}
}
extension ImportController: UIDocumentBrowserViewControllerDelegate extension ImportController: UIDocumentBrowserViewControllerDelegate
{ {
func documentBrowser(_ controller: UIDocumentBrowserViewController, didPickDocumentURLs documentURLs: [URL]) func documentBrowser(_ controller: UIDocumentBrowserViewController, didPickDocumentsAt documentURLs: [URL])
{ {
var coordinatedURLs = Set<URL>() var coordinatedURLs = Set<URL>()
var errors = [Error]() var errors = [Error]()