如何展示带有Done按钮的内嵌iOS App Store的UIViewController?
解决内嵌带Done按钮的App Store页面返回问题
嘿,我之前刚好踩过这个一模一样的坑!你遇到的问题根源在于用UIApplication.shared.open跳转App Store链接的方式——这种操作会直接把用户带到系统的App Store应用或者Safari里,相当于完全离开了你的App进程,所以点击返回自然回到的是那些外部应用,而非你的原App。
要实现带Done按钮、关闭后直接回到原App的内嵌App Store页面,Apple官方提供了合规的解决方案:使用SKStoreProductViewController,这是StoreKit框架里专门用来在App内展示App Store商品页面的组件,自带Done按钮,完全符合Apple的审核规范。
下面是具体的实现步骤:
首先,导入StoreKit框架:
import StoreKit让你的ViewController遵守
SKStoreProductViewControllerDelegate协议,用来处理Done按钮的点击事件:class YourViewController: UIViewController, SKStoreProductViewControllerDelegate { // 你的现有代码... }添加打开内嵌App Store页面的方法,用目标App的ITunes Item ID来加载页面:
func presentAppStorePage() { let storeVC = SKStoreProductViewController() storeVC.delegate = self // 替换成你要展示的App的ITunes Item ID,这里用你提供的375380948 let productParams = [SKStoreProductParameterITunesItemIdentifier: 375380948] storeVC.loadProduct(withParameters: productParams) { [weak self] success, error in guard success else { print("加载App Store页面失败:\(error?.localizedDescription ?? "未知错误")") // 加载失败时可以给用户一个提示,比如弹个alert let alert = UIAlertController(title: "提示", message: "无法打开App Store页面", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self?.present(alert, animated: true) return } // 加载成功,present这个VC self?.present(storeVC, animated: true) } }实现代理方法,处理Done按钮的点击,关闭内嵌页面:
func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) { dismiss(animated: true) }
这样实现后,用户点击Done按钮就会直接回到你的App里,完全不会出现跳去Safari的问题。而且这种方式是Apple官方推荐的,不用担心审核的问题。
内容的提问来源于stack exchange,提问作者esilver
相关产品推荐
相关产品推荐

