iOS13+ TestFlight应用崩溃求助:附崩溃日志及相关代码
问题分析与解决方案
从你的崩溃日志和代码来看,崩溃的核心原因是在非主线程中尝试修改UIDevice的proximityMonitoringEnabled属性,而iOS 13及之后的系统对UI相关操作的线程安全性要求更严格,触发了FrontBoardServices的队列断言。
具体原因拆解
看崩溃栈的关键调用链:
11 *** 0x100276cec -[ProximityHelper startProximitySensor] + 100 (ProximityHelper.m:53) 9 UIKitCore 0x19dd3c448 -[UIApplication setProximityEventsEnabled:] + 108 (UIApplication.m:9203) 8 UIKitCore 0x19d8a46c0 -[FBSScene(UIApp) updateUIClientSettingsWithBlock:] + 168 (FBSScene+UIApp.m:41) 5 FrontBoardServices 0x19edfed88 -[FBSSceneImpl updateClientSettings:withTransitionContext:] + 76 (FBSSceneImpl.m:190) 4 FrontBoardServices 0x19ee48e84 -[FBSSerialQueue assertOnQueue] + 228 (FBSSerialQueue.m:98)
-[FBSSerialQueue assertOnQueue]的断言失败,说明这个更新UI客户端设置的操作必须在主线程执行,而你的startProximitySensor方法是在后台线程(Thread 2)被调用的——这在iOS 12中可能没有强制线程检查,但iOS 13+的系统严格执行了这一线程要求。
修复方案
修改ProximityHelper的startProximitySensor方法,将修改proximityMonitoringEnabled的代码切换到主线程执行:
- (void) startProximitySensor { if (!self.activatedByApp) return; [timesChanged removeAllObjects]; // 切换到主线程执行 proximity 相关设置 dispatch_async(dispatch_get_main_queue(), ^{ UIDevice *device = [UIDevice currentDevice]; device.proximityMonitoringEnabled = YES; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityChanged:) name: proximityNotificationString object:nil]; }); }
额外验证点
- 确保移除观察者的操作(如果有对应的
stopProximitySensor方法)也在主线程执行,避免线程不一致的问题。 - 可以在方法开头加个断言,方便后续调试时快速定位线程问题:
NSAssert([NSThread isMainThread], @"Proximity sensor operations must be called on main thread");
这样修改后,iOS 13.6.1系统下的崩溃应该就能解决了,同时也能保证iOS 12系统的兼容性不受影响。
内容的提问来源于stack exchange,提问作者Issam Oube
相关产品推荐
相关产品推荐

