将文件保存到 icloud 驱动器
Saving a file to icloud drive
我正在尝试将文件保存到 icloud 驱动器。我要使用简单版本,我不让用户选择保存文件的位置,我只是将它保存在 icloud 驱动器的根目录中。这是我正在使用的代码:
func exportToFiles() {
for page in pages {
let filename = getDocumentsDirectory().appendingPathComponent((page.title ?? "Untitled") + ".png")
if let image = exportImage(page: page, dpi: 300) {
if let data = image.pngData() {
try? data.write(to: filename)
}
}
}
}
func getDocumentsDirectory() -> URL {
let driveURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
return driveURL!
}
我的 Info.plist
文件中有这个:
<key>NSUbiquitousContainers</key>
<dict>
<key>iCloud.com.mysite.myapp</key>
<dict>
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
<true/>
<key>NSUbiquitousContainerName</key>
<string>myapp</string>
<key>NSUbiquitousContainerSupportedFolderLevels</key>
<string>Any</string>
</dict>
</dict>
在 UI 中,这似乎可行,因为在我点击按钮后会有轻微的停顿。但是当我查看我的文件时,那里什么也没有。我做错了什么?
您必须检查并创建“Documents”文件夹,同时处理错误也是一个好习惯:
if let containerUrl = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents") {
if !FileManager.default.fileExists(atPath: containerUrl.path, isDirectory: nil) {
do {
try FileManager.default.createDirectory(at: containerUrl, withIntermediateDirectories: true, attributes: nil)
}
catch {
print(error.localizedDescription)
}
}
let fileUrl = containerUrl.appendingPathComponent("hello.txt")
do {
try "Hello iCloud!".write(to: fileUrl, atomically: true, encoding: .utf8)
}
catch {
print(error.localizedDescription)
}
}
请仔细检查您是否在“签名和功能”选项卡中选中了 iCloud 选项卡中的“iCloud 文档”选项。并且还创建了与您在 plist 文件中指定的名称完全相同的容器 - “myapp”。
<key>NSUbiquitousContainerName</key>
<string>myapp</string>
exportImage(page: page, dpi: 300) 的 return 值是多少?
请确保它是 returning UIImage 对象。
我正在尝试将文件保存到 icloud 驱动器。我要使用简单版本,我不让用户选择保存文件的位置,我只是将它保存在 icloud 驱动器的根目录中。这是我正在使用的代码:
func exportToFiles() {
for page in pages {
let filename = getDocumentsDirectory().appendingPathComponent((page.title ?? "Untitled") + ".png")
if let image = exportImage(page: page, dpi: 300) {
if let data = image.pngData() {
try? data.write(to: filename)
}
}
}
}
func getDocumentsDirectory() -> URL {
let driveURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
return driveURL!
}
我的 Info.plist
文件中有这个:
<key>NSUbiquitousContainers</key>
<dict>
<key>iCloud.com.mysite.myapp</key>
<dict>
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
<true/>
<key>NSUbiquitousContainerName</key>
<string>myapp</string>
<key>NSUbiquitousContainerSupportedFolderLevels</key>
<string>Any</string>
</dict>
</dict>
在 UI 中,这似乎可行,因为在我点击按钮后会有轻微的停顿。但是当我查看我的文件时,那里什么也没有。我做错了什么?
您必须检查并创建“Documents”文件夹,同时处理错误也是一个好习惯:
if let containerUrl = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents") {
if !FileManager.default.fileExists(atPath: containerUrl.path, isDirectory: nil) {
do {
try FileManager.default.createDirectory(at: containerUrl, withIntermediateDirectories: true, attributes: nil)
}
catch {
print(error.localizedDescription)
}
}
let fileUrl = containerUrl.appendingPathComponent("hello.txt")
do {
try "Hello iCloud!".write(to: fileUrl, atomically: true, encoding: .utf8)
}
catch {
print(error.localizedDescription)
}
}
请仔细检查您是否在“签名和功能”选项卡中选中了 iCloud 选项卡中的“iCloud 文档”选项。并且还创建了与您在 plist 文件中指定的名称完全相同的容器 - “myapp”。
<key>NSUbiquitousContainerName</key>
<string>myapp</string>
exportImage(page: page, dpi: 300) 的 return 值是多少? 请确保它是 returning UIImage 对象。