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 ライブラリのバグなのか、アプリ ストアのレシート システムに固有の癖で回避策があるのかはわかりません。appReceipt.originalAppVersion が空であるというこの問題に RMStore を使用している人はいますか?
====== 更新: さらに調査すると、これは StoreKit の動作に問題があるようです。別のライブラリ DHAppleReceiptParser で問題を再現しました。問題が発生した場合、Apple サーバーは元のアプリのバージョン番号を返していないように見えるため、ライブラリはそれを取得しません。ただし、文書化されていない別のフィールド 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 のみ)。