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

Mac AppStore收据验证:Swift调用AppTransaction适配SHA-256及OC兼容方案

Mac应用收据验证迁移方案(适配旧Objective-C项目)

编辑说明:此方案专为维护旧Objective-C应用的开发者提供,用于适配苹果即将到来的收据编码变更。

苹果将于2025年1月25日将Mac应用收据编码切换为SHA-256,仍使用SHA-1验证收据的开发者将面临兼容问题。若仅需验证应用下载后的收据(无需处理内购),AppTransaction是官方推荐方案。苹果技术文档Technote 3138中《设备上验证收据》章节说明:

如果您使用AppTransaction验证应用下载,或使用Transaction验证内购,则无需收据。


Swift 验证模块

import Foundation
import StoreKit

public final class ReceiptValidation : NSObject {
    
    private func validityOfAppStoreReceipt() async -> Int {
        do {
            let verificationResult = try await AppTransaction.shared
            print("verificationResult=", verificationResult)

            switch verificationResult {
            case .verified(let appTransaction):
                // StoreKit已验证用户购买了该应用,可在此添加自定义业务逻辑
                return 1
            case .unverified(let appTransaction, let verificationError):
                // 应用交易未通过StoreKit验证,请根据业务需求处理此场景
                return 99
            }
        } catch {
          // 处理异常情况
            print("error.localizedDescription=", error.localizedDescription)
            return 99
        }
    }
    
    @objc public func getValidityOfAppStoreReceipt() async throws -> Int {
        let validity = await validityOfAppStoreReceipt()
        print("(swift) validity=", validity)
        return validity
    }
}

Objective-C 调用代码

- (void)receiptValidatedWith:(int)validationCode
// 从完成回调中触发
{        
    if (validationCode != 1) {
        ALog(@"AppStore收据无效,即将退出应用。");
        [NSApp terminate:self];
    } else {
        ALog(@"AppStore收据验证通过,继续执行。");
    }
}

- (void)validateReceipt
// 当前仅能通过Swift调用AppTransaction.shared进行收据验证
// 由于是异步代码,需通过回调获取验证结果
{
    ALog(@"正在验证收据...");
    
    // Objective-C会自动为Swift异步方法添加WithCompletionHandler后缀
    [self.receiptValidation getValidityOfAppStoreReceiptWithCompletionHandler:^(NSInteger validationCode, NSError *error) {
        [self receiptValidatedWith:validationCode]; // Swift代码执行完成后触发此方法
    }];
}   

头文件(.h)

// AppStore收据验证模块(Swift实现)
@property (nonatomic, strong) ReceiptValidation *receiptValidation; // Swift类实例

实现文件(.m)

@synthesize receiptValidation; // Swift模块实例

// 初始化AppStore收据验证Swift模块
self.receiptValidation = [[ReceiptValidation alloc] init];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:16:02