web-dev-qa-db-ja.com

アプリ内購入後の起動時にApp Storeパスワードを要求するSKPaymentQueue addTransactionObserver

私のアプリはアプリ内購入を使用しており、ほとんどのユーザーは問題なく問題なく購入できます。これらの人々にとって、私のアプリは購入が成功した後にコンテンツをダウンロードし、彼らは満足しています。

ただし、私のユーザーの数が増加しているため、アプリ内購入が正常に完了すると、その後アプリが起動するたびに、App Storeパスワードの入力を求められます。私はこれが次の呼び出しで起こっていると信じています:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

appleのアプリ内購入ガイドのステップ6に従って起動時に呼び出します。

私の推測では、何らかの理由で、Appleのアプリ内購入サーバーが、トランザクションが正常に終了したことを登録していません-私が呼び出しても

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

トランザクションが完了し、コンテンツが正常にダウンロードされたとき。

2つの質問:

  1. 他の誰かがこれを見ていますか?

  2. 誰かが提案された修正を持っていますか?

バウンティ編集

別のApple-IDで作成されたトランザクション。ダイアログに適切な認証情報を入力しないと、完了できないのはそのためです。質問は次のいずれかである必要があります。

  1. このようなデッドトランザクションを防ぐにはどうすればよいですか(トランザクションが完了していない、ユーザーがネットワークを持っていない一方で、App-IDを変更している)。
  2. SkPaymentQueueをプルーニングするにはどうすればよいですか?
56
montuno

私も同じ問題を抱えていました。

[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

トランザクションの3つの状態すべて:SKPaymentTransactionStatePurchased、SKPaymentTransactionStateRestored、SKPaymentTransactionStateFailed。

31
Ilker Baltaci

コール時にログインプロンプトが表示されるという同じ問題がありました。

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

また、(ホーム画面や他のアプリで)アプリを使用していないときでも時々発生しますが、これは本当に迷惑でした。周りを見回すと、この問題には非常に多くの提案された回答があるようですが、私は最終的に私が集めたものの組み合わせから解決策を見つけました。

注:手順1の前に、iTunes Connectでテストサンドボックスアカウントを削除しました。それがソリューションに影響するかどうかはわかりません。

問題を解決するために、これは私がやったことです:

  1. Xcodeからアプリを実行します。
  2. プロンプトが表示されるのを待ちます。必要なアカウントのパスワードを入力し、[OK]をタップします。
  3. デバイスのホームボタンを押します。
  4. Xcodeからアプリを終了します。
  5. デバイスからアプリを削除します。
  6. 設定アプリでiTunes&App Storeからログアウトします。
  7. デバイスの電源をオフにしてから、再度オンにします。
  8. App Storeから何かを購入します。プロンプトが表示されたら、プロダクションApple IDアカウントでログインします。(設定アプリの下のiTunes&App Storeでプロダクションアカウントでログインできるはずですが、これは私がやった方法です)。
  9. Xcodeに戻り、アプリを再度実行します。 (以前にアプリを削除したため、これは新規インストールである必要があります。)
  10. ログインプロンプトが表示されるまで待ちます。
  11. [キャンセル]をタップします。 「サインインが必要です。続行をタップし、サインインしてダウンロードを確認してください。[環境:サンドボックス]」というダイアログが表示されます。これは以前との大きな違いでした。パスワードの入力を求められているときに[キャンセル]を押したときに、このダイアログが表示されることはありませんでした。
  12. 続行をタップします。
  13. アカウントのパスワードを入力します。

それでおしまい。それ以降、ログインすると、アプリを実行するたびにプロンプ​​トが表示されなくなり、ランダムなタイミングで表示されなくなりました。

お役に立てれば!

6
doraemon

これは正しい行動だと思います。デリゲートSKPaymentQueueを設定するときに、ファイナライズするトランザクションがあるかどうかを確認してください。未完了の取引はないかもしれませんが、チェックの事実はiTunesにログインする必要があります。そして、あなたはそれで何もできないと思います。

これは一般的にある程度の意味がありますが、トランザクションごとにパスワードを要求するように設定したユーザー(たとえば、子の保護など)にとってはかなり煩わしいものです。したがって、これに取り組む唯一の方法は、iTunesをリクエストしようとしているときにデリゲートを明示的に設定することです。たとえば、「購入を復元する」などのボタンを追加できます。それほど美しくはありませんが、それほど煩わしくありません。

3
Maxim Lavrov

「無限ループ」と呼ばれる問題があります。約1週間、サーバーが更新を5に制限しなかった自動更新の初期の頃の大きな問題でした。トランザクションを取得し、finishTransactionを呼び出さないデバイスは、そのトランザクションをデバイスに約1回配信します。その特定のテストユーザーがログインしてfinishTransactionを呼び出すまでの1週間。機内モードに切り替えると、それらのトランザクションをさらに1週間「クリア」できますが、それらは戻ってきます。

3
Peter B. Kramer

ここで答えを削除しないでください。このStackoverflowの特定の質問が私を惑わし、数日間混乱させました。

問題を解決する方法に関する誤った情報を提供する非常に悪い答えがたくさんあるので、ここにこれを入れます。

しないでください:

  • サンドボックステストユーザーを削除します。これは問題を解決することを不可能にし、あなたは手動で解決するためにApple開発者サポートに連絡する必要があります。
  • サンドボックステストユーザーを削除すると、その後そのユーザーとしてログインしてトランザクションを完了するように繰り返し求められる場合は削除できないため、名前Endless Loopが問題になります。また、削除したテストユーザーを再度追加することもできません。開発者ポータルによると、ユーザーIDはすでに使用されています。
  • アプリを削除するか、iOSやその他のナンセンスなものを再インストールします。それは効果がなく、問題を解決せず、多くの時間を浪費します。

DO:

  • すべてのトランザクションに対してFinishを呼び出します。
  • なんらかの理由で中断された場合は、アプリの後続の実行を完了するだけです。アプリには、finishを呼び出すまで繰り返し支払いキュー通知が送信されます。

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

それだけです、すべてのトランザクションを完了してください!そうしないと、そのデバイスでアプリが起動するたびに、サインイン要求のエンドレスループの地獄に送られます。

3
Cliff Ribaudo

IAPのテストでも同じ問題が発生します。
3つのテストアカウントでテストしましたが、アプリは両方のアカウントのパスワードを要求し続けます。購入/復元ボタンやaddTransactionObserverに触れなかったとしても。
これは、以前のトランザクションの一部が正しく完了していないためだと思います。
だが [[SKPaymentQueue defaultQueue] finishTransaction:transaction];まったく役に立ちません。
これが、この問題を解決するために私が行うことです。

  1. app storeが何回尋ねても、各アカウントのパスワードを入力します(3つのアカウントで6回入力します)。
  2. 設定に移動し、Apple ID。
  3. 通常どおりアプリを終了します。xcodeで終了しないでください。次に、タスクリストのプロセスを強制終了します。
  4. デバイスからアプリを削除します(アプリを削除しても機能しません。パスワードを要求されます)
  5. デバイスを再起動します
  6. XCodeからアプリを再度実行します。この場合、アプリストアからアプリを再インストールします。

インスパイア iTunesテストユーザーを使用する場合の予期されるシーケンス

1
highwing

この問題に関連してiTunes Connectテストユーザーアカウントを削除するで解決しました。アプリは実際にもう一度サインインするように要求しましたが、その後表示されなくなりました(私はアプリを削除し、iPhoneを再起動して通常の非サンドボックスユーザーとしてログインし、他の非サンドボックスアプリで実際に復元してからアプリを起動しました)

1
Maciek Czarnik

誰かがこれを見ていて、GoogleMobileAds.frameworkを使用している場合は、

[GADMobileAds disableAutomatedInAppPurchaseReporting];

-application:didFinishLaunchingWithOptions:

1
planetmik

iOSアップデート5.1.1で修正されたアプリ内購入に関連するバグ http://support.Apple.com/kb/DL1521

0
user513790

この問題を一貫して再現して解決する方法は次のとおりです。

iOS 8.4、アプリの開発ビルド。

1)テストを使用する(サンドボックス)Appleアカウント。

