私のアプリはアプリ内購入を使用しており、ほとんどのユーザーは問題なく問題なく購入できます。これらの人々にとって、私のアプリは購入が成功した後にコンテンツをダウンロードし、彼らは満足しています。
ただし、私のユーザーの数が増加しているため、アプリ内購入が正常に完了すると、その後アプリが起動するたびに、App Storeパスワードの入力を求められます。私はこれが次の呼び出しで起こっていると信じています:
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
appleのアプリ内購入ガイドのステップ6に従って起動時に呼び出します。
私の推測では、何らかの理由で、Appleのアプリ内購入サーバーが、トランザクションが正常に終了したことを登録していません-私が呼び出しても
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
トランザクションが完了し、コンテンツが正常にダウンロードされたとき。
2つの質問:
他の誰かがこれを見ていますか?
誰かが提案された修正を持っていますか?
バウンティ編集:
別のApple-IDで作成されたトランザクション。ダイアログに適切な認証情報を入力しないと、完了できないのはそのためです。質問は次のいずれかである必要があります。
SkPaymentQueue
をプルーニングするにはどうすればよいですか?私も同じ問題を抱えていました。
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
トランザクションの3つの状態すべて:SKPaymentTransactionStatePurchased、SKPaymentTransactionStateRestored、SKPaymentTransactionStateFailed。
コール時にログインプロンプトが表示されるという同じ問題がありました。
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
また、(ホーム画面や他のアプリで)アプリを使用していないときでも時々発生しますが、これは本当に迷惑でした。周りを見回すと、この問題には非常に多くの提案された回答があるようですが、私は最終的に私が集めたものの組み合わせから解決策を見つけました。
注:手順1の前に、iTunes Connectでテストサンドボックスアカウントを削除しました。それがソリューションに影響するかどうかはわかりません。
問題を解決するために、これは私がやったことです:
それでおしまい。それ以降、ログインすると、アプリを実行するたびにプロンプトが表示されなくなり、ランダムなタイミングで表示されなくなりました。
お役に立てれば!
これは正しい行動だと思います。デリゲートSKPaymentQueueを設定するときに、ファイナライズするトランザクションがあるかどうかを確認してください。未完了の取引はないかもしれませんが、チェックの事実はiTunesにログインする必要があります。そして、あなたはそれで何もできないと思います。
これは一般的にある程度の意味がありますが、トランザクションごとにパスワードを要求するように設定したユーザー(たとえば、子の保護など)にとってはかなり煩わしいものです。したがって、これに取り組む唯一の方法は、iTunesをリクエストしようとしているときにデリゲートを明示的に設定することです。たとえば、「購入を復元する」などのボタンを追加できます。それほど美しくはありませんが、それほど煩わしくありません。
「無限ループ」と呼ばれる問題があります。約1週間、サーバーが更新を5に制限しなかった自動更新の初期の頃の大きな問題でした。トランザクションを取得し、finishTransactionを呼び出さないデバイスは、そのトランザクションをデバイスに約1回配信します。その特定のテストユーザーがログインしてfinishTransactionを呼び出すまでの1週間。機内モードに切り替えると、それらのトランザクションをさらに1週間「クリア」できますが、それらは戻ってきます。
ここで答えを削除しないでください。このStackoverflowの特定の質問が私を惑わし、数日間混乱させました。
問題を解決する方法に関する誤った情報を提供する非常に悪い答えがたくさんあるので、ここにこれを入れます。
しないでください:
DO:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
それだけです、すべてのトランザクションを完了してください!そうしないと、そのデバイスでアプリが起動するたびに、サインイン要求のエンドレスループの地獄に送られます。
IAPのテストでも同じ問題が発生します。
3つのテストアカウントでテストしましたが、アプリは両方のアカウントのパスワードを要求し続けます。購入/復元ボタンやaddTransactionObserverに触れなかったとしても。
これは、以前のトランザクションの一部が正しく完了していないためだと思います。
だが [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
まったく役に立ちません。
これが、この問題を解決するために私が行うことです。
この問題に関連してiTunes Connectテストユーザーアカウントを削除するで解決しました。アプリは実際にもう一度サインインするように要求しましたが、その後表示されなくなりました(私はアプリを削除し、iPhoneを再起動して通常の非サンドボックスユーザーとしてログインし、他の非サンドボックスアプリで実際に復元してからアプリを起動しました)
誰かがこれを見ていて、GoogleMobileAds.frameworkを使用している場合は、
[GADMobileAds disableAutomatedInAppPurchaseReporting];
-application:didFinishLaunchingWithOptions:
iOSアップデート5.1.1で修正されたアプリ内購入に関連するバグ http://support.Apple.com/kb/DL1521
この問題を一貫して再現して解決する方法は次のとおりです。
iOS 8.4、アプリの開発ビルド。
1)テストを使用する(サンドボックス)Appleアカウント。
2)購入したトランザクションを復元します。
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]
3)すぐにアプリを閉じます。
4)テストアカウントからログアウト(設定により)
5)アプリを起動
これで、アプリを起動するたびに、「ログイン」フォームがポップアップします。パスワードを入力してもしなくてもかまいません。購入したり、購入したものを元に戻したりしても問題ありません。アプリを削除して再インストールしてもかまいません。アプリを起動するたびに、iTuneログインが表示されます。
修正:デバイスをハードリブートします。
ここに私が知らないことがあります。これは本番環境(公開されたアプリと実際のAppleログイン))で起こりますか?できません。
あなたが言った:
ただし、私のユーザーの数が増えているため、アプリ内購入が正常に完了すると、その後App Storeのパスワードの入力を求められますとなります。私はこれが次の呼び出しで起こっていると信じています:
_
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
_
_add(_ observer:
_/_addTransationObserver:
_のドキュメントでは呼び出しによりユーザーがApp Storeで認証される可能性があると記載されているため、これは予期された動作のようです。
//オブザーバーは保持されません。トランザクション配列は、キューにオブザーバーがいる間のみサーバーと同期されます。 これには、ユーザー認証が必要になる場合があります。
open func add(_ observer: SKPaymentTransactionObserver)
open func remove(_ observer: SKPaymentTransactionObserver)
したがって、ここでの他の回答に加えて、App Storeログインプロンプトを表示する準備ができるまで_add observer
_の呼び出しを停止する必要がある場合があります。
ご存知のとおり、私は自分のupdatedTransactionsを変更することでこの問題を解決しました。すべての状況で[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
を追加しませんでした。
ViewDidLoadメソッドで次のことを確認しました。 Appleが非消耗品から消耗品に移行することを望んでいたときにアプリが拒否されましたが、viewDidLoadメソッドに次の行を残しました:(パスワードプロンプトは、テストユーザーから通常ユーザーへ、テストユーザーへ戻る)
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
削除されると、パスワードの要求は停止しました。
そして私は去った:[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
で、アプリは問題なく承認されました。
アプリを削除して再インストールすると、別のiTunesアカウントに関連付けられている古いトランザクションがすべて削除されます。通知キューにポストされたトランザクションがまだ表示される場合は、ロジックにfinishTransactionを呼び出さない分岐があった可能性があります。
SKPaymentTransactionStateFailedのトランザクションであっても、paymentQueue:updatedTransactions:にポストされたallトランザクションでfinishTransactionを呼び出す必要があります。
解決できない問題のようです:) Apple support ...でリクエストを送信します...