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

iOS 15中如何监听默认订阅管理弹窗的关闭按钮事件

解决StoreKit订阅管理弹窗关闭事件监听问题

我明白你遇到的困扰了——showManageSubscriptions的异步方法在弹窗成功展示后就会进入完成回调,根本不会等待弹窗关闭,所以你看不到关闭按钮触发的反馈。要监听弹窗的关闭操作,得借助StoreKit提供的通知机制来实现。

具体实现步骤:

  1. 添加弹窗关闭通知监听
    在调用弹窗方法前,先注册监听系统发出的弹窗关闭通知。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")
    // 这里可以添加弹窗关闭后的自定义逻辑,比如刷新用户订阅状态等
}
  1. 调整原有异步方法的逻辑
    把原来方法里的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)") 
    } 
}
  1. 移除通知监听避免内存泄漏
    在视图控制器销毁时,记得移除之前注册的通知监听:
deinit {
    NotificationCenter.default.removeObserver(self, name: .SKStoreManageSubscriptionsViewControllerDidDismiss, object: nil)
}

原理说明

StoreKit.AppStore.showManageSubscriptions(in:)的异步方法仅负责完成弹窗的展示流程,一旦弹窗成功显示,异步任务就会标记为完成。而弹窗的关闭操作属于系统内置控制器的生命周期事件,必须通过NotificationCenter监听对应的系统通知才能捕获到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:07:55