iOS 15中如何监听默认订阅管理弹窗的关闭按钮事件
解决StoreKit订阅管理弹窗关闭事件监听问题
我明白你遇到的困扰了——showManageSubscriptions的异步方法在弹窗成功展示后就会进入完成回调,根本不会等待弹窗关闭,所以你看不到关闭按钮触发的反馈。要监听弹窗的关闭操作,得借助StoreKit提供的通知机制来实现。
具体实现步骤:
- 添加弹窗关闭通知监听
在调用弹窗方法前,先注册监听系统发出的弹窗关闭通知。iOS 15+对应的通知是SKStoreManageSubscriptionsViewControllerDidDismissNotification,你可以在视图控制器的viewDidLoad或者调用弹窗的前置逻辑里添加监听:
override func viewDidLoad() { super.viewDidLoad() // 注册订阅管理弹窗关闭通知 NotificationCenter.default.addObserver(self, selector: #selector(handleSubscriptionSheetDismissed), name: .SKStoreManageSubscriptionsViewControllerDidDismiss, object: nil) } @objc func handleSubscriptionSheetDismissed() { print("Sheet is closed") // 这里可以添加弹窗关闭后的自定义逻辑,比如刷新用户订阅状态等 }
- 调整原有异步方法的逻辑
把原来方法里的print("Sheet is closed")改成弹窗成功展示的提示,因为这个异步回调的触发时机是弹窗显示成功,而非关闭:
@available(iOS 15.0.0, *) func showManageSubscription(_ windowScene: UIWindowScene) async { do { try await StoreKit.AppStore.showManageSubscriptions(in: windowScene) print("Sheet is presented successfully") // 改为展示成功的提示 } catch { print("Sheet can not be opened: \(error.localizedDescription)") } }
- 移除通知监听避免内存泄漏
在视图控制器销毁时,记得移除之前注册的通知监听:
deinit { NotificationCenter.default.removeObserver(self, name: .SKStoreManageSubscriptionsViewControllerDidDismiss, object: nil) }
原理说明
StoreKit.AppStore.showManageSubscriptions(in:)的异步方法仅负责完成弹窗的展示流程,一旦弹窗成功显示,异步任务就会标记为完成。而弹窗的关闭操作属于系统内置控制器的生命周期事件,必须通过NotificationCenter监听对应的系统通知才能捕获到。
内容的提问来源于stack exchange,提问作者Saumil Shah
相关产品推荐
相关产品推荐

