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 {} @endSwift版本可以写个扩展:
extension SKStoreProductViewController { @objc func sceneDisconnected(_ scene: UIScene) {} }这样系统调用这个方法时就不会因为找不到实现而崩溃了。
2. 规范控制器的生命周期管理
有时候崩溃是因为控制器已经被释放,但系统仍尝试向它发送消息。检查你的代码:- 不要在
SKStoreProductViewControllerdismiss完成前就把它置为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
相关产品推荐
相关产品推荐

