web-dev-qa-db-ja.com

iOSアプリ内からiCloudドライブのファイルにアクセスするにはどうすればよいですか?

UIImagePickerController()と同様の方法でiCloudドライブからファイルを選択する方法はありますか?

コントローラは次の方法で提示できます。

let documentPickerController = UIDocumentPickerViewController(documentTypes: [String(kUTTypePDF), String(kUTTypeImage), String(kUTTypeMovie), String(kUTTypeVideo), String(kUTTypePlainText), String(kUTTypeMP3)], inMode: .Import)
documentPickerController.delegate = self
presentViewController(documentPickerController, animated: true, completion: nil)

デリゲートでメソッドを実装します。

func documentPicker(controller: UIDocumentPickerViewController, didPickDocumentAtURL url: NSURL)

UIDocumentPickerViewControllerを使用するためにiCloudエンタイトルメントを設定する必要はないことに注意してください。 Appleは、このコントローラーの使用方法を示すサンプルコードを提供します ここ

Swift 4.X

XCode機能でiCloud資格を有効にする必要があります。また、Appleの開発者アカウントのアプリバンドルでiCloudをオンにする必要があります。これを行うと、次の方法でドキュメントピッカーコントローラーを提示できます。

UIDocumentPickerDelegateメソッドを使用する

extension YourViewController : UIDocumentMenuDelegate, UIDocumentPickerDelegate,UINavigationControllerDelegate {

    func documentMenu(_ documentMenu: UIDocumentMenuViewController, didPickDocumentPicker documentPicker: UIDocumentPickerViewController) {
        documentPicker.delegate = self
        self.present(documentPicker, animated: true, completion: nil)
    }

    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) {
        print("url = \(url)")
    }

    func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
        dismiss(animated: true, completion: nil)    
    }
}

ボタンアクションの以下のコードを追加します

@IBAction func didPressAttachment(_ sender: UIButton) {

        let importMenu = UIDocumentMenuViewController(documentTypes: [String(kUTTypePDF)], in: .import)
        importMenu.delegate = self
        importMenu.modalPresentationStyle = .formSheet

        if let popoverPresentationController = importMenu.popoverPresentationController {
            popoverPresentationController.sourceView = sender
            // popoverPresentationController.sourceRect = sender.bounds
        }
         self.present(importMenu, animated: true, completion: nil)

    }

これは私にとってはうまく機能しています。それがあなたにも役立つことを願っています。

ハッピーコーディング:)

4
Ashu

ドキュメントピッカーは、ユーザーがアプリのサンドボックス外の宛先を選択すると、デリゲートのdocumentPicker:didPickDocumentAtURL:メソッドを呼び出します。システムはドキュメントのコピーを指定された宛先に保存します。ドキュメントピッカーは、成功を示すためにコピーのURLを提供します。ただし、アプリはこのURLで参照されているファイルにアクセスできません。 リンク

このコードは私のために働きます:

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
        let url = urls[0]
        let isSecuredURL = url.startAccessingSecurityScopedResource() == true
        let coordinator = NSFileCoordinator()
        var error: NSError? = nil
        coordinator.coordinate(readingItemAt: url, options: [], error: &error) { (url) -> Void in
            _ = urls.compactMap { (url: URL) -> URL? in
                // Create file URL to temporary folder
                var tempURL = URL(fileURLWithPath: NSTemporaryDirectory())
                // Apend filename (name+extension) to URL
                tempURL.appendPathComponent(url.lastPathComponent)
                do {
                    // If file with same name exists remove it (replace file with new one)
                    if FileManager.default.fileExists(atPath: tempURL.path) {
                        try FileManager.default.removeItem(atPath: tempURL.path)
                    }
                    // Move file from app_id-Inbox to tmp/filename
                    try FileManager.default.moveItem(atPath: url.path, toPath: tempURL.path)


                    YourFunction(tempURL)
                    return tempURL
                } catch {
                    print(error.localizedDescription)
                    return nil
                }
            }
        }
        if (isSecuredURL) {
            url.stopAccessingSecurityScopedResource()
        }

        navigationController?.dismiss(animated: true, completion: nil)
    }
2
Jhonattan