所以我一直在为此抓狂......
我有一个主应用程序和一个辅助应用程序。两者都处于沙盒状态,并使用应用程序组共享数据。我通过 NSXPCConnection 与帮助程序应用程序进行通信。我使用 SMLoginItemSetEnabled 将帮助程序应用程序设置为登录项。当用户激活帮助程序应用程序时,该应用程序将作为守护程序运行。
这一切都运作良好。 问题出在安全范围的书签上。
帮助应用程序需要访问系统文件。当我需要授予对新位置的访问权限时,这是由主应用程序通过 NSXPCConnection 打开帮助程序并使用此类打开 NSOpenPanel 来完成的:( https://github.com/leighmcculloch/AppSandboxFileAccess ) 这一切似乎也有效......
该类告诉我文件访问权限已被授予,但我还在控制台中收到沙盒违规。
Sandbox: com.my.app.helper deny file-read-data
我在助手应用程序中拥有正确的权利:
com.apple.security.files.user-selected.read-write
com.apple.security.files.bookmarks.app-scope
我还读到有人在后台线程上访问书签时遇到问题,因此我尝试将与书签相关的所有调用包装在:
dispatch_sync(dispatch_get_main_queue(), ^{ });
还是没有喜悦。 非常感谢任何帮助。
**沙箱是真正的噩梦...... 我的应用程序所做的只是删除一些系统文件,无需用户干预。 在沙箱之前这是一个简单的任务......现在我需要处理loginItems,XPC......这么多令人头痛的事情。 :(
最佳答案
我的应用程序中有类似的任务,并且 this answer为我解决了。您本质上是让父应用程序解析书签并访问其安全范围,然后将纯 NSURL 传递给 XPC 服务。我让我的 XPC 服务调用依次调用一个完成 block 来停止访问安全范围。该答案中的 Apple Dev Forum 链接提供了更详细的解释。
关于objective-c - 帮助应用程序沙箱和安全范围书签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27288760/