ios7 - 月額課金 - 自動課金 メール




更新されていない購読:受け取りから削除されましたか? (2)

これはまた、私を悩ませているのを困惑させています。 度もドキュメントを見た後、私はついにレシート検証プログラミングガイドのレシートフィールドノートで以下を見ました:

消耗品のアプリ内購入レシートは、購入時にレシートに追加されます。 あなたのアプリがそのトランザクションを終了するまでそれはレシートに保存されます。 それ以降は、次回ユーザーが購入したときや、アプリが明示的に領収書を更新したときなど、領収書が次回更新されるときに領収書から削除されます。

非消耗品、自動更新購読、非更新購読、または無料購読のアプリ内購入の領収書は、無期限に領収書に残ります。

In-App Purchase Programming Guide 」の「App Receiptを使用した永続化」のセクションでは、消耗品と更新されていない購読は同じように扱われることを示しています。

私は、IAP文書が古くなっていることを観察していることを、その振る舞いから推測していますか? そうだといい。

私は(リリース予定)私のアプリのアプリ内購入を実装し、iOS6とiOS7のサポートを提供しています。 私の質問は、iOS 6とiOS 7の間で更新されないサブスクリプションメカニズムの違い、より具体的には復元の実装方法に関するものです。 iOS 6とiOS 7の両方に対応するために、復元を有効にするためのサーバーサイドソリューションを実装しました。 復元を実行するために、別のデバイス(またはデータが失われた場合は同じデバイス)で使用できるユーザー名/パスワードをユーザーが作成できるようにします。 私はこれの大部分は基本的にうまくいっていますが、私は私のテストを進めてきたので、私は何か興味深いものを見つけました。

私のiOS7の復元プロセスの最初の部分では、SKReceiptRefreshRequestを使用してアプリのレシートを更新します。 iOS7デバイスからアプリを削除し、再インストールして(この時点では領収書はありません。iExplorerを使用してテストしました)復元を実行すると、SKReceiptRefreshRequestによって10個の購入が復元されます。 。 そのうちの1つは消耗品で、 9つの領収書は更新されていません 。 これは私を混乱させる。 Appleの文書によると、更新された領収書には、消耗品以外の商品しか購入できないとのことでした。 https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateLocally.htmlから:

「消耗品および更新されていない購読:消耗品または更新されていない購読のアプリ内購入の領収書は、購入時に領収書に追加されます。 あなたのアプリがそのトランザクションを終了するまでそれはレシートに保存されます。 それ以降は、次回ユーザーが別の購入を行ったとき、またはアプリケーションが明示的に領収書を更新したときなど、領収書が次回更新されたときに領収書から削除されます。」

非更新サブスクリプションに関連するものとして、 https://developer.apple.com/in-app-purchase/In-App-Purchase-Guidelines.pdfhttps://developer.apple.com/in-app-purchase/In-App-Purchase-Guidelines.pdfから:

iCloudまたは独自のサーバーを使用して購入を追跡し、購入した購読を1人のユーザーが所有するすべてのiOSデバイスに復元できるようにします

そして次の表( https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Products.html )からhttps://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Products.html

誰か何か洞察力がありますか?

質問: SKReceiptRefreshRequestが未更新商品の購入を領収書に残すのはなぜですか? これはAppleのドキュメントのバグですか、それとも他に何か起こっていますか?

2/23/14; 更新日:私は最近これについてAppleにバグレポートを出しました。 まだ言葉はありません。 しかし、実際には、この「バグ」を解消したくありません。

10/20/15; アップデート: Appleは実際にこの「バグ」を解決したようです。 さて、私がSKReceiptRefreshRequestを使用して復元を行う場合(これはAppleの推奨する復元方法のようです)、 SKReceiptRefreshRequestSKReceiptRefreshRequesthttps://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Restoring.html )、私は現在、非更新購読の購入が領収書に表示されていません 。 私は非消耗品しか手に入れません(私のアプリには、非更新購読と非消耗品の購入しかありません)。 少なくともこれを書いた直後に、私はバグ報告をAppleに提出するつもりです。彼らのドキュメントは予想される動作についてあいまいなので。

これまでのところ私のテストではiOS 8.4とiOS 9(実稼働リリースでは正しいデバイスが動作していないため実際には9.1ベータ版)で動作している私のアプリが含まれています。 iOS /デバイス側の変更を話します。 また、これまでの私のテストはすべて私のアプリの開発ビルドで行われているので、アプリ内購入サンドボックスにも入っています。 間もなく実稼働テストを実行します。

12/3/15; 更新; Apple Tech Supportのプロンプトで、私はもう少しテストをしました。 今回は、iOS9.2 beta 4(13C75)を実行しているiPad上。 現在は更新されていない購読で「通常」に戻っているようです。 つまり、復元を実行すると、レシートに更新されていない購読が再び表示されます。


注意してください。AppReceiptに更新されていない購読を継続しても、App Storeのレビュー担当者に受け入れられる保証はありません。 成功は特定のレビュー担当者によって異なります。 私は最近Appleからこのメッセージを得ました:

ユーザーのApple IDとパスワードを入力して、以前に購入したアプリ内購入商品を復元する機能がアプリに含まれていることがわかりました。 ただし、非更新サブスクリプション内アプリ内購入をこの方法で復元することはできません。

この機能を削除するにはバイナリを修正するのが適切でしょう。 ユーザーが更新されないサブスクリプション内のアプリ内購入製品を復元できるようにするには、独自の復元メカニズムを実装する必要があります。

そのため、アプリを送信しようとする最後の試みは不運でした。 前のいくつかとは異なります。

だから今、私の計画は、iCloud Key-Value StorageにApp Receiptを保存し、自動的にすべての購入品を復元することです。 それはりんごの要求を満たすでしょう:

非更新購読の場合は、iCloudまたは独自のサーバーを使用して永続的な記録を保存してください。 (c)Store Kitプログラミングガイド

これが、これらの目的のために提供されているAppleのコードです。

#if USE_ICLOUD_STORAGE
NSUbiquitousKeyValueStore *storage = [NSUbiquitousKeyValueStore defaultStore];
#else
NSUserDefaults *storage = [NSUserDefaults standardUserDefaults];
#endif

NSData *newReceipt = transaction.transactionReceipt;
NSArray *savedReceipts = [storage arrayForKey:@"receipts"];
if (!receipts) {
    // Storing the first receipt
    [storage setObject:@[newReceipt] forKey:@"receipts"];
} else {
    // Adding another receipt
    NSArray *updatedReceipts = [savedReceipts arrayByAddingObject:newReceipt];
    [storage setObject:updatedReceipts forKey:@"receipts"];
}

[storage synchronize];