iOS 17下SKStoreProductViewController无法正常展示问题求助
以下是几种可能导致该问题的原因及对应的排查方向:
视图控制器层级或展示时机异常
如果viewControllerToPresentFrom本身未处于当前活跃的视图层级(比如它的view.window为空,或者所在窗口不是keyWindow),或者调用presentViewController:的时机过早(例如在viewDidLoad中调用,此时视图还未完全挂载到窗口),会出现系统标记VC已展示但实际无法渲染的情况。可以在调用前检查viewControllerToPresentFrom.view.window是否为当前应用的keyWindow。SKStoreProductViewController配置错误
SKStoreProductViewController必须正确设置productParameters,尤其是SKStoreProductParameterITunesItemIdentifier对应的App ID。如果配置的ID无效或对应App不存在,SKStoreProductViewController内部会自动dismiss,但系统仍会标记原VC处于presenting状态,导致其冻结。务必在展示前确认参数配置正确:_storeKitViewController.productParameters = @{SKStoreProductParameterITunesItemIdentifier: @"目标App的ID"};宿主App自定义UIWindow干扰
部分App会使用独立的UIWindow承载弹窗、悬浮窗等组件,若viewControllerToPresentFrom所在窗口不是当前keyWindow,模态展示的SKStoreProductViewController会被渲染到非活跃窗口上,用户无法看到,但系统认定展示已完成。此时点击屏幕会触发后台的SKStoreProductViewController执行dismiss操作。线程调用错误
UI操作必须在主线程执行,如果SDK在子线程调用presentViewController:,会导致UI渲染异常,出现VC无法显示但原VC被冻结的情况。确保调用逻辑包裹在主线程中:dispatch_async(dispatch_get_main_queue(), ^{ [viewControllerToPresentFrom presentViewController:_storeKitViewController animated:YES completion:^{ if (completion) completion(nil); }]; });宿主App的UIViewController钩子冲突
部分App会对UIViewController的presentViewController:方法做方法交换(Swizzle),如果钩子逻辑存在缺陷(比如未正确调用原方法、对特定VC做了拦截),会破坏SKStoreProductViewController的展示流程。可以检查宿主App是否有相关的分类或钩子代码。
内容的提问来源于stack exchange,提问作者gsalti

