You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 00:17:39