帮助应用程序沙箱和安全范围书签

时间:2014-12-04 07:48:54

标签: objective-c appstore-sandbox xpc nsxpcconnection

所以我一直在用我的头发撕掉......

我有一个主应用程序和一个帮助应用程序。两者都是沙盒,并使用应用程序组共享数据。我通过NSXPCConnection与帮助应用程序交谈。我使用 SMLoginItemSetEnabled 将帮助应用程序设置为登录项。当用户激活它时,帮助应用程序作为守护程序运行。

这一切都运作良好。 问题出在安全范围的书签上。

帮助应用程序需要访问系统文件。当我需要授予对新位置的访问权限时,这是由主应用程序完成的,通过NSXPCConnection打开帮助程序并使用此类打开NSOpenPanel:(https://github.com/leighmcculloch/AppSandboxFileAccess) 这一切似乎也有效....

该类告诉我已授予文件访问权限,但我也在Console中收到沙箱违规。

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 ......这么多头疼。 :(

2 个答案:

答案 0 :(得分:1)

我的应用程序中有类似的任务,this answer为我解决了这个问题。您基本上让父应用程序解析书签并访问其安全范围,然后将纯NSURL传递给XPC服务。我让我的XPC服务调用依次调用一个停止访问安全范围的完成块。该答案中的Apple Dev Forum链接提供了更详细的解释。

答案 1 :(得分:1)

我的特殊问题实际上要简单得多.... 我对书签的所有调用都包含这样:

dispatch_sync(dispatch_get_main_queue(), ^{ });

一旦我从主调度块中删除了调用并将其移动到调度队列,一切都开始工作了吗? 我不知道为什么,但我现在非常高兴它的工作。

dispatch_queue_t queue = dispatch_queue_create(WorkerQueue, NULL);
dispatch_sync(queue, ^{ });