如何修复“使用Mac Catalyst时的读写数据沙盒错误”问题

40

我最近更新了macOS Catalina,以便使用Catalyst更新一些支持Mac的应用程序。每当我运行该应用程序并尝试访问CloudKit数据(我使用CloudKit同步Core Data,如果有iCloud帐户,则使用Data),它就会崩溃,并显示以下错误。

[User Defaults] Couldn't write values for keys ( ApplicationAccessibilityEnabled ) in CFPrefsPlistSource<0x600002c07700> (Domain: com.apple.Accessibility, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: Yes): setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access

我已尝试在我的Signing and Capabilities中更改App SandBox设置的权限和访问权限为读/写。我还尝试将传入和传出连接更改为打开状态。

我不确定应该展示哪些代码,所以这里是它崩溃的区域。

if isICloudContainerAvailable() {
            print("iCloud Available")
            let container = NSPersistentCloudKitContainer(name: "Shopping_App")
            
            container.loadPersistentStores(completionHandler: {
                (storeDescription, error) in
                if let error = error as NSError? {
                    fatalError("Unresolved error \(error), \(error.userInfo)")
                }
            })

            return container
}

我期望这款应用程序能够创建/获取CoreData数据,并在可用时(在这种情况下是)连接到CloudKit同步的数据。但它目前在甚至未展示任何视图之前就崩溃了,这让我认为它在AppDeleget中崩溃了。
更新10月14日--我发现如果我强制跳过应用程序崩溃的断点,我可以继续进入应用程序并正常工作。这让我认为错误确实在AppDeleget中,特别是说在我跳过设置在崩溃处的断点之后才出现UI。
更新11月4日--这个问题变得更加奇怪。我忘记我正在使用Xcode的beta版本,所以好吧,上周我意识到这一点后可能只是那个原因。我尝试通过公共版本运行应用程序,但应用程序从未停止在断点处,而是完全崩溃并显示“Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)”。这个错误真的很奇怪。这是一个应该报告给苹果公司的错误吗?我曾考虑过这样做,但我决定不这样做,因为它对我来说似乎是我可以解决的问题,但现在重新考虑是否应该这样做。我希望我能找到解决这个问题的方法,因为我想发布macOS版本供公众使用,但还没有找到解决方案。
更新11月8日--在Xcode 11.2.1 GM种子版中,问题仍然存在。我尚未找到导致此问题发生的确切原因,但我将继续尝试。我也无法在任何Xcode版本上重现11月4日更新中写的错误。我没有找到其他任何信息,但想更新一下有关GM种子版的信息以及是否仍然出现此问题。
更新11月13日--我决定直接将应用程序上传至苹果进行批准,因为单独从Xcode构建和运行应用程序工作得非常好。苹果批准了应用程序,没有对此问题提出任何抱怨。这似乎只是一个Xcode问题。我将继续更新这个问题,如果/当我找到解决方法,我将发布有关此问题的解决方法,但目前还没有找到任何解决或解决此问题的更多信息。
更新11月20日--在Xcode 11.3 Beta Build 11C24b上,问题仍然存在。没有其他变化,我还没有找到其他解决此问题的方法。我将继续保持更新,但目前还没有找到其他信息。
更新12月11日--在Xcode 11.3 Public 11C29上,问题仍然存在。但是,现在它不是一致的,有时我必须跳过断点两次而不是一次才能继续启动应用程序。但是,如果独立于Xcode运行,则不会发生这种情况。
更新于2020年1月2日--仍然发生,但现在已经验证它会在真正的iOS 13设备上发生。尽管没有找到其他解决方案或替代方法,但我将继续更新此帖子以获取任何其他信息。
更新于2020年2月17日--并没有太多更新,但在Xcode 11.4 Beta(11N111s)上仍然发生。我将继续更新此帖子,但是没有太多变化。(还修复了一些错误)
更新于2020年3月10日--我没有意识到Xcode beta 11N132i已发布,但测试后仍然会发生。但是,尽管可能仍在发生,但至少不那么一致了。现在,它似乎是有点随机的,而不是每次都会发生并执行此操作。
更新于2020年4月18日--很抱歉没有更新此帖子,直到现在我才能编程。我仍然没有弄清楚这个问题,但现在似乎并没有真正发生。现在它仍然偶尔会发生。这也是在Xcode 11.4.1(11E503a)上,我不确定为什么还是这样。我将继续尝试更新此帖子。谢谢。如果您有任何建议来寻找原因,我愿意听取。
更新于2020年5月14日--Xcode 11.5 Beta 2(11N605f)此问题仍然随机发生,但现在似乎并不总是包含错误,但仍指向那部分代码。感谢您对此帖子的支持,我会继续更新它,以便更多了解此问题。
更新于2020年6月5日--很抱歉没有更早地更新此内容,我完全忘记了我何时更新了Xcode。在Xcode 11.5上,这个问题仍然像以前一样存在。我还升级到了Catalina 10.15.5,并几乎没有看到任何变化。但是,像评论所说,Catalina 10.15.4确实有所帮助,但奇怪的是10.15.5似乎没有改变任何东西。
更新于2020年6月27日、7月22日和8月10日--我已经将我的项目更新为支持Xcode 12,但似乎仍然存在同样的问题。没有什么真正改变,日志仍然完全相同。我很感激每个人愿意继续帮助解决这个问题。这也适用于Xcode 12 Beta 2。Beta 3和4完全相同。
更新于2020年9月28日--这仍然是Xcode 12 GM和公共版本的问题。我还没有升级到Xcode 12.0.1,因为我正在等待macOS Big Sur,但是在这一点上,我怀疑它不会解决问题。除此之外,我真的没有任何更新,仍然存在问题,我找不到原因。
更新于2020年11月3日--在Xcode 12.1.1 Release Candidate上仍存在此问题。很抱歉这么久没有更新,我一直在等待更新Xcode,但最终还是决定进行更新。然而,更新到Release Candidate后,并没有改变任何事情,至少我没有注意到。但我确实注意到一个变化;它似乎更快地显示了这个问题,但这可能只是因为它编译得更快。总之,这个问题没有什么重大的改变,而且已经有一段时间没有任何变化了。
更新于2020年11月16日
我已经升级到macOS Big Sur 11.0.1并将Xcode更新到12.3 beta。在Big Sur上,为了使其正常工作,不得不更改一些随机的东西,问题仍然存在。然而,我认为我更改的大部分内容与此无关,因为它们大多与UI元素相关。这可能只是Big Sur,但它编译速度更快,错误现在显示得更快了;但它仍然是同样的错误。

