web-dev-qa-db-ja.com

SKPaymentTransactionStateDeferredをテストする方法は?

iOS 8はまもなく公開されます。 Xcodeベータ6 atmがありますが、ファミリー共有を適切にテストする方法に関するドキュメントはまだ見つかりません(または何か見逃しましたか?)。私の質問は、親/子でサンドボックスを正しく設定する方法ですか?私はそれを喜びなしでベータ1で動作させようとしました。

何かヒントはありますか?

更新:

Apple開発者フォーラムの2つの関連記事:

  1. ITunes Connectで子サンドボックスアカウントを作成する方法( https://devforums.Apple.com/message/1030357#1030357
  2. サンドボックスでの「購入を依頼」のテスト( https://devforums.Apple.com/message/1005569#1005569
25
Maciek Czarnik

私はこのトピックについて少し前進したので、私は報告するつもりだと思いました。さらに、私はAppleに報告した明らかなバグを見つけました。

私がやったことは次のとおりです:

1)iTunes Connectで親テスト(サンドボックス)アカウントを作成し、子テストアカウントを作成します。これらは、実際にはiTunes Connectの2つのテストアカウントです。親と子をPとCと呼びます。

2)両方のアカウントで https://appleid.Apple.com にアクセスし、年齢に応じて年を変更します。 iTunes Connectではこれを行うことができません。何らかの理由で、家族の共有を伴うプロセスは、年齢に1年がない限り機能しません。 https://appleid.Apple.com の年リストで選択を2回行う必要があることがわかりました。奇数。私は、Pを年上(一部の成人年齢)に、Cを年下に設定しました。

3)1つのAppleデバイス(私のiPhone、iOS8を実行))で、Pアカウント用に[設定]> [iCloud]で家族共有を設定しました。実際のiTunesでこのデバイスのiTunesにサインインしています= Apple Id(これには支払い情報があります)。

4)次に、「設定」>「iCloud」で、C Apple idを家族の一員として招待します。

5)P(私のiPad、iOS8も実行)からの招待を受け入れます。これには、Cとして他のデバイスのiCloudにサインインすることが含まれます。

6)iPhoneで、Cファミリーメンバーの[購入を依頼]をオンにします。

これで、サンドボックス化されたアプリでCとしてテスト購入を試す準備ができました。アプリのストアで通常のプロセスを実行すると、次のアラートが表示されます。

enter image description here

「質問」をタップすると、次の警告が表示されます。

enter image description here

今、私は2つのオプションを試し、別々に購入しました。 Pアカウントに通知を送信するはずの「OK」オプションを試しました。私はまだPアカウントでそのような通知を受け取っていません(まだiPadのようにiCloudにサインインしています)。

また、「子供」のiPadで「直接承認」オプションを試しました。私はPアカウントを使用しており、次のアラートの場合はそれを入力します。

enter image description here

その後はエラーにならなかったので、「Approve In Person」は機能しているように見えますが、その購入をまだSKPaymentTransactionStatePurchased状態に変換する必要があります。延期された購入はすべてアプリの支払いキューにあり、それぞれの状態はSKPaymentTransactionStateDeferredです。アプリを再起動すると、まだキューにある各購入の状態が遅延します。

次に、Cの特定のテスト用iTunesアカウントに問題があるのではないかと思ったので、2つ目の子アカウントを作成し、そのC2に呼び出して、iPhoneのPの下で子として確立しようとしました。しかし、そこでさらに問題が発生しました。 C2のPで家族のメンバーになるための招待を受け入れようとすると、(iPadで)警告が表示されます。

enter image description here

私にとって、iCloudアカウントのこの制限はテストアカウントには適用されません。これは私がAppleに報告した明らかなバグです。

つまり、要約すると、私のSKPaymentTransactionStateDeferred実装が機能していることを100%確信しているわけではありません。 Appleが私に戻ってくるかどうかを確認します。

23
Chris Prince

IOS 8.3から、SKPaymentで使用可能な新しいフラグがあります:simulatesAskToBuyInSandbox

したがって、SKPaymentTransactionStateDeferred状態をテストする必要がある場合は、新しいSKMutablePaymentを初期化してsimulatesAskToBuyInSandbox = YESを設定します。

https://developer.Apple.com/library/prerelease/ios/releasenotes/General/iOS83APIDiffs/frameworks/StoreKit.html

PS。警告:このAPIが適切に機能しないと不平を言われています(コメントを参照)

7
kas-kad

Chris Princeの回答 に従って子アカウントを作成するときは、「年齢」を13歳から18歳の間に設定してください。 13未満に設定すると、その年齢を確認できません(Pアカウントにクレジットカードを追加した場合でも)。 18を超える場合-購入を有効にするオプションがなくなりました。私が間違っていることを見つけるために費やした時間。

また、家族の共有画面の「子供のアカウントを作成」オプションではなく、iTunes Connectを介してCアカウントを作成する必要があります。

コメントできればいいのですが、評判ポイントが50点ないため、別の回答を作成する必要があります。

iOS 9.2.1、Xcode 7.2.1、ARC有効

確認しました! simulatesAskToBuyInSandboxプロパティは、支払いキューオブザーバーにSKPaymentTransactionStateDeferred状態を登録させません。その代わり、支払いを処理するだけで、オブザーバーはSKPaymentTransactionStatePurchased状態を登録します。

SKMutablePayment *payment = [SKMutablePayment
   paymentWithProduct:productUserRequested];

payment.simulatesAskToBuyInSandbox = true;
[[SKPaymentQueue defaultQueue] addPayment:payment];

私が実行できた唯一のテストは、オブザーバーが通常のメソッドの代わりにSKPaymentTransactionStatePurchased状態を登録したときに、後払いのメソッドを呼び出して呼び出すことでした。

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

これにより、アプリでのトランザクションが持続します。終了し、購入を完了していないユーザー(購入の最終段階での受信の喪失など)および遅延購入をテストする機能を提供します。これは、リスト4-2で説明されているように、購入方法が遅延パラメーターを渡すことを前提としています4-2トランザクションステータスへの応答in アプリ内購入ガイド:製品の配送 。メソッドは次のようになります。

ハングアップした購入をシミュレートするには:

[self showTransactionAsInProgress:transaction deferred:NO];

遅延をシミュレートするには:

[self showTransactionAsInProgress:transaction deferred:YES];

注:アプリによって異なります。再起動すると、Apple in app。購入メカニズムにより、認証情報のその他の支払いを処理しなかった、アプリをアンインストールした、または「iTunesとApp Stores」からサインアウトした場合に認証情報が要求されますまた、ここで[キャンセル]をタップしても、支払いキューオブザーバーがSKPaymentTransactionStatePurchased状態を登録し続けるため、トランザクションは失敗しません。

UPDATE 3/4/2016:

私はAppleからこの提案を見つけました。これは役立つことが判明するかもしれません。それは私が提案したことをする空想的な方法です:

中断されたトランザクションをテストする

トランザクションキューオブザーバーのpaymentQueue:updatedTransactions:メソッドにブレークポイントを設定して、製品を配信するかどうかを制御できるようにします。次に、テスト環境で通常どおりに購入し、ブレークポイントを使用してトランザクションを一時的に無視します。たとえば、LLDBのスレッドリターンコマンドを使用してメソッドからすぐに戻ることができます。

アプリを終了して再起動します。ストアキットは、起動直後に再度paymentQueue:updatedTransactions:メソッドを呼び出します。今回は、アプリが正常に応答するようにします。アプリが製品を正しく配信し、トランザクションを完了していることを確認します。

お役に立てれば!乾杯。

5
serge-k

結局のところ、サンドボックス環境は親子関係をサポートしていないようで、問題のアカウントが@ChrisPrinceの回答で述べられているように設定されている場合、メッセージは送信されません。

私が掘り下げた記事はここにあります: https://forums.developer.Apple.com/thread/38561#11714

Appleスタッフによる回答からの重要性の抜粋は

Ask-To-Buyのサポートに関しては、サンドボックスではこの機能はサポートされていません。 「購入を依頼する」はAPI実装ではなく、特定のiTunesアカウントとのStoreKit対話を必要とするiTunesConnectによって実装されるサポートプロセスです。このサポートは、実稼働環境にのみ存在します。このプロセスをサンドボックス環境で機能させるには、ITCを実装して、他のアカウントを参照して購入の承認を付与する必要があります。

記事の残りの部分では、Ask to Buyサポートのガイドラインとフローを強調していますが、テストは、子/親アカウントの関係がアクティブな運用環境で行う必要があります。

2
James