2)購入したトランザクションを復元します。

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]

3)すぐにアプリを閉じます。

4)テストアカウントからログアウト(設定により)

5)アプリを起動

これで、アプリを起動するたびに、「ログイン」フォームがポップアップします。パスワードを入力してもしなくてもかまいません。購入したり、購入したものを元に戻したりしても問題ありません。アプリを削除して再インストールしてもかまいません。アプリを起動するたびに、iTuneログインが表示されます。

修正:デバイスをハードリブートします。

ここに私が知らないことがあります。これは本番環境(公開されたアプリと実際のAppleログイン))で起こりますか?できません。

0
user3335999

あなたが言った:

ただし、私のユーザーの数が増えているため、アプリ内購入が正常に完了すると、その後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_の呼び出しを停止する必要がある場合があります。

0
pkamb

ご存知のとおり、私は自分のupdatedTransactionsを変更することでこの問題を解決しました。すべての状況で[[SKPaymentQueue defaultQueue] finishTransaction:transaction];を追加しませんでした。

0
linka

ViewDidLoadメソッドで次のことを確認しました。 Appleが非消耗品から消耗品に移行することを望んでいたときにアプリが拒否されましたが、viewDidLoadメソッドに次の行を残しました:(パスワードプロンプトは、テストユーザーから通常ユーザーへ、テストユーザーへ戻る)

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

削除されると、パスワードの要求は停止しました。

そして私は去った:[[SKPaymentQueue defaultQueue] addTransactionObserver:self];で、アプリは問題なく承認されました。

0
timv

アプリを削除して再インストールすると、別のiTunesアカウントに関連付けられている古いトランザクションがすべて削除されます。通知キューにポストされたトランザクションがまだ表示される場合は、ロジックにfinishTransactionを呼び出さない分岐があった可能性があります。

SKPaymentTransactionStateFailedのトランザクションであっても、paymentQueue:updatedTransactions:にポストされたallトランザクションでfinishTransactionを呼び出す必要があります。

0
pschwamb

解決できない問題のようです:) Apple support ...でリクエストを送信します...

0
Rene Berlin