为什么MKStoreKit isSubscriptionActive方法总是返回NO?

时间:2013-05-24 15:28:15

标签: iphone ios objective-c storekit mkstorekit

在使用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,因为它使用“=”而不是“:”。我想有人已经在处理这个问题了,你的解决方案是什么?

修改 我正在使用沙盒环境。

1 个答案:

答案 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状态,从而导致失败。

如果是这种情况,您可能会发现一旦修复了沙箱,它会在某个时刻突然开始工作。