2

所以我一直在用这个扯掉我的头发......

我有一个主应用程序和一个辅助应用程序。两者都是沙盒并使用应用程序组共享数据。我通过 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....很多令人头疼的问题。:(

4

2 回答 2

2

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

dispatch_sync(dispatch_get_main_queue(), ^{ });

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

dispatch_queue_t queue = dispatch_queue_create(WorkerQueue, NULL);
dispatch_sync(queue, ^{ });
于 2014-12-06T00:29:44.893 回答
2

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

于 2014-12-05T17:01:43.350 回答