使用StoreKit 2测试macOS应用IAP时模拟购买无响应问题求助
StoreKit 2本地模拟购买无响应解决方案
问题根因
该问题是Xcode 13 Beta 5与macOS Monterey Beta 8搭配使用时的已知兼容性问题,本地.storekit配置绑定后,仅商品查询接口可正常返回,购买接口会出现永久挂起无回调的情况。
优先排查项
确认项目的Signing & Capabilities配置中已经添加了In-App Purchase能力,缺失该权限也可能导致购买流程无响应。
可行修复方案
方案1:升级开发环境(优先推荐)
直接升级到Xcode 13正式版及后续稳定版本,同时将macOS系统升级到Monterey正式版,该版本组合已官方修复了本地StoreKit配置的购买挂起问题,升级后原有代码无需修改即可正常走通模拟购买流程。方案2:临时替代测试方案(暂不升级环境时使用)
- 改用沙盒环境测试:放弃本地
.storekit配置,在Apple开发者后台完成IAP商品配置后,在macOS系统偏好设置中登录沙盒测试账号,直接走线上沙盒环境测试购买流程,可正常获得回调。 - 改用iOS模拟器测试:同版本Xcode下iOS 15 Beta版本的模拟器不存在该Bug,你可以将应用适配到iOS端后在iOS模拟器上使用本地
.storekit配置完成购买逻辑测试。
- 改用沙盒环境测试:放弃本地
代码补充优化
你可以给购买逻辑添加超时判断,避免测试过程中出现流程永久卡死的情况,参考实现代码如下:func purchase(product: Product) async throws -> Product.PurchaseResult { print("Purchasing \(product.id) ...") return try await withThrowingTaskGroup(of: Product.PurchaseResult.self) { group in // 发起购买请求 group.addTask { return try await product.purchase() } // 添加超时逻辑 group.addTask { try await Task.sleep(nanoseconds: 30 * 1_000_000_000) // 超时时间30秒,可自行调整 throw NSError(domain: "IAPTest", code: -1, userInfo: [NSLocalizedDescriptionKey: "购买流程超时"]) } // 取最先返回的结果 guard let result = try await group.next() else { group.cancelAll() throw NSError(domain: "IAPTest", code: -2, userInfo: [NSLocalizedDescriptionKey: "未知错误"]) } group.cancelAll() return result } }
内容的提问来源于stack exchange,提问作者Lukas Würzburger
相关产品推荐
相关产品推荐

