StoreKit测试问题:watchOS过期订阅显示“当前已订阅”
问题描述
在watchOS上测试过期订阅检测时,应用错误判定订阅有效:
- 调用
print(status.localizedDescription)返回Currently subscribed,但该订阅已过期3天 - StoreKit状态数组显示
expiresDate为1674848446946.3331,autoRenewStatus为1 - 但在
StoreKit > Manage Transactions中,该订阅早已过期且未开启自动续订 - 预期订阅会返回“过期”状态,请问是否遗漏了什么?
可能的原因及排查方向
设备时间不同步
watchOS设备的本地时间如果被手动修改或未同步网络时间,会导致应用基于错误时间判断订阅有效期。比如设备时间被调回3天前,就会认为过期的订阅仍在有效期内。- 排查:进入watchOS设置→通用→日期与时间,开启“自动设置”,确保设备时间与网络时间一致。
沙盒状态缓存延迟
沙盒环境中,订阅状态的更新可能存在延迟,手动终止订阅后,本地StoreKit缓存未及时刷新,导致状态不匹配。- 排查:
- 重启watchOS设备和配对的iPhone,清除应用缓存后重新测试
- 调用
SKPaymentQueue.default().restoreCompletedTransactions()强制刷新交易记录,同步服务器状态
- 排查:
不要依赖
autoRenewStatus和localizedDescription判断有效性
沙盒环境中autoRenewStatus偶尔会出现不准确的情况,localizedDescription只是展示文本,不能作为核心判断依据。正确的做法是直接对比expiresDate和当前时间。- 示例代码:
// 将时间戳转换为Date(注意原时间戳是毫秒级,需除以1000) let expiresDate = Date(timeIntervalSince1970: 1674848446946.3331 / 1000) let isExpired = expiresDate < Date() print("订阅是否过期:\(isExpired)")
- 示例代码:
watchOS独立应用的缓存问题
如果watchOS应用是独立运行的,其本地StoreKit缓存可能未与iPhone端的Manage Transactions状态同步。- 排查:在iPhone上打开对应应用并恢复交易,再回到watchOS应用测试;或卸载重装watchOS应用清除本地缓存。
沙盒订阅的特殊测试规则
沙盒环境中,短周期订阅过期后可能触发系统模拟的宽限期或自动续订延长,导致状态异常。- 排查:检查沙盒账户的订阅历史,确认是否存在系统自动延长的测试周期;使用全新的沙盒账户重新测试订阅流程。
内容的提问来源于stack exchange,提问作者swtype
相关产品推荐
相关产品推荐

