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 条目。这似乎是有效的。我最初是从在线资源中复制并粘贴条目的。似乎密钥不完全正确或包含一些隐藏字符导致它们无法被识别。
如果文件存储在应用程序的 iCloud 容器中,则无法直接在 iCloud Drive 应用程序中看到文件。
let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
当您使用 UbiquityContainerIdentifier 路径将文件保存到 iCloud 时,它会将文件保存在应用程序的 iCloud 容器中。您的 App 的容器受到保护,无法直接在 iCloud Drive 中查看。
但是我们可以通过设置 -> 点击你的 iCloud -> iCloud -> iCloud -> 管理存储 -> 你的应用名称 ->
在我有文档下载选项中。当用户从我的应用程序下载文档时,我需要将其存储到已经安装在用户移动设备中的用户 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 条目。这似乎是有效的。我最初是从在线资源中复制并粘贴条目的。似乎密钥不完全正确或包含一些隐藏字符导致它们无法被识别。
如果文件存储在应用程序的 iCloud 容器中,则无法直接在 iCloud Drive 应用程序中看到文件。
let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
当您使用 UbiquityContainerIdentifier 路径将文件保存到 iCloud 时,它会将文件保存在应用程序的 iCloud 容器中。您的 App 的容器受到保护,无法直接在 iCloud Drive 中查看。
但是我们可以通过设置 -> 点击你的 iCloud -> iCloud -> iCloud -> 管理存储 -> 你的应用名称 ->