我正在为我的基于文档的应用程序使用即席(App Store之外(分发。该应用程序是NOT沙盒,权限设置正确:
<key>com.apple.security.app-sandbox</key>
<false/>
当运行经过公证的应用程序时,它会被Gatekeeper捕获。控制台中反复打印以下内核错误:Sandbox: App(33811) System Policy: deny(1) file-write-unlink /Users/user/Library/Autosave Information/xx.name.AppName.plist
该应用程序不使用macOS自动保存(保存到位(功能,但如果我没有错的话,这个Autosave Information
文件夹用于恢复应用程序会话。我正在使用+(BOOL)autosavesDrafts
,而+(BOOL)autosavesInPlace
返回NO
。我还覆盖了- (NSURL *)autosavedContentsFileURL
以指向应用程序支持文件夹,并且URL得到了正确的服务。
如果允许,应用程序会不断地将文件写入Autosave Information
文件夹。
为什么以及如何应用程序一直试图访问此文件夹,为什么它违反了沙盒策略,即使不在沙盒内?
编辑:
我终于从控制台中找出了真正的错误。该应用程序似乎以某种方式返回了一个错误的路径,用于保存恢复数据。我试着找到一种设置它的方法,但目前没有成功。
-[NSData(NSData) initWithContentsOfFile:options:maxLength:error:] + 111
+[NSArray(NSArray) newWithContentsOf:immutable:] + 112
-[NSDocumentController(NSInternal) _autoreopenRecordsBeingReopened] + 83
-[NSDocumentController(NSInternal) _autoreopenDocumentsIgnoringExpendable:withCompletionHandler:] + 705
-[NSApplication _reopenWindowsAsNecessaryIncludingRestorableState:completionHandler:] + 249
问题是旧的捆绑包标识符的一些残留物。我已经迁移到应用程序的沙盒分发版,在这个过程中的某个时刻,我使用相同的bundle标识符构建了沙盒版本。macOS已经将捆绑包标识符注册为属于一个沙盒应用程序,可能是出于安全原因,它不再希望允许它运行非沙盒应用。
我创建了一个新的Info.plist
,并更改了bundle标识符,错误就消失了。