Apple Silicon Mac上应用内购买失败问题求助
解决Apple Silicon Mac上macOS Ventura 13.2中iOS/iPadOS应用内购买收据写入权限问题
问题背景
在Apple Silicon Mac上测试iPhone/iPad应用时,沙盒环境下的应用内购买出现异常:调用SKPaymentQueue::addPayment发起购买后,收到paymentQueue:updatedTransactions回调且交易状态为SKPaymentTransactionStatePurchased(表明支付成功),但本地收据未生成,导致后续流程失败。
控制台输出权限错误日志:
storekitagent [6913DE38_SK1] Error writing receipt (5095 bytes) to file:///Users/XXXX/Library/Containers/90FE2A60-9FDF-4ECF-848F-CE3D396322CA/Data/StoreKit/sandboxReceipt: Error Domain=NSCocoaErrorDomain Code=513 "You don’t have permission to save the file “sandboxReceipt” in the folder “StoreKit”" UserInfo={NSFilePath=/Users/XXXX/Library/Containers/90FE2A60-9FDF-4ECF-848F-CE3D396322CA/Data/StoreKit/sandboxReceipt, NSUnderlyingError=0x14202c920 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}
经多次验证,该问题仅出现在macOS Ventura 13.2系统中,macOS Monterey 12.2可正常生成收据,推测是Ventura系统的权限管控或StoreKit组件行为变化导致。苹果开发者论坛上也存在同类未解决问题,用户反馈在Ventura下遭遇相同的收据写入权限错误,目前官方尚未给出正式修复方案。
解决方案建议
1. 手动修复StoreKit目录权限
找到应用对应的容器目录,手动创建并修复StoreKit文件夹权限:
# 替换为你的容器ID和用户名 rm -rf /Users/XXXX/Library/Containers/90FE2A60-9FDF-4ECF-848F-CE3D396322CA/Data/StoreKit mkdir -p /Users/XXXX/Library/Containers/90FE2A60-9FDF-4ECF-848F-CE3D396322CA/Data/StoreKit chmod 755 /Users/XXXX/Library/Containers/90FE2A60-9FDF-4ECF-848F-CE3D396322CA/Data/StoreKit
操作完成后重启应用,重新测试内购流程。
2. 重置沙盒环境
- 打开Mac系统“设置”→“App Store”→“沙盒账户”,退出当前登录的沙盒测试账户,重新登录
- 重启应用和Mac,清除应用缓存后再次发起内购测试
3. 升级至最新Ventura版本
苹果可能在后续系统更新中修复该权限问题,建议升级到macOS Ventura 13.4及以上版本后重新验证内购流程。
4. 测试阶段临时绕过本地收据验证
若仅需验证内购流程的核心逻辑,可临时跳过本地收据读取步骤,直接使用SKPaymentTransaction对象中的交易信息完成后续处理(上线前务必恢复标准收据验证流程):
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions { for (SKPaymentTransaction *transaction in transactions) { switch (transaction.transactionState) { case SKPaymentTransactionStatePurchased: // 临时处理:基于交易对象完成流程,跳过本地收据读取 [self processPurchasedTransaction:transaction]; [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; break; case SKPaymentTransactionStateFailed: // 处理失败逻辑 [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; break; // 其他状态处理 default: break; } } }
5. 向苹果提交Bug报告
收集完整的复现步骤、系统日志、应用容器权限信息,通过苹果开发者后台提交Bug报告,帮助官方定位并修复该问题。
内容的提问来源于stack exchange,提问作者yjkim237
相关产品推荐
相关产品推荐

