沙盒环境下 FinderSync 扩展的读写权限

9

场景

用户在Finder中右键单击一个目录,并找到一个自定义菜单项。单击该项将告诉我的应用程序打开一个窗口,用户可以在其中完成工作。当用户完成后,需要将文件写入他通过右键单击选择的文件夹。

问题

我现在已经让所有的东西都工作了,但是最后一部分没有成功。扩展程序无法写入所选文件夹。

用户选择要交互的文件夹似乎不属于 Powerbox 的一部分,而 Powerbox 只有在使用 openPanelsavePanel 时才会激活 - 根据我的理解。那么如何获得与用户通过我的菜单项选择的文件夹进行交互的权限?我在开发者库中没有找到任何可能的解决方案的参考资料。在沙箱指南和扩展指南中都没有。

如果无法使用所选的文件和文件夹,则添加自定义菜单项的可能性将变得相当无用,因此我相信一定有一种方法可以访问它们。

也许我尝试写入的方式是错误的。我的主应用程序将临时文件写入共享组文件夹中。之后,它发送一个通知,扩展程序监听该通知:

func copyFile(notification:NSNotification)
{
    NSLog("write file")

    if let target = tmpTarget
    {
        let secureContainer = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.de.enie.Nu")
        let contents = NSFileManager.defaultManager().contentsOfDirectoryAtURL(secureContainer!, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.SkipsHiddenFiles | NSDirectoryEnumerationOptions.SkipsPackageDescendants | NSDirectoryEnumerationOptions.SkipsSubdirectoryDescendants , error: nil)
        
        for content in contents as! [NSURL]
        {
            NSLog("tmp data: \(content.path!)")
            if content.lastPathComponent!.stringByDeletingPathExtension == "SharedData"
            {
                NSLog("found shared file")
                
                NSFileManager.defaultManager().copyItemAtURL(content, toURL: target.URLByAppendingPathComponent(content.lastPathComponent!), error: nil)
                
                NSFileManager.defaultManager().removeItemAtURL(content, error: nil)
            }
        }
        tmpTarget = nil
    }
}

尝试写入文件会出现以下控制台通知:
  • 在 /Users//Desktop/SharedData.png 上打开:操作不允许
  • 拒绝文件写入创建 /Users//Desktop/SharedData.png
有什么想法可以获得对用户选择文件夹的访问权限将不胜感激。
更新
我确认了自己没有任何错误。虽然我可以通过 NSOpenPanel 访问文件夹(这意味着权限应该是正确的),但我无法在 / 中创建文件夹,甚至无法为我的默认 FIFinderSyncController 的目标 URL 创建书签。
2个回答

3
尽管 Finder Sync 应用程序扩展被授予“用户选择的文件”沙盒文件访问权限,但用户通过 Finder Sync 应用程序扩展右键单击访问的 selectedItemURLs() 文件似乎并不算作“用户选择的”。因此,沙盒拒绝了您的 Finder Sync 应用程序对这些文件的访问权限。
正如其他答案所指出的那样,唯一的解决方法是使用临时特权以获得更广泛的文件访问权限。或者使用 Powerbox NSOpenPanel 让用户选择包含文件夹,并使用该安全范围的书签来访问受沙盒保护的文件。
请复制我的 Apple 错误报告,请求允许此行为:

Finder Sync 应用程序扩展的 selectedItemURLs() 应该接收“用户选择的文件”沙盒文件访问权限。

rdar://42874694
https://openradar.appspot.com/radar?id=5063363058991104


2
如果您授予权限:com.apple.security.files.user-selected.read-write,则应该能够写入所选文件。

1
谢谢您的回复,是的,我也认为我应该通过这个权限获得读写访问权限。但是事实并非如此。我在帖子中没有提到这一点,但这正是我尝试过的,但我无法读取或写入任何文件。苹果的沙盒文档只说明当用户在NSOpenPanel中选择文件时,您可以使用此权限读/写文件。我已经使用打开面板测试了文件访问权限,并且它可以工作,所以我的权限设置应该没有问题。 - Enie
1
在这种情况下,您可能需要使用临时授权,例如com.apple.security.temporary-exception.files.home-relative-path.read-write。但是,如果您将应用提交到App Store,它可能会被拒绝。 - dejuknow
谢谢您的建议。目前我可以将文件写入用户想要的位置。根据临时授权文档的建议,我将提交一个错误报告,说明应该能够访问用户选择的文件夹。一旦我知道苹果是否因此拒绝了应用程序,我会再写一条评论。 - Enie
@Enie,你在苹果上发布了关于临时权限的错误报告吗?我使用Finder同步扩展也遇到了同样的问题。你得到了任何解决方案吗? - Swapnil Tandel
3
@SwapnilTandel 是的,我写了一个漏洞报告,但是现在已经两年了,我没有从苹果那里收到任何回复。漏洞报告 - Enie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接