28

私は iOS 7 で Apple の「グランド ユニファイド レシート」を実装しています。これにより、アプリは検証と検証のために Apple のサーバーに連絡することなく、アプリの購入レシートをローカルで確認できます。ユーザーがアプリに領収書を保存している場合、これはうまく機能します。アプリに領収書がない場合のベスト プラクティスは、アプリに領収書を更新するように要求することです。

SKReceiptRefreshRequest *request = [[SKReceiptRefreshRequest alloc] init];
[request setDelegate:self];
[request start];

問題は、このコードを呼び出すと、ユーザーは自分の Apple ID でログインするように求められることです。これが常に発生するのか、ユーザーのアプリストアへのログインがタイムアウトした場合にのみ発生するのか、100% 確信はありません。本当に必要でない限り、ユーザーに Apple ID のログイン画面を表示したくありません。Apple ID パスワードの入力を求められる理由をユーザーに示す表示を表示したいと思いますが、実際にパスワードの入力が求められる場合に限られます。パスワードを入力する必要がない場合は、シームレスで非表示のプロセスにしたいと考えています。続行するための最良の方法は何ですか? ユーザーがアプリストアにサインインする必要があるかどうかを確認するのが最善の方法だと思いますが、それが可能かどうかはわかりません.

4

3 に答える 3

19

これに対処するのは非常に複雑であるため、この回答は完全に満足できるものではないかもしれません (私は遅れています - 私はそれを認識しています)。

私もこれを正しく行っていない可能性がありますが、これまでのところすべてが機能し、私には理にかなっていますが、ここで「BSを話している」場合は、お気軽に訂正してください.

とにかく、認証アラートが表示されるのを完全に防ぐことはできませんが、表示される回数を最小限に抑える方法がいくつかあります。

存在しないことがわかっている領収書を再ダウンロードする必要はありません。ユーザーがレシートを購入していない、またはレシートを復元していない場合は、レシートの再ダウンロードを試みないようにして、アラート ビューを完全に回避できます。これは私がやったことです:

if([[NSFileManager defaultManager] fileExistsAtPath:[[[NSBundle mainBundle] appStoreReceiptURL] path]] != YES)
{
    SKReceiptRefreshRequest *refresh = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:nil];
    [refresh start];
}

私のアプリには IAP でロック解除される多くの「プロ」機能があるため、メイン アプリケーション ループの前にこれを main.m ファイルに配置しますが、実際にこれを適切な場所に配置することができます。

主な考え方は、領収書はアプリのディレクトリに保存されている実際のファイルであるということです。したがって、ここで行っていることはすべて、領収書が実際に存在するかどうかを確認することです。そうでない場合は、再更新する手間が省けるため、ユーザーに認証画面を表示する手間が省けます。

必要に応じて、ユーザーがアプリの「プロ」機能を使用する可能性がある場所にこのコードを配置できます。SKReceiptRefreshRequestから継承されSKRequestているため、メソッドを呼び出しSKRequestDelegateます。そのため、ユーザーがプロ機能のある画面に移動した瞬間にレシートを更新し、デリゲート メソッドが呼び出されたときに機能を有効にすることができます (レシートの内容を確認する追加作業を行った後)。

このアプローチの大きな欠点は、インターネット接続が必要なことです。アプリがオフラインで動作する場合、ユーザーはすべての IAP もオフラインで動作することを期待するため、特定のシナリオではレシートの再ダウンロードが問題になります。

于 2014-01-12T07:00:59.057 に答える
5

私の経験を共有したいと思います。私はサンドボックスで作業しており、アプリを削除した後にアプリのレシートがありません。(そして、Command-R を再実行) これが本番環境で発生するかどうかはわかりませんが、発生しているように聞こえます。アプリの初回起動時に更新を要求し、ユーザーにパスワードの入力を求めるのは驚くべきことです。もちろん、これは問題です。

ダイアログボックスをポップすることなく[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]、アプリの領収書を静かに更新するようです。つまり、トランザクションが復元された後、appReceiptURL + データを要求すると、nil 以外の値が返されます。これは、私の短い量のテストからのものです。独自のテストを行ってください。

于 2015-01-14T21:12:27.190 に答える