无法写入 iCloud Drive
Failing to write to iCloud Drive
我在我的应用程序中使用 iCloud Drive 时遇到了困难。我无法在 iCloud Drive 中创建我的应用文件夹。
不知何故,昨天,我设法创建了文件夹并在那里保存了项目,但今天,在我 运行 我的代码之后,文件夹不见了,我无法再保存文件。
这是我设法 运行 并在昨天投入使用的示例代码:
let str = "ivan cantarino"
guard let iCloudPath = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents") else {
print("Failed to get iCloud path")
return
}
print("icloud path:", iCloudPath.absoluteString)
// prints: icloud path: file:///private/var/mobile/Library/Mobile%20Documents/iCloud~com~ivancantarino~Cozynote/Documents
let lastPath = iCloudPath.appendingPathComponent("iCloudDrive.txt")
// writes a file to the directory
do {
try str.write(to: lastPath, atomically: true, encoding: .utf8)
print("success")
} catch {
print("failed to write with error:", error.localizedDescription)
// prints: failed to write with error: The file “iCloudDrive.txt” couldn’t be saved in the folder “Documents”.
}
这是我的 info.plist iCloud 信息:
<key>NSUbiquitousContainers</key>
<dict>
<key>iCloud.com.ivancantarino.Cozynote</key>
<dict>
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
<true/>
<key>NSUbiquitousContainerName</key>
<string>Cozynote</string>
<key>NSUbiquitousContainerSupportedFolderLevels</key>
<string>Any</string>
</dict>
</dict>
这是一张打印件,显示我使用的是正确的容器:
我已经修改了应用程序的版本和内部版本号,重新安装了应用程序,但不知何故我无法写入路径。
它一直打印错误。
任何人都可以发现我在这里做错了什么吗?
我开发过一个严重依赖 iCloud 驱动器的应用程序,归根结底这是最糟糕的。难以调试不可预测且记录不完整。
所以我可以给你几个选项来试试看是否有帮助。
对您有很大帮助的一件事是创建 UIDocument
SubClass ,它们可以与 iCloud Drive 很好地交谈。
class TextDoc:UIDocument{
var data:String?
override func contents(forType typeName: String) throws -> Any {
return data?.data(using: .utf8) ?? Data()
}
override func load(fromContents contents: Any, ofType typeName: String?) throws {
if let userContent = contents as? Data {
data = String(data: userContent, encoding: .utf8)
}
}
}
let folder = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Folder")
try? FileManager.default.createDirectory(atPath: folder?.path ?? "", withIntermediateDirectories: true, attributes: nil)
let fileURL = folder?.appendingPathComponent("iCloudDrive.txt")
let uiDoc = TextDoc(fileURL: fileURL!)
uidoc.save(to: url, for: .forOverwriting) { (success) in
print("save was \(success)")
}
如果保存成功你可以使用open(completionHandler: <#T##((Bool) -> Void)?##((Bool) -> Void)?##(Bool) -> Void#>)
打开它
还要确保您在 developer.apple.com 中正确设置了 iCloud
我在我的应用程序中使用 iCloud Drive 时遇到了困难。我无法在 iCloud Drive 中创建我的应用文件夹。
不知何故,昨天,我设法创建了文件夹并在那里保存了项目,但今天,在我 运行 我的代码之后,文件夹不见了,我无法再保存文件。
这是我设法 运行 并在昨天投入使用的示例代码:
let str = "ivan cantarino"
guard let iCloudPath = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents") else {
print("Failed to get iCloud path")
return
}
print("icloud path:", iCloudPath.absoluteString)
// prints: icloud path: file:///private/var/mobile/Library/Mobile%20Documents/iCloud~com~ivancantarino~Cozynote/Documents
let lastPath = iCloudPath.appendingPathComponent("iCloudDrive.txt")
// writes a file to the directory
do {
try str.write(to: lastPath, atomically: true, encoding: .utf8)
print("success")
} catch {
print("failed to write with error:", error.localizedDescription)
// prints: failed to write with error: The file “iCloudDrive.txt” couldn’t be saved in the folder “Documents”.
}
这是我的 info.plist iCloud 信息:
<key>NSUbiquitousContainers</key>
<dict>
<key>iCloud.com.ivancantarino.Cozynote</key>
<dict>
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
<true/>
<key>NSUbiquitousContainerName</key>
<string>Cozynote</string>
<key>NSUbiquitousContainerSupportedFolderLevels</key>
<string>Any</string>
</dict>
</dict>
这是一张打印件,显示我使用的是正确的容器:
我已经修改了应用程序的版本和内部版本号,重新安装了应用程序,但不知何故我无法写入路径。 它一直打印错误。
任何人都可以发现我在这里做错了什么吗?
我开发过一个严重依赖 iCloud 驱动器的应用程序,归根结底这是最糟糕的。难以调试不可预测且记录不完整。
所以我可以给你几个选项来试试看是否有帮助。
对您有很大帮助的一件事是创建 UIDocument
SubClass ,它们可以与 iCloud Drive 很好地交谈。
class TextDoc:UIDocument{
var data:String?
override func contents(forType typeName: String) throws -> Any {
return data?.data(using: .utf8) ?? Data()
}
override func load(fromContents contents: Any, ofType typeName: String?) throws {
if let userContent = contents as? Data {
data = String(data: userContent, encoding: .utf8)
}
}
}
let folder = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Folder")
try? FileManager.default.createDirectory(atPath: folder?.path ?? "", withIntermediateDirectories: true, attributes: nil)
let fileURL = folder?.appendingPathComponent("iCloudDrive.txt")
let uiDoc = TextDoc(fileURL: fileURL!)
uidoc.save(to: url, for: .forOverwriting) { (success) in
print("save was \(success)")
}
如果保存成功你可以使用open(completionHandler: <#T##((Bool) -> Void)?##((Bool) -> Void)?##(Bool) -> Void#>)
打开它
还要确保您在 developer.apple.com 中正确设置了 iCloud