WKContentRuleListStore.default() 在 iOS 14 时崩溃

WKContentRuleListStore.default() crash in iOS 14

我的应用使用 WKContentRuleListStore 进行内容拦截。但是,当我尝试使用 Swift 5.3/iOS 14 进行编译时,我在尝试实例化 WKContentRuleListStore.default().

时遇到运行时崩溃

我没有注意到 iOS 13 中的崩溃,甚至在 iOS 14 上使用 iOS 13 SDK 和 运行 进行构建时也没有注意到。

显示的错误仅在调用站点 EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)

堆栈跟踪:

#0  0x00007fff28541233 in WTFCrashWithInfo(int, char const*, char const*, int) ()
#1  0x00007fff286c6868 in WebKit::runInitializationCode(void*) ()
#2  0x00007fff202cbf2a in std::__1::__call_once(unsigned long volatile&, void*, void (*)(void*)) ()
#3  0x00007fff286c3623 in WebKit::InitializeWebKit2() ()
#4  0x00007fff288e23ea in API::ContentRuleListStore::ContentRuleListStore(WTF::String const&, bool) ()
#5  0x00007fff288e2348 in API::ContentRuleListStore::ContentRuleListStore(bool) ()
#6  0x00007fff288e23ac in API::ContentRuleListStore::nonLegacyDefaultStore() ()
#7  0x00007fff2876013d in +[WKContentRuleListStore defaultStore] ()
#8  0x000000010c797fa9 in static WebViewRules.compile() at /MyApp/Features/WebView/WebViewRules.swift:36

很快找到了解决方案,但想为 运行 遇到相同问题的任何人记录下来。

WKContentRuleListStore.default() 必须在 主线程 上调用。看来这是 iOS 14 和相应的 SDK 中引入的新(未记录)要求。

DispatchQueue.main.async {
  let store = WKContentRuleListStore.default()
  // use the store...
}