我在我的几个应用程序中使用Raywenderlich提供的VerificationController,这太棒了。完全可靠,易于实施且有效。它已经在我的三个应用程序中存活了几个月。
然而,两天前,所有三个应用程序突然停止正常工作。现在每次购买都被标记为无效,无论是对于我的实时用户还是我自己的测试帐户。我没有对应用程序或它们的后端进行任何更改,事实上我已经移动了公寓,所以我确实在一周或更长时间内没有触及它们。所有三个应用程序的变化都是即时的,我可以理解地开始接到投诉。
问题似乎出现在checkReceiptSecurity()
函数中(当需要为有效事务返回YES时,它总是返回NO),但该函数内部的代码超出了我的理解能力。我希望有人遇到这样的事情,或者现在甚至可能会遇到这种情况,并且知道解决方案吗?
据我所知,它似乎发生在第二行(VerificationController.m第158行)。
require(signature_length > offsetof(struct signature_blob, certificate), outLabel);
require(signature_blob_ptr->version == 2, outLabel);
certificate_len = ntohl(signature_blob_ptr->cert_len);
有用的评论为"确保签名blob足够长,可以安全地提取版本和cert_len字段,然后对字段执行完整性检查。"当它到达signature_blob_ptr
行时,它突然跳到函数的末尾,我认为这意味着它无法检查是否与Apple的某些响应的版本号有关?
任何人都可以了解正在发生的事情吗?这对我的应用程序组合来说显然是毁灭性的,我需要立即修复它。我暂时禁用了验证并在必要时发布了更新,但我想找到修改后的内容...
答案 0 :(得分:1)
搜索"收据验证"在https://forums.developer.apple.com
显然,证书更新只会使VerificationController停止工作。
明显但不快速的解决方法是使用更新的收据验证处理。请参阅:https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Introduction.html#//apple_ref/doc/uid/TP40010573-CH105-SW1
至于上面的代码,现在是signature_blob_ptr->版本== 3。但是在代码中放置3而不是2不是一个修复,因为签名不再是128字节长。