3
这似乎是一个Xcode问题。我想尝试构建应用程序并将其导出为应用程序来运行,信不信由你,它完全正常地运行了,没有任何问题。因此,这让我认为这只是一个Xcode问题,而不是我的应用程序问题。 - 117MasterChief96
3
非常感谢你在这里的更新,代表像我一样遇到同样问题的人们。 - Jakub
不用谢。很高兴我不是唯一遇到这个问题的人。 - 117MasterChief96
Xcode 12发布版仍存在问题。 - RickJansen
HTML可以正常工作,但是HTML中的图片无法显示。奇怪的是,在“-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions”之前,沙盒日志错误消息就已经出现了,也就是说在我的代码控制之前。我真的不太理解这个。 - RickJansen
显示剩余7条评论
3个回答

2

MasterChief96,你并不孤单。这是我的设置:

MacOS 10.15.3 Xcode 11.4.1

我创建了一个全新的SwiftUI“Hello World”项目,并将Mac设为目标设备,即Catalyst。

我将iOS部署目标设置为13.2(否则我会得到一个MacOS运行时错误,说我需要Catalina 10.15.4)

将方案设置为“My Mac”,编译并运行,得到:

[User Defaults] Couldn't write values for keys
    ApplicationAccessibilityEnabled
    AccessibilityEnabled
    FullKeyboardAccessFocusRingEnabled
setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access

