1

在通过 MKStoreKit 使用 StoreKit 的应用程序中工作时,我注意到检查订阅是否仍然有效的方法总是返回 0(NO 或 false)。

我跟踪了错误,发现在此行生成的方法- (BOOL) isSubscriptionActive:(NSString*) featureId内部jsonObject

id jsonObject = [NSJSONSerialization JSONObjectWithData:subscriptionProduct.receipt options:NSJSONReadingAllowFragments error:nil];

nil

然后我检查了这个方法返回的错误,即:

[MKStoreManager isSubscriptionActive:]] 错误域 = NSCocoaErrorDomain 代码 = 3840 “操作无法完成。(可可错误 3840。)”(在字符 15 周围的对象中没有键值。)用户信息 = 0x200c0300 {NSDebugDescription = 没有值键入字符 15 周围的对象。} (lldb)

然后我检查了收据,我发现问题在于假定的“JSON Receipt”不是 JSON,因为它使用“ =”而不是“ :”。我想有人已经在处理这个问题,那么你的解决方案是什么?

编辑 我正在使用沙盒环境。

4

1 回答 1

4

收据不是 JSON 对象。它是私有格式,应该传递给 App Store 进行验证 - 您不应该尝试自己解析它。从应用内购买编程指南

注意:在 iOS 上,商店收据的内容和格式是私密的,可能会发生变化。您的应用程序不应尝试直接解析收据数据。使用此处描述的机制来验证收据并检索其中存储的信息。

但是,从我对 MKSKSubscriptionProduct 实现的简要了解来看,这些代码似乎用来自 App Store 验证服务器的 JSON 响应覆盖了初始收据数据。因此,收据属性有时可能是有效的 JSON 对象,有时则不是。

此外,该代码似乎直接在 App Store 验证收据。这被认为是一种安全风险。引用Apple 关于 iOS5 App Store 漏洞的建议

验证收据的最佳做法是将收据发送到您的服务器,并让您的服务器使用 App Store 服务器执行验证。如果您的应用直接从设备连接到 App Store 服务器,您的应用可能会受到此漏洞的影响。

最重要的是,在我看来,MKStoreKit 实现中存在一些错误,可能值得向开发人员提出这些问题。

更新

我应该补充一点,App Store 沙盒环境往往会在最不合时宜的时候崩溃。可能只是沙箱无法响应收据验证请求,因此 MKSKSubscriptionProduct 收据保留其初始非 JSON 状态,因此失败。

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

于 2013-05-25T17:26:37.023 回答