9

场景

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

问题

我现在一切正常,但最后一部分。扩展程序无法写入所选文件夹。

选择他想要与之交互的文件夹的用户似乎不是 Powerbox 的一部分 - 我如何理解它 - 仅使用openPanel和激活savePanel。如何获得与用户通过我的菜单项选择的文件夹进行交互的权限?我在开发人员库中找不到任何可能解决该问题的参考。不在沙盒指南中,不在扩展指南中。

如果无法使用选定的文件和文件夹,那么添加自定义菜单项的可能性将毫无用处,因此我确信必须有一种访问它们的方法。

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

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(这意味着权利应该是正确的)访问文件夹,但我无法在 / 中创建文件夹,甚至无法为我的默认目标 url 添加书签FIFinderSyncController

4

2 回答 2

3

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

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

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

Finder Sync App ExtensionselectedItemURLs()应该接收“用户选择的文件”沙盒文件访问权限。

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

于 2018-08-03T17:33:38.193 回答
2

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

于 2015-05-22T23:56:45.597 回答