【发布时间】:2012-12-19 10:38:54
【问题描述】:
我有一个基本的 Cocoa 应用程序,让用户可以管理文件列表。文件是通过拖放添加的,我在应用程序重新启动时将访问权限保留在安全书签中。
到目前为止一切顺利。允许该应用读取和写入用户的文件,但重命名失败并出现权限错误,声称不允许我的应用访问父文件夹。
代码:
[[NSFileManager defaultManager] moveItemAtPath:currentPath
toPath:newPath error:&error]
错误:
Error Domain=NSCocoaErrorDomain Code=513 "“Some image.jpg” couldn’t
be moved because you don’t have permission to access “some folder”
我发誓这在昨天还有效,没有任何改变...(见下面的更新)
无论如何。我假设如果用户允许通过打开对话框或拖放访问文件,则应该允许沙盒应用程序重命名文件。
更新:
我终于设法追踪到我的代码发生了变化:
当我在执行实际移动之前调用NSFileCoordinator.item(at: newSrcUrl, willMoveTo: newDstUrl) 时,我可以重现错误。如果我跳过这一步,一切都会再次运行,控制台中不会出现任何错误。
完整代码:
let coordinator = NSFileCoordinator()
coordinator.coordinate(writingItemAt: srcURL, options: .forMerging,
writingItemAt: dstURL, options: .forMerging) { newSrcUrl, newDstUrl in
// Calling this first results in "could not get a sandbox extension" error in console:
//coordinator.item(at: newSrcUrl, willMoveTo: newDstUrl)
try moveItem(at: newSrcUrl, to: newDstUrl)
coordinator.item(at: newSrcUrl, didMoveTo: newDstUrl)
}
item(at oldURL: URL, willMoveTo newURL: URL) 似乎是在更改文档的文件扩展名(例如 .rtf 到 .rtfd)时使用的,而我的应用程序并非如此。只有文件名改变,文件扩展名没有改变。我认为最好的做法是调用 will/didMove 方法,但看起来有副作用。
回顾一下,我的应用程序所做的只是要求用户打开一个文件夹(通过NSOpenPanel,因此我的应用程序获得了写入该文件夹的权限),然后我的应用程序在该文件夹中创建一个文件,然后重命名它.
【问题讨论】:
-
在尝试访问该路径之前,您确定要解析安全书签吗?
-
是的,我肯定会解析书签并开始安全访问。
-
您能提供更多代码吗?也许足以让某人重现您的问题?现在没有太多事情要做。另外,您是否可以访问源路径和目标路径?
标签: cocoa mac-app-store appstore-sandbox