Xcode12升级至15后iOS混合应用头部图标触发NSInternalInconsistencyException异常
问题:Xcode 15升级后iOS端头部图标操作触发崩溃
现象
项目从Xcode 12升级到Xcode 15后,Web和Android端运行正常,仅iOS端在点击头部图标时触发异常崩溃。
核心报错信息
Failed to request query parameters from WebPrivacy. *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This task has already been stopped' *** First throw call stack: ( 0 CoreFoundation 0x000000010b52e28d __exceptionPreprocess + 242 1 libobjc.A.dylib 0x0000000108d4f894 objc_exception_throw + 48 2 CoreFoundation 0x000000010b52e16b -[NSException initWithCoder:] + 0 3 WebKit 0x000000010eff76be -[WKURLSchemeTaskImpl didReceiveResponse:] + 141 4 Hybrid 0x0000000107b1bcaa __41-[CustomUrlScheme executeRequestForTask:]_block_invoke + 666 5 CFNetwork 0x000000010d31bda7 CFNetwork + 36263 6 CFNetwork 0x000000010d339915 _CFHTTPMessageSetResponseProxyURL + 16951 7 libdispatch.dylib 0x000000010bbd3747 _dispatch_call_block_and_release + 12 8 libdispatch.dylib 0x000000010bbd49f7 _dispatch_client_callout + 8 9 libdispatch.dylib 0x000000010bbdc8c9 _dispatch_lane_serial_drain + 1127 10 libdispatch.dylib 0x000000010bbdd665 _dispatch_lane_invoke + 441 11 libdispatch.dylib 0x000000010bbea76e _dispatch_root_queue_drain_deferred_wlh + 318 12 libdispatch.dylib 0x000000010bbe9b69 _dispatch_workloop_worker_thread + 590 13 libsystem_pthread.dylib 0x000000010c183c55 _pthread_wqthread + 327 14 libsystem_pthread.dylib 0x000000010c182bbf start_wqthread + 15 ) libc++abi: terminating due to uncaught exception of type NSException
附带警告信息
-[RTIInputSystemClient remoteTextInputSessionWithID:performInputOperation:] perform input operation requires a valid sessionID THREAD WARNING: ['GoOffline'] took '248.6589' ms. Plugin should use a background thread. warning: Module "/usr/lib/system/libsystem_kernel.dylib" uses triple "x86_64-apple-macosx13.6.0", which is not compatible with the target triple "x86_64-apple-ios12.0.0-simulator". Enabling per-module Swift scratch context.
问题分析
崩溃根源是自定义URL Scheme处理逻辑(CustomUrlScheme的executeRequestForTask:方法)中,异步回调完成后未检查WKURLSchemeTask的状态,就调用了didReceiveResponse:。Xcode 15对应的iOS SDK对WKURLSchemeTask的状态校验更严格,当任务已经被停止(比如用户操作中断了请求),继续调用响应方法会触发断言崩溃。
解决方案
修复自定义URL Scheme逻辑
在CustomUrlScheme的异步回调(比如网络请求完成的block)中,先检查任务是否已停止:if (!task.stopped) { [task didReceiveResponse:response]; [task didReceiveData:data]; [task didFinish]; }确保只有任务处于活跃状态时,才执行响应回调。
终止中断的异步任务
实现WKURLSchemeHandler的webView:stopURLSchemeTask:方法,在任务被停止时,取消对应的异步操作(比如网络请求),避免无效的后续回调:- (void)webView:(WKWebView *)webView stopURLSchemeTask:(id<WKURLSchemeTask>)task { // 取消与该任务关联的网络请求或异步操作 [self cancelTask:task]; }处理主线程阻塞警告
将GoOffline插件中的耗时操作移到后台线程执行,避免阻塞UI主线程,示例:dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执行耗时的GoOffline逻辑 dispatch_async(dispatch_get_main_queue(), ^{ // 主线程更新UI或回调 }); });模拟器兼容性警告
该警告是Xcode 15模拟器与低版本iOS目标(iOS12)的兼容性提示,若需消除:- 将项目的目标iOS版本升级到iOS13及以上;
- 确保使用的第三方库与目标iOS版本匹配,避免引入不兼容的模块。
内容的提问来源于stack exchange,提问作者Nathun
相关产品推荐
相关产品推荐

