我有一个仅限 iOS 7 的产品,我想阅读 App Store 收据并检查原始应用购买日期。我一直在使用 RMStore 库 ( https://github.com/robotmedia/RMStore ) 来读取应用收据并返回该信息,如下所示:
RMAppReceipt* appReceipt;
appReceipt = [RMAppReceipt bundleReceipt];
if (appReceipt == nil)
{
NSLog(@"ERROR! NO APP RECEIPT FOUND");
}
else
{
NSLog(@"app receipt original version = %@", appReceipt.originalAppVersion);
}
注意:我目前没有使用 RMStore 库的任何其他部分
在大多数情况下,这很有效。问题是对于我的一些用户,appReceipt.originalAppVersion 是一个空字符串。其他字段,例如当前的 appVersion,都很好。执行 SKReceiptRefreshRequest 后,仍然没有运气。事实上,SKReceiptRefreshRequest 有时会通过将 appReceipt.originalAppVersion 从有效字符串更改为空字符串来使情况变得更糟。
对于遇到此问题的客户,我已指示他们删除该应用程序并从应用程序商店重新下载。在大多数情况下,这确实可以解决问题,但并非总是如此。显然,我想在不要求我的用户重新安装的情况下防止该问题。
整个应用商店收据功能对我来说非常模糊,我对所有正在进行的加密和解密一无所知,这就是为什么我希望依靠 RMStore 为我完成这项工作。我想要一个不错的小型本地图书馆来完成这项工作,而无需使用服务器,而 RMStore 符合要求。
我不知道这是 RMStore 库中的错误,还是应用商店收据系统的一些固有怪癖,其中可能存在解决方法。使用 RMStore 的其他人是否遇到过空 appReceipt.originalAppVersion 的问题?
====== 更新:经过进一步调查,这似乎是 StoreKit 工作方式的一个怪癖。我用另一个库 DHAppleReceiptParser 复制了这个问题。当问题情况出现时,苹果服务器似乎没有返回原始应用程序版本号,因此库不接受它。但是,另一个未记录的字段又回来了, original_purchase_date (仅记录在应用程序购买收据中,而不是应用程序收据中)。我能够直接查询 iTunes 服务器 (buy.itunes.apple.com/verifyReceipt) 进行验证,这对调试很有用,但不推荐用于发货产品。这些是结果:
问题情况。这发生在我的大约 1% 的客户身上,或者在执行 SKReceiptRefreshRequest 之后经常发生。没有“original_application_version”字段!
{
environment = Production;
receipt = {
"adam_id" = 316120800;
"application_version" = "6.0.1";
"bundle_id" = "com.yourcompany.myappid";
"download_id" = 9999;
"in_app" = (
);
"original_purchase_date" = "2010-11-26 16:35:57 Etc/GMT";
"original_purchase_date_ms" = 1290789357000;
"original_purchase_date_pst" = "2010-11-26 08:35:57 America/Los_Angeles";
"receipt_type" = Production;
"request_date" = "2013-12-20 19:35:02 Etc/GMT";
"request_date_ms" = 1387568102285;
"request_date_pst" = "2013-12-20 11:35:02 America/Los_Angeles";
};
status = 0;
}
删除应用程序并从 iCloud 购买进行全新安装后。“original_application_version”现在在那里!
{
environment = Production;
receipt = {
"adam_id" = 316120800;
"application_version" = "6.0.1";
"bundle_id" = "com.yourcompany.myappid";
"download_id" = 23007878277739;
"in_app" = (
);
"original_application_version" = "3.1";
"original_purchase_date" = "2010-11-26 16:35:57 Etc/GMT";
"original_purchase_date_ms" = 1290789357000;
"original_purchase_date_pst" = "2010-11-26 08:35:57 America/Los_Angeles";
"receipt_type" = Production;
"request_date" = "2013-12-20 21:02:30 Etc/GMT";
"request_date_ms" = 1387573350752;
"request_date_pst" = "2013-12-20 13:02:30 America/Los_Angeles";
};
status = 0;
}
“original_purchase_date”似乎更可靠地检查产品的购买时间,但 Apple 文档并未提及基本应用收据(仅限 IAP)。