You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Mac App Store应用间购买迁移:旧应用用户如何在新应用恢复功能?

如何让旧应用A1-A3的付费用户在新应用B中免费解锁专属特性?

完全可行!我之前帮好几个开发者处理过类似的应用合并+迁移付费权益的场景,核心是利用Mac App Store的购买历史验证机制,把旧应用的付费记录和新应用的内购权限做关联。下面是一步步的具体操作指南:

1. 理清核心逻辑:跨应用验证购买历史

Mac App Store会把用户Apple ID下的所有购买记录(包括付费应用、内购)统一存储,新应用B可以通过StoreKit API获取这些记录,从而判断用户是否买过A1/A2/A3。这里的关键是获取用户授权——第一次调用相关API时,系统会弹出对话框请求用户允许应用访问他们的购买历史,用户同意后才能拿到数据。

2. 在新应用B中映射旧应用到对应内购项目

  • 先在App Store Connect后台,给新应用B创建对应内购项目:比如A1的专属特性对应内购Feature_A1,A2对应Feature_A2,以此类推,内购类型选“非消耗型”(因为这些特性是永久解锁的)。
  • 在代码里,遍历用户的购买历史,查找旧应用A1-A3的bundle ID对应的购买条目。一旦检测到用户买过A1,就自动解锁B中对应的Feature_A1特性,不需要用户付费。

3. 实现“恢复购买”功能(必做,符合苹果审核要求)

  • 一定要在新应用B的设置或功能入口里加一个“恢复购买”按钮,这既是苹果审核的硬性要求,也给用户提供了手动触发验证的途径。
  • 如果你用的是StoreKit 2(推荐,适配macOS 12+),可以调用Transaction.restoreAsync()方法;如果是旧版StoreKit,用restoreCompletedTransactions()。以下是StoreKit 2的示例代码片段:
    Task {
        do {
            for await result in Transaction.restoreAsync() {
                switch result {
                case .success(let transaction):
                    // 检查transaction的bundleID是否是A1/A2/A3的ID
                    if transaction.bundleID == "com.yourcompany.A1" {
                        // 解锁A1对应的特性,并存入Keychain
                        unlockFeature(.A1)
                    }
                    // 同理处理A2/A3
                case .failure(let error):
                    // 处理错误,比如提示用户网络问题
                    print("恢复失败:\(error.localizedDescription)")
                }
            }
        } catch {
            print("恢复流程出错:\(error.localizedDescription)")
        }
    }
    

4. 本地状态管理:避免重复验证

  • 解锁特性后,把解锁状态存在Keychain里(不要用UserDefaults,因为它可能被用户清除),这样用户重装应用后,点击“恢复购买”就能快速恢复权限,不用每次启动都去请求App Store验证。
  • 可以设计一个本地的权限管理类,比如FeatureAccessManager,专门负责存储和读取解锁状态,以及触发验证逻辑。

5. 应对苹果审核的关键细节

  • 在新应用B的App Store描述、隐私政策里,明确说明“原A1/A2/A3付费用户可通过恢复购买免费解锁对应专属特性”,避免审核团队误解你的收费逻辑。
  • 提交审核时,一定要提供测试账号:分别准备购买过A1、A2、A3的测试Apple ID,让审核人员能直接验证恢复功能是否正常工作。
  • 旧应用的bundle ID要确保完全准确(和旧应用在App Store Connect里的ID一致),如果是固定的3个应用,硬编码也没问题。

小提醒:如果你的旧应用A1-A3是付费下载的独立应用(不是免费应用加内购),那么购买历史里的条目就是应用本身的购买记录,直接通过bundle ID判断即可;如果旧应用本身还有内购,那还要额外区分,但你的场景是旧应用是独立付费,所以不用考虑这一点。

内容的提问来源于stack exchange,提问作者Wizard of Kneup

火山引擎 最新活动