56

My app is using in-app purchases, and most of my users can purchase just fine without any problems. For these folks, my app downloads the content after the purchase succeeds and they are happy.

However, for a growing number of my users, once they complete a successful in-app purchase they are being asked for their App Store password every time the app starts up after that. I believe this is happening on the call to:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

which I am calling on startup in accordance with step 6 in Apple's in-app purchase guide:

私の推測では、何らかの理由で、Apple のアプリ内購入サーバーが、トランザクションが正常に終了したことを登録していないということです。

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

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

2 つの質問:

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

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

報奨金編集:

別のApple-IDで行われた取引です。そのため、ダイアログに正しい資格情報を入力しない限り、完了できません。質問は次のいずれかである必要があります。

  1. このような無効なトランザクションを防ぐにはどうすればよいですか (トランザクションが終了していない、ユーザーがネットワークを持っていない、その間に App-ID を変更する)。
  2. どのように剪定できますSkPaymentQueueか?
4

14 に答える 14

32

私は同じ問題を抱えていました。必ず電話してください

[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

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

于 2012-06-01T15:25:20.817 に答える
8

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

[[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. [キャンセル] をタップします。「Sign In Required. Tap Continue and sign in to check for downloads. [Environment: Sandbox]」というダイアログが表示されます。これが以前との大きな違いでした。パスワードの入力を求められたときに [キャンセル] を押したときに、このダイアログが表示されることはありませんでした。
  12. [続行] をタップします。
  13. アカウントのパスワードを入力します。

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

お役に立てれば!

于 2015-08-23T07:01:03.790 に答える
8

ここで回答を削除しないでください。私を誤解させ、何日も混乱させたのは、この特定の Stackoverflow の質問でした。

問題を解決する方法について間違った情報を提供する本当に悪い答えがたくさんあるので、私はこれをここに置いています。

しない:

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

行う:

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

[[SKPaymentQueue defaultQueue] finishTransaction:トランザクション];

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

于 2016-06-12T11:12:00.753 に答える
3

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

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

于 2012-04-09T20:06:40.897 に答える
1

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

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

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

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

    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]
    
  3. すぐにアプリを閉じます。

  4. テスト アカウントからログアウトする (設定から)

  5. アプリを起動

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

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

これが私が知らないことです。これは本番環境 (公開アプリと実際の Apple ログイン) で発生しますか? ないことを願っています。

于 2015-08-07T05:05:34.253 に答える
0

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

于 2012-05-08T21:30:28.720 に答える
0

この問題に関連するiTunes Connect テスト ユーザー アカウントを削除することで解決しました。アプリは実際にもう一度サインインを求めましたが、消えました (アプリを削除し、iPhone を再起動して、通常の非サンドボックス ユーザーとしてログインし、他の非サンドボックス アプリで実際の復元を行い、アプリを起動しました)

于 2014-05-12T16:42:54.690 に答える
0

私のviewDidLoadメソッドでそれを持っていたので、以下を確認してください。Apple が非消耗品から消耗品に移行するように要求したときにアプリを拒否されましたが、viewDidLoad メソッドに次の行を残しました:テストユーザー)

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

パスワードの要求を削除すると、停止しました。

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

于 2012-08-16T23:25:51.190 に答える
0

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

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

于 2012-05-07T02:18:29.967 に答える
0

あなたが言った:

しかし、私のユーザーの数が増えているため、アプリ内購入が成功すると、その後アプリを起動するたびに App Store のパスワードを求められます。これは、次の呼び出しで発生していると思います。

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

add(_ observer:/のドキュメントには、呼び出しによってユーザーが App Store で認証される可能性があることが記載されているため、これは予期された動作のように思われることに注意しaddTransationObserver:ください

// オブザーバーは保持されません。トランザクション配列は、キューにオブザーバーがある間のみサーバーと同期されます。 これには、ユーザーの認証が必要になる場合があります。

open func add(_ observer: SKPaymentTransactionObserver)
open func remove(_ observer: SKPaymentTransactionObserver)

add observerしたがって、ここでの他の回答に加えて、App Store のログイン プロンプトを表示する準備ができるまで、通話を停止する必要があるかもしれません。

于 2019-10-28T21:39:52.723 に答える
0

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

于 2014-01-20T03:35:08.070 に答える