web-dev-qa-db-ja.com

テストユーザーのIOSアプリ内購入サンドボックスからの購入のクリア

IOSアプリ内購入サンドボックスをリセットおよび/またはクリアする方法についてのアイデアはありますか?サンドボックスでテストしているアプリがあり、テストしたいのですが何かを購入するたびに新しいテストユーザーを作成する必要なしに新規購入します。これを行わない場合、(もちろん)をクリックすると、常にアプリ内購入アイテムが既に購入されているというメッセージが表示されますアプリの購入ボタン。

106

IMOでは、非消耗品のテストに耐えられるようにするために、次の3つのことができます。

  1. 1つのメールに多数のテストアカウントを関連付けることができます。たとえば、Gmailでは、「プラス」文字列をメールに追加して 、アドレスのエイリアスを作成できます[email protected]および[email protected]両方とも本当に[email protected]に移動します。おそらく他の電子メールホストも同じことをします。テストアカウントを作成する際には、名、姓、メールアドレス、パスワード、秘密の質問、秘密の回答、生年月日、iTunesストアの国を紹介する必要があります。 [email protected][email protected]にまったく同じデータ(パスワードを含む)を置くことができ、2つのテストアカウントがあります。最後に、[email protected]受信ボックスに、Appleから両方のテストアカウントを確認するための2つの確認メールが届きます。

  2. 製品ID @ "Extra_Levels"の非消耗品があるとします。すべてのメソッド(requestProduct、purchaseProductなど)で@ "Extra_Levels"を記述する代わりに、PRODUCT_ID1を記述し、ヘッダーファイルに#define PRODUCT_ID1 @"Extra_Levels"(セミコロンなし!)を置くだけで、プリプロセッサは検索しますPRODUCT_ID1を@ "Extra_Levels"に置き換えます。その後、@ "Extra_Levels_01"という新しい非消耗品を作成し、#defineを変更すると、すべてのテストユーザーの購入をリセットするのと同じくらい良いでしょう。

  3. アプリマティックスが指摘したように、消費可能なIAPを最初に使用して(テストユーザーが必要なだけ購入できるように)いくつかのバグを取り除くことで、非消費IAPを購入するときにコードの正しい動作をテストできます。もちろん、その後、実際の非消費型IAPでコードをテストする必要もあります。

69
Roberto Canogar

私の知る限り、これを行うことはできません。サンドボックスバックエンドは、実際のアカウントのように機能します。購入すると、購入します(したがって、復元をテストできます)。開発の大部分は、店舗スタッフが詰め込んだ状態で行い、実際にテストを開始したら、いくつかのテストアカウントを作成します。

31
Ben Zotto

アプリ購入アイテムが2つあります。実動用に1。もう1つはテスト用です。 「クリア」する必要がある場合、アプリ内アイテムを削除して新しいアイテムを作成します(iTunes接続で15秒、コードで製品IDを変更するために1秒)

「新しいユーザー」をテストする必要がない場合は、アプリアイテムのプロダクションを使用します。

7
user1105951

まあ、技術的にはあなたはそれを必要としません。

SKPaymentTransactionStateRestoredを取得した場合、アプリストアがユーザーを確認し、購入を許可したことに100%相当します。私は次のようなスイッチを持っています:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
  for( SKPaymentTransaction *purch in transactions )
  {
    switch( purch.transactionState )
    {
      case SKPaymentTransactionStateRestored:
        info( "PURCHASE RESTORE" ) ;
        // fall thru
      case SKPaymentTransactionStatePurchased:
        [[SKPaymentQueue defaultQueue] finishTransaction:purch];
        // Do regular changes to app state for this purchase,
        // register in keychain, etc.
        break ;

       //.. other cases
     }
  }
}

アプリにロジックを持たせる/購入を取り戻すという質問は簡単です。購入をキーチェーンにキャッシュしている場合は、キーチェーンを削除します。他の方法でやる場合は、ローカルアプリの状態を変更して、ユーザーが以前に購入したことがないふりをするだけです。ダイアログを購入するリクエストは、まったく同じです。唯一の違いは、YESをパンチしたときです。SKPaymentTransactionStateRestoredの代わりにSKPaymentTransactionStatePurchasedが表示されます。

6
bobobobo

アプリの削除と再インストールは、サンドボックステストでも機能します。明らかにアプリに依存しますが、現時点ではサインアップ中にのみ購入するサブスクリプションベースのアプリをテストしているため、最も簡単なソリューションです。

4

SimStoreKit を確認してください。これは、「iPhoneシミュレーター、またはConnectでIAPを設定することなくデバイス上でストアUIをテストするための、iPhoneのStoreKitのシミュレーションバージョン」です。

SimStoreKitは、キーILSimSKTransactionsの下のユーザーデフォルトに購入を保存します。だからあなたができるすべての購入をクリアするには:

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"ILSimSKTransactions"]

シミュレーターで、アプリを削除して再度インストールするだけです。

サンドボックスでテストする前に、SimStoreKitを使用してアプリのストアフロントをデバッグできました。このライブラリの利点は、実際のStoreKitフレームワークと同じクラス名を使用するようにセットアップできることです(#define ILSimReplaceRealStoreKit 1実行前#include <ILSimStoreKit.h>)。

StoreKitにアクセスする必要があるソースファイルには、次のヘッダーファイルを含めます。

#import <TargetConditionals.h>

#if TARGET_IPHONE_SIMULATOR
    #define kILSimAllowSimulatedStoreKit 1
    #define ILSimReplaceRealStoreKit 1
    #import <ILSimStoreKit.h>
#else
    #import <StoreKit/StoreKit.h>
#endif

これには、シミュレータで実行するときにSimStoreKitを使用し、デバイスで実行するときに実際のStoreKitを使用する効果があります。

3
Emile Cormier

実際には答えではありませんが、説明に役立ちます。

ファイルをダウンロードしなければならなかったので、多分それは削除できると思った。以下の単純な関数はそれを試みます(Swift 3.0):

func removeReceipt() {
    if let receiptURL = Bundle.main.appStoreReceiptURL {
        print("receipt URL: \(receiptURL)")
        do {
            try FileManager.default.removeItem(at: receiptURL)
            print("Success")
        } catch let error as NSError {
            print("ERROR: \(error.localizedDescription)")
        }
    }
}

次の応答を得ました:

レシートURL:file:/// private/var/mobile/Containers/Data/Application/7A2-App-Related-Number-67/StoreKit/sandboxReceipt

エラー:アクセス権がないため、「sandboxReceipt」を削除できませんでした。

コードは、アプリバンドルから領収書を引き出すことを示していますが、バンドルは静的であると考えていたため、領収書は削除可能である可能性があります。これがすべてこのように機能する安全な理由があると確信しているので、アプリを削除して、領収書なしからダウンロードした新しい領収書に移行する(再)テストケースにする必要がありました。

0
anorskdev

新しいテストアカウントを完了するのではなく、同じテストアカウントを使用し続け、購入を復元するだけです。結局、新しい購入を開始するか、古い購入を復元するかにかかわらず、あなたのアプリは同じことをします(少なくとも最初は、完了時にユーザーインターフェイスが異なって更新される可能性があります)。 Appleは、それらの異なる状況で物事を異なる方法で処理する人々です。心配しないでください。

テストのために、このメソッドの実装内のSKPaymentTransactionStateRestoredケースに配信ロジックを配置します。

- (void)paymentQueue:(SKPaymentQueue *)queue
 updatedTransactions:(NSArray *)transactions;

次に、その配信ロジックをSKPaymentTransactionStatePurchasedケースに入れてください。

最後に、私たちのほとんどは程度に応じて強迫観念的であるため、新しいアカウントで最終テストを行います(絶対的な確実性のために2番目のアカウントを作成することは大したことではありません)。

最後に、Appleの立場を考慮してください。 IAPを徹底的にテストするために数十または数百のアカウントを作成するのに時間を浪費しなければならない開発者に問題があった場合、彼らは問題を解決したでしょう。問題はない。

0