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

如何获取AppStore.showManageSubscriptions(in:)的操作回调或代理方法

如何获取AppStore订阅管理界面的操作回调?

AppStore.showManageSubscriptions(in:)本身不会直接返回用户的操作细节(比如取消订阅、购买、关闭界面),你需要通过两种不同的方式覆盖你提到的三类场景:


1. 处理「取消订阅/购买订阅」场景:监听订阅状态变更

这类操作属于订阅交易或状态的变更,需要通过StoreKit的交易监听机制来捕获:

StoreKit 2 实现(推荐)

使用Transaction.updates异步流监听所有交易更新,从中判断订阅状态变化:

// 在合适的时机(比如App启动时)启动监听
Task {
    for await transaction in Transaction.updates {
        guard case .verified(let verifiedTx) = transaction else {
            // 验证失败的交易,可根据需求处理
            continue
        }
        
        // 检查订阅状态
        if let subscriptionStatus = verifiedTx.subscriptionStatus {
            switch subscriptionStatus.state {
            case .active, .inBillingRetry, .inGracePeriod:
                // 订阅处于活跃/续费重试/宽限期,代表购买/续费成功
                print("订阅已激活/续费")
                // 执行你的业务逻辑
            case .expired, .revoked:
                // 订阅已过期/被取消
                print("订阅已取消/过期")
                // 执行你的业务逻辑
            default:
                break
            }
        }
        
        // 务必完成交易
        await verifiedTx.finish()
    }
}

旧版StoreKit 实现

通过SKPaymentTransactionObserver监听交易队列:

class SubscriptionObserver: NSObject, SKPaymentTransactionObserver {
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for tx in transactions {
            switch tx.transactionState {
            case .purchased, .restored:
                // 购买/恢复订阅成功
                print("订阅购买/恢复成功")
                // 执行你的业务逻辑
                queue.finishTransaction(tx)
            case .failed:
                // 交易失败,可根据error判断是否是取消操作
                if let error = tx.error as? SKError, error.code == .paymentCancelled {
                    print("用户取消了购买")
                }
                queue.finishTransaction(tx)
            default:
                break
            }
        }
    }
}

// 注册观察者(比如在AppDelegate或SceneDelegate中)
let observer = SubscriptionObserver()
SKPaymentQueue.default().add(observer)

2. 处理「关闭/下滑关闭界面」场景:利用异步方法完成时机

showManageSubscriptions(in:)是异步方法,当用户关闭订阅管理界面(无论是点击关闭按钮还是下滑关闭),这个异步任务会正常完成(不会抛出错误),你可以在try await之后执行界面关闭后的逻辑:

if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
    Task {
        do {
            try await AppStore.showManageSubscriptions(in: windowScene)
            // 订阅管理界面已关闭,这里执行你的关闭后逻辑
            print("订阅管理界面已关闭")
        } catch {
            print("无法展示订阅管理界面: \(error.localizedDescription)")
        }
    }
}

注意:这种方式无法区分用户是点击关闭还是下滑关闭,但这两种场景通常可以归为同一类处理。


内容的提问来源于stack exchange,提问作者Lance Samaria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:13:16