iOS Swift 3 以编程方式将文件复制到 iCloud Drive

iOS Swift 3 Copy File to iCloud Drive Programatically

在我有文档下载选项中。当用户从我的应用程序下载文档时,我需要将其存储到已经安装在用户移动设备中的用户 iCloud Drive。我已经在 Web 和 Xcode 中配置了 iCloud,但问题是我无法将文件正确复制到 iCloud Drive。文件已成功下载,并且它也移动到 iCloud,但文件不会出现在 iCloud Drive App 中。这是我试过的代码:

<key>NSUbiquitousContainers</key>
    <dict>
        <key>iCloud.MyAppBundleIdentifier</key>
        <dict>
            <key>NSUbiquitousContainerIsDocumentScopePublic</key>
            <true/>
            <key>NSUbiquitousContainerName</key>
            <string>iCloudDriveDemo</string>
            <key>NSUbiquitousContainerSupportedFolderLevels</key>
            <string>Any</string>
        </dict>
    </dict>

这是我的 iCloud 存储代码:

func DownloadDocumnt()
    {
        print("Selected URL: \(self.SelectedDownloadURL)")
        let fileURL = URL(string: "\(self.SelectedDownloadURL)")!

        let documentsUrl:URL =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL!
        let destinationFileUrl = documentsUrl.appendingPathComponent("Libra-\(self.SelectedDownloadFileName)")

        let sessionConfig = URLSessionConfiguration.default
        let session = URLSession(configuration: sessionConfig)

        let request = URLRequest(url:fileURL)

        let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in
            if let tempLocalUrl = tempLocalUrl, error == nil
            {
                if let statusCode = (response as? HTTPURLResponse)?.statusCode
                {
                    print("Successfully downloaded. Status code: \(statusCode)")
                }
                do
                {
                    if(FileManager.default.fileExists(atPath: destinationFileUrl.path))
                    {
                        try FileManager.default.removeItem(at: destinationFileUrl)
                        try FileManager.default.copyItem(at: tempLocalUrl, to: destinationFileUrl)
                    }
                    else
                    {
                        try FileManager.default.copyItem(at: tempLocalUrl, to: destinationFileUrl)
                    }

                    if let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
                    {

                        if(!FileManager.default.fileExists(atPath: iCloudDocumentsURL.path, isDirectory: nil))
                        {
                            try FileManager.default.createDirectory(at: iCloudDocumentsURL, withIntermediateDirectories: true, attributes: nil)
                        }
                    }

                    let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents").appendingPathComponent("Libra-\(self.SelectedDownloadFileName)")

                    if let iCloudDocumentsURL = iCloudDocumentsURL
                    {
                        var isDir:ObjCBool = false
                        if(FileManager.default.fileExists(atPath: iCloudDocumentsURL.path, isDirectory: &isDir))
                        {
                            try FileManager.default.removeItem(at: iCloudDocumentsURL)
                            try FileManager.default.copyItem(at: tempLocalUrl, to: iCloudDocumentsURL)
                        }
                        else
                        {
                            try FileManager.default.copyItem(at: destinationFileUrl, to: iCloudDocumentsURL)
                        }
                    }

                }
                catch (let writeError)
                {
                    print("Error creating a file \(destinationFileUrl) : \(writeError)")
                }
            }
            else
            {
                print("Error took place while downloading a file. Error description");
            }
        }
        task.resume()
    }

当我遇到这个问题时,最有用的文章之一是在下面 link:

Technical Q&A QA1893 Updating the metadata of iCloud containers for iCloud Drive

我还非常小心地删除并重新添加了我的 info.plist 条目。这似乎是有效的。我最初是从在线资源中复制并粘贴条目的。似乎密钥不完全正确或包含一些隐藏字符导致它们无法被识别。

Enabling Document Storage in iCloud Drive

如果文件存储在应用程序的 iCloud 容器中,则无法直接在 iCloud Drive 应用程序中看到文件。

    let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")

当您使用 UbiquityContainerIdentifier 路径将文件保存到 iCloud 时,它会将文件保存在应用程序的 iCloud 容器中。您的 App 的容器受到保护,无法直接在 iCloud Drive 中查看。

但是我们可以通过设置 -> 点击你的 iCloud -> iCloud -> iCloud -> 管理存储 -> 你的应用名称 ->