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
相关产品推荐
相关产品推荐