由于涉及沙盒,我更改了“签名和功能”设置以包括用户选择的读/写和下载文件访问权限。

我退出Xcode,删除项目的Derived Data,重新打开项目并运行。在MacOS上运行时仍然出现错误消息。(在iOS上运行时我没有看到这些消息。)

只是猜测,但这似乎是Catalyst环境中的又一个bug?也许这个bug已经在Catalina 10.15.4中修复了,但对我来说那个更新非常糟糕,所以我不得不回退到10.15.3。


1
我尝试了相同的文件访问类型设置,但实际错误是Domain: com.apple.Accessibility, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No): setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access。我没有看到“用户首选项写入设置”。我只看到用户选择的文件。 - Michael Rowe
(这是对WholeCheese的回复)这似乎确实是事实,但正如你所说,更新到Catalina 10.15.4并不是最好的选择。奇怪的是,我已经升级到了Catalina 10.15.5,但尚未发现任何不稳定的问题,但是像你在Catalina 10.15.4中所说的那样,我的项目没有变化,也像其他人所说的那样。 - 117MasterChief96

0
对我来说,我收到了这个确切的错误消息,但崩溃是由下一个错误消息引起的,在这个错误消息中,它提到我的 Mac Catalyst 应用程序的 Info.plist 中缺少 CFBundleName。
堆栈跟踪片段:
(Domain: com.apple.Accessibility, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No): setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access
2020-06-27 11:01:52.403837-0700 Manga Relay D[17329:517025] [General] An uncaught exception was raised
2020-06-27 11:01:52.403908-0700 Manga Relay D[17329:517025] [General] *** -[__NSDictionaryM setObject:forKey:]: object cannot be nil (key: title)
2020-06-27 11:01:52.404006-0700 Manga Relay D[17329:517025] [General] (
    0   CoreFoundation                      0x00007fff2eb82be7 __exceptionPreprocess + 250
    1   libobjc.A.dylib                     0x00007fff6795a5bf objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff2ec3160e -[__NSCFString characterAtIndex:].cold.1 + 0
    3   CoreFoundation                      0x00007fff2ec3c17c -[__NSDictionaryM setObject:forKey:].cold.3 + 0
    4   CoreFoundation                      0x00007fff2eac0329 -[__NSDictionaryM setObject:forKey:] + 976
    5   UIKitCore                           0x00007fff6f5f2c8f -[_UIMenuBarItem properties] + 99
    6   UIKitMacHelper                      0x00007fff5fd6272a UINSNSMenuItemFromUINSMenuItem + 90
    ...

一旦我在“Bundle name”(又称CFBundleName)中指定了一个名称,崩溃就消失了,但我仍然会收到有关在应用程序容器之外设置首选项的错误消息。

更多细节更新:下面的我的Info.plist的屏幕截图将CFBundleName定义为我的用户定义变量,例如$(MangaRelayBundleDisplayName),我发现我从未在任何地方定义过这个变量,所以它是nil,这导致了崩溃。当我输入值,例如“My App”时,崩溃就消失了。现在,这个解决方案与原始问题无关,基本上我被“沙盒访问”警告误导了,但我想可能还有其他人被警告误导了。

Info.plist screenshot

我使用的是macOS 10.5.5和Xcode 11.5。


1
如果您能够的话,能否请提供一个示例,说明如何添加CGBundleName? - 117MasterChief96
是的,我刚刚更新了一张截图和更详细的解释。@117MasterChief96 - Genki
1
谢谢。实际上我已经有这个了,但还是感谢你的建议。希望像你说的那样,“但我想可能会有其他人被警告所误导”。希望你的建议能够帮助其他被这个警告搞糊涂的人。 - 117MasterChief96

-1

我曾经遇到过同样的问题。 通过删除“所有运行时问题”断点解决了这个问题。

经过测试,

  • 线程 Satanizer(运行时问题)正常工作
  • 未定义行为(运行时问题)正常工作
  • 主线程检查器(运行时问题)正常工作
  • 系统框架(运行时问题)中断

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接