【问题标题】:Read and Write access for FinderSync extension in a sandboxed environment沙盒环境中 FinderSync 扩展的读写访问权限
【发布时间】:2015-07-28 08:39:58
【问题描述】:

场景

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

【问题讨论】:

    标签: macos sandbox read-write findersync


    【解决方案1】:

    即使 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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的回复,是的,我也认为我应该获得具有此权利的读写访问权限。但我没有。我在帖子中没有提到这一点,但这正是我尝试过的,但我无法读取或写入任何文件。 Apple 的沙盒文档仅声明当用户在 NSOpenPanel 中选择文件时,您可以使用此权利读取/写入文件。我已经用一个打开的面板测试了文件访问,它工作正常,所以我的权利设置应该没有问题
      • 啊,在这种情况下,您可能需要使用temporary entitlement,例如 com.apple.security.temporary-exception.files.home-relative-path.read-write。但是,如果您将其提交到 App Store,您的应用可能会被拒绝。
      • 感谢您的建议。现在我可以在用户希望我写的地方写文件。正如临时权利文档中所建议的,我将发布一个错误报告,说明应该可以访问用户选择的文件夹。一旦我知道 Apple 是否因此拒绝了该应用程序,我将立即写另一条评论。
      • @Enie 你在苹果上发布了关于临时授权的错误报告吗?我遇到了与 Finder 同步扩展相同的问题。你有解决办法吗?
      • @SwapnilTandel 是的,我写了一个错误报告,但我已经 2 年没有收到来自苹果的任何消息了。 Bug Report
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 2017-03-13
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      相关资源
      最近更新 更多