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

iOS应用SKStoreProductViewController崩溃求助(Firebase Crashlytics上报)

解决SKStoreProductViewController的sceneDisconnected:未识别选择器崩溃问题

我之前也碰到过这种Crashlytics上报但测试环境复现不了的头疼问题,这个-[SKStoreProductViewController sceneDisconnected:]的崩溃本质是系统API兼容性或者控制器生命周期处理不当导致的,下面是几个经过验证的解决思路:

  • 1. 补全低版本iOS缺失的方法实现
    这个sceneDisconnected:是iOS 13+引入的Scene相关API,但iOS 12及以下的SKStoreProductViewController并没有实现这个方法。如果你的App还支持低版本系统,系统尝试调用该方法时就会触发崩溃。最直接的解决办法是给这个控制器加个分类,空实现这个方法:

    @implementation SKStoreProductViewController (SceneCompatibility)
    - (void)sceneDisconnected:(UIScene *)scene {}
    @end
    

    Swift版本可以写个扩展:

    extension SKStoreProductViewController {
        @objc func sceneDisconnected(_ scene: UIScene) {}
    }
    

    这样系统调用这个方法时就不会因为找不到实现而崩溃了。

  • 2. 规范控制器的生命周期管理
    有时候崩溃是因为控制器已经被释放,但系统仍尝试向它发送消息。检查你的代码:

    • 不要在SKStoreProductViewController dismiss完成前就把它置为nil
    • 如果用闭包回调,避免循环引用的同时,也不要过早释放控制器实例
  • 3. 调整控制器的present时机和线程
    部分开发者反馈,在App刚启动就present该控制器的场景下容易触发问题。可以尝试延迟present,并且确保所有UI操作都在主线程执行:

    dispatch_async(dispatch_get_main_queue(), ^{
        SKStoreProductViewController *vc = [[SKStoreProductViewController alloc] init];
        // 设置delegate和product参数
        [self presentViewController:vc animated:YES completion:nil];
    });
    
  • 4. 排查第三方库的冲突
    如果你集成了修改UIKit控制器行为的第三方库(比如埋点、导航栏自定义类库),可能会干扰SKStoreProductViewController的方法调用逻辑。可以暂时移除这类库,观察崩溃是否消失,逐步定位冲突来源。

内容的提问来源于stack exchange,提问作者Armaghan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:02:25