1

我正在尝试在 iOS 应用程序中访问已放入 Mac 上的 iCloud 文档文件夹中的文档,但我不知道如何操作。

let manager = FileManager.default  
let dir = manager.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
let files = try? FileManager.default.contentsOfDirectory(at: dir!, includingPropertiesForKeys: nil, options: [])
print(files) //(Optional([])

我在我的应用程序功能中启用了 iCloud Documents,并且我知道我桌面上的 Documents 文件夹中有文件..

我显然在这里遗漏了一些东西..

提前致谢

4

2 回答 2

1
  1. 为 iCloud 创建 iCloud 容器

    一个。登录 developer.apple.com

    湾。转到标识符并添加 iCloud 容器。

    C。iCloud 容器一旦创建就无法删除。

  2. 创建包含 iCloud 功能的 App ID

    一个。创建应用 ID

    湾。添加具有显式 Bundle ID 的 iCloud 支持。

    C。创建 Provisioning Profile 并将其下载到 Xcode。

  3. 在 Xcode 中配置功能

    一个。单击并从“+ Capability”添加 iCloud 支持

    湾。对于 iCloud 文档存储,选择 iCloud Documents 并选择您创建的容器。

    C。在 Info.plist 中添加 NSUbiquitousContainers 键

    d。里面的“MyApp”将显示为文件夹名称。

<key>NSUbiquitousContainers</key>
    <dict>
        <key>iCloud.com.example.MyApp</key>
        <dict>
            <key>NSUbiquitousContainerIsDocumentScopePublic</key>
            <true/>
            <key>NSUbiquitousContainerSupportedFolderLevels</key>
            <string>Any</string>
            <key>NSUbiquitousContainerName</key>
            <string>MyApp</string>
        </dict>
    </dict>
  1. 测试代码片段

    一个。试试下面的快速和肮脏的测试。

    let driveURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
    if let unwrappedFU = driveURL {
        print("iCloud available")
        let fileURL = driveURL!.appendingPathComponent("test.txt")
        try? "Hello word".data(using: .utf8)?.write(to: fileURL)
    } else {
        print("iCloud not available")
    }
  1. 写入您的 App 文档文件夹不同于 iCloud 文档存储。您可以使您的 App Document 文件夹可见。通过添加到 Info.plist 2 附加属性。

    一个。添加支持打开文件到位:是

    湾。支持就地打开文件:是

    C。使用 Tim 的代码片段进行测试。https://www.youtube.com/watch?v=p1UNnsodJxc


    let file = "\(UUID().uuidString).txt"
    let contents = "Some text..."
    
    let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let fileURL = dir.appendingPathComponent(file)
    
    do {
        try contents.write(to: fileURL, atomically: false, encoding: .utf8)
    }
    catch {
        print("Error: \(error)")
    }

注意:您会注意到“在我的 iPhone”文件夹中的文件应用程序中的应用程序文件夹。那是您向用户公开的 App 的 Document 文件夹。您还会注意到 iCloud Drive 文件夹中的应用程序文件夹。这两个文件夹是不同的。您应该使用您的 App 文件夹并使用 iCloud Drive 文件夹作为您的导出目的地,这样您就不必过多地处理访问控制。

警告:奇怪的是,这一切都没有奏效,包括在 iPhone 上退出 iCloud。即使它在模拟器上工作。在我的情况下,它仅在 iPhone 重新启动时才开始工作。

于 2021-06-25T10:53:24.303 回答
0
 func clickFunction(){

            let DOCUMENTS_DIRECTORY = "Documents"
            if let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent(DOCUMENTS_DIRECTORY){
                if let pathComponent = iCloudDocumentsURL.path as? String {
                    if (FileManager.default.fileExists(atPath: pathComponent, isDirectory: nil)) {

                        //Write it out the code of getting files
                        let fileManager = FileManager.default
                        let enumerator = fileManager.enumerator(atPath: DocumentsDirectory.iCloudDocumentsURL!.path!)
                        while let file = enumerator?.nextObject() as? String {
                            //this this the file or document path.
                        }
                    }
                }
            }
        }
于 2020-03-26T04:37:49.757 回答