在使用StoreKit到MKStoreKit的应用程序中工作时,我注意到检查订阅是否仍然有效的方法总是返回0(NO或false)。
我已经跟踪了错误,我在方法- (BOOL) isSubscriptionActive:(NSString*) featureId
内找到了此行生成的jsonObject
:
id jsonObject = [NSJSONSerialization JSONObjectWithData:subscriptionProduct.receipt options:NSJSONReadingAllowFragments error:nil];
是nil
。
然后我检查了从这个方法返回的错误,即:
[MKStoreManager isSubscriptionActive:]]错误域= NSCocoaErrorDomain代码= 3840“操作无法完成。(Cocoa错误3840.)”(字符15周围的对象中的键没有值。)UserInfo = 0x200c0300 {NSDebugDescription =字符15周围的对象键没有值。} (lldb)
然后我检查了收据,我发现问题是所谓的“JSON Receipt”不是JSON,因为它使用“=
”而不是“:
”。我想有人已经在处理这个问题了,你的解决方案是什么?
修改 我正在使用沙盒环境。
答案 0 :(得分:4)
收据不是JSON对象。这是应该传递给App商店进行验证的私有格式 - 您不应该自己尝试解析它。来自In-App Purchase Programming Guide:
注意:在iOS上,商店收据的内容和格式是私密的,可能会有所变化。您的应用程序不应尝试直接解析收据数据。使用此处描述的机制验证收据并检索其中存储的信息。
但是,从我对MKSKSubscriptionProduct实现的简要介绍来看,代码似乎会覆盖来自App Store验证服务器的JSON响应的初始收据数据。所以有些时候,receipt属性可能是一个有效的JSON对象,有些时候它不是。
此外,代码似乎是直接通过App Store验证收据。这被视为安全风险。引自Apple's recommendations regarding the iOS5 App Store vulnerability:
验证收据的最佳做法是将收据发送到您的服务器,让服务器通过App Store服务器执行验证。如果您的应用直接从设备连接到App Store服务器,则您的应用可能会受此漏洞影响。
最重要的是,我认为MKStoreKit实现中存在一些错误,并且可能值得向开发人员提出这些问题。
<强>更新强>
我应该补充一点,App Store沙箱环境倾向于在最不合适的时候破解。可能只是沙箱无法响应收据验证请求,因此MKSKSubscriptionProduct收据将保留为初始非JSON状态,从而导致失败。
如果是这种情况,您可能会发现一旦修复了沙箱,它会在某个时刻突然开始工作。