我正在努力弄清楚如何重命名iCloud文件夹中的UIDocument
子类实例。我尝试使用新URL保存文档…
func renameDocument(to name: String) {
let targetURL = document.fileURL.deletingLastPathComponent().appendingPathComponent(name)
.appendingPathExtension("<extension>")
document.save(to: targetURL, for: .forCreating) { success in
guard success else {
// This always fails
return
}
// Success
}
}
…但这失败了……
Error Domain=NSCocoaErrorDomain Code=513 "“<new-file-name>” couldn’t be moved because you don’t have permission to access “<folder>”."
UserInfo={NSSourceFilePathErrorKey=/private/var/mobile/Containers/Data/Application/1A9ACC2B-81EF-4EC9-940E-1C129BDB1914/tmp/(A Document Being Saved By My App)/<new-file-name>, NSUserStringVariant=( Move ), NSDestinationFilePath=/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/<folder>/<new-file-name>, NSFilePath=/private/var/mobile/Containers/Data/Application/1A9ACC2B-81EF-4EC9-940E-1C129BDB1914/tmp/(A Document Being Saved By My App)/<new-file-name>, NSUnderlyingError=0x1c4e54280 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}
…只是一个简单的举动…
func renameDocument(to name: String) {
let targetURL = document.fileURL.deletingLastPathComponent().appendingPathComponent(name)
.appendingPathExtension("<extension>")
do {
try FileManager.default.moveItem(at: document.fileURL, to: targetURL)
} catch {
// This always fails
}
// Success
}
…
失败
Error Domain=NSCocoaErrorDomain Code=513 "“<old-file-name>” couldn’t be moved because you don’t have permission to access “<folder>”." UserInfo={NSSourceFilePathErrorKey=/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/<folder>/<old-file-name>, NSUserStringVariant=( Move ), NSDestinationFilePath=/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/<folder>/<new-file-name>, NSFilePath=/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/<folder>/<old-file-name>, NSUnderlyingError=0x1c4c4d8c0 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}
这两个都适用于本地文件,重命名iCloud文件在UIDocumentBrowserViewController
root View Controller中正常工作。
我的猜测是,在某处丢失了一些权限,允许该应用程序写入iCloud文件夹。
有关信息, info.plist 包含以下所有键…
-
LSSupportsOpeningDocumentsInPlace
-
NSExtensionFileProviderSupportsEnumeration
-
UISupportsDocumentBrowser
您是否在NSFileCoordinator
的上下文中这样做?这是必需的。除了NSUbiquitousContainers
外,您不需要任何信息。
这是我重命名iCloud文档的代码:
///
/// move cloudFile within same store - show errors
///
- (void)moveCloudFile:(NSURL *)url toUrl:(NSURL *)newURL
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^{
NSError *coordinationError;
NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
[coordinator coordinateWritingItemAtURL:url options:NSFileCoordinatorWritingForMoving
writingItemAtURL:newURL options:NSFileCoordinatorWritingForReplacing
error:&coordinationError
byAccessor:
^(NSURL *readingURL, NSURL *writingURL){
if ([self moveFile:readingURL toUrl:writingURL])
[coordinator itemAtURL:readingURL didMoveToURL:writingURL];
}];
if (coordinationError) {
MRLOG(@"Coordination error: %@", coordinationError);
[(SSApplication *)SSApplication.sharedApplication fileErrorAlert:coordinationError];
}
});
}
///
///
/// move file within same store - show errors
///
- (BOOL)moveFile:(NSURL *)url toUrl:(NSURL *)newURL
{
NSFileManager *manager = NSFileManager.defaultManager;
NSError *error;
if ([manager fileExistsAtPath:newURL.path])
[self removeFile:newURL];
if ([manager moveItemAtURL:url toURL:newURL error:&error] == NO) {
MRLOG(@"Move failed: %@", error);
[(SSApplication *)SSApplication.sharedApplication fileErrorAlert:error];
return NO;
}
return YES;
}
NSDestinationFilePath=/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/<folder>/<new-file-name>
您正在尝试将文档保存在沙箱外。您只能在自己的容器中写文件,因此无法做您想做的事情。如果您希望API重命名当前文件,请在BugReport.Apple.com上提交错误。