沙盒环境中FinderSync扩展的读写访问权限

时间:2015-05-16 13:18:22

标签: macos sandbox read-write findersync

场景

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

问题

我现在已经完成了所有工作,但最后一部分。扩展程序无法写入所选文件夹。

选择他想要与之交互的文件夹的用户似乎不属于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:不允许操作
  • 拒绝file-write-create /Users//Desktop/SharedData.png

任何有关如何访问用户所选文件夹的建议都表示赞赏。

更新

我只是放心,我没有任何错误。虽然我被允许通过NSOpenPanel访问文件夹(这意味着权利应该是正确的)我无法在默认FIFinderSyncController的目标网址中创建文件夹,或者甚至为其添加书签。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

即使Finder Sync App Extension被授予“用户选择的文件”沙箱文件访问权限,用户通过Finder Sync App Extension右键单击访问的selectedItemURLs()文件似乎也不被视为“用户选择的”文件”。因此,沙箱会拒绝您的Finder Sync应用访问这些文件。

正如其他答案所指出的,解决此问题的唯一方法是使用临时授权来进行更广泛的文件访问。或使用Powerbox NSOpenPanel让用户选择一个包含文件夹,并使用该安全范围书签来访问沙盒文件。

请复制我的Apple错误报告,请求允许此行为:

  

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

     

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