web-dev-qa-db-ja.com

アプリ購入中のiOS-製品は受け取られていません

ここで説明する手法に従って、アプリ内購入をアプリに追加しようとしています。

iOS 6チュートリアルでのアプリ内購入の概要

次のように設定されたIDを持つiTunesConnectを介して製品を追加しました。

com.mycompany.myapp.myproduct1

バンドルID(p-listおよびアプリストアでも指定)は次のように設定されます。

 com.mycompany.myapp

チュートリアルのヘルパークラスであるIAHelperを使用して、購入機能を処理しています(以下に示す関連コード)。また、基本的にアプリ内製品のIDをIAHelperの製品IDの配列に追加するために使用されるサブクラスもあります。

コードをテストするために、このメソッドを呼び出す「showproducts」というラベルの付いたボタンを作成しました。

- (IBAction) showProducts {

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(productsLoaded:) name:kProductsLoadedNotification object:nil];

    Reachability *reach = [Reachability reachabilityForInternetConnection]; 
    NetworkStatus netStatus = [reach currentReachabilityStatus];    
    if (netStatus == NotReachable) {        
        NSLog(@"No internet connection!");        
    } else {        
        if ([InAppMyAppAPHelper sharedHelper].products == nil) {


            // here's where it calls the helper class method to request the products
            [[InAppMyAppAPHelper sharedHelper] requestProducts];

            self.hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
            _hud.labelText = @"Loading vocabulary...";
            [self performSelector:@selector(timeout:) withObject:nil afterDelay:30.0];

        }        
    }

}

これは、上記のように、iTunesConnectから製品を要求する方法です。

- (void)requestProducts {

    self.request = [[[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers] autorelease];
    _request.delegate = self;
    [_request start];

}

(「_」が前に付いている変数は、いくつかの合成ステートメントごとにアンダースコアがない同じ名前の実際の変数を参照していることに注意してください)

最後に、これは応答が受信されたときに通知を受け取る(IAHelperの)メソッドです。

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

    NSLog(@"IAHelper, received products results...");   

    self.products = response.products;
    self.request = nil;    

    // Here's the loop to list the products received
    for (id product in _products){
        NSLog(@"IAHelper, received product is: %@", product); 
    }


    [[NSNotificationCenter defaultCenter] postNotificationName:kProductsLoadedNotification object:_products];    
}

上記のログステートメントは、メソッドが呼び出されたことを示していますが、受信した製品を出力するループには何もリストされていません。

そのため、iTunesConnectで製品が見つからないように見えます。それでも、そこで製品を設定しました。製品のIDは、バンドルIDに製品IDを加えたものと同じです。

bundle id:  com.mycompany.myapp
product id: com.mycompany.myapp.product1

私はそれを数回チェックしました。

ITunesに、広告イン製品のステータスが「送信準備完了」と表示されていることに気付きました。利用できるようにするために必要な追加の手順はありますか?

全体的に、私は何が間違っているのですか?

16
Jack BeNimble

私はまったく同じような問題に遭遇します。これを読んだ後に対処/チェックする必要があるいくつかのステップがあります テクニカルノート アップルから:

  • 一意のアプリIDを作成する
  • このアプリIDのアプリ内購入を有効にする
  • デバイスに新しいプロビジョニングプロファイルを生成してインストールします
  • XcodeでバンドルIDとコード署名プロファイルを更新します
  • プロジェクトの.plistバンドルIDがアプリIDと一致することを確認してください
  • 契約、税金、銀行情報を完成させます。有効な契約が必要です

公式ドキュメントで言及されているように、[〜#〜] no [〜#〜]バイナリを送信する必要はなく、アプリ内購入のスクリーンショットも送信する必要はありません。私はさまざまなブログでこれについて多くの誤解を招く情報を見てきました。

このリストの各ポイントに対処したことを確認した後、アプリを削除して再インストールします。

基本的に、iOS有料アプリの契約を正しく設定することと、デバイスに新しいプロビジョニングプロファイルをインストールしなかったことの2つが欠けていました。それがあなたの問題だったのでしょうか?

42
tiguero

ProductsRequest:didReceiveResponseで有効な商品が返されないことはよく知られている問題です。多くの理由がありますが、TN2259、特にFAQ#6に記載されているものもあります。通常、問題は、アプリがサンドボックスに向けられていないことです。多くの場合、開発者が次の3つのことを順番に実行しなかったことが原因です:1)アプリの古いビルドを削除する(削除する、上書きしない)2)設定アプリを使用してデバイスのアプリストアからログアウトする3)アプリを実行するデバイス(シミュレーターではない)でXcodeを実行し、アプリストアから要求された場合にのみテストユーザーを使用してストアにログインします。

2
Peter B. Kramer

シミュレーターでアプリケーションをテストしているときに同じ問題が発生します。デバイスで試してみてください。

1
Harin

私も同様の問題を抱えていました。 IAP用の別のアプリで機能していたコードを使用したので、機能しているはずですが、無効な製品IDエラーが発生し、結果が表示されませんでした。タイミングの問題であることが判明しました。返品された商品をアプリに返送する前に処理しようとしていたため、商品を読み込む前にアプリが終了するというエラーが発生しました。私のプログラムロジックは次のとおりです。

  • ユーザーがストアビューを開き、IAP製品が読み込まれます
  • UITableViewには、製品のリストがロードされます(ただし、ローカルに保持されている配列から)
  • ユーザーがテーブルセルの購入ボタンをクリックします-これが早すぎる場合、実際の製品はまだ返品されていません-アプリがクラッシュします

私にとっての答えは、返品された製品からテーブルを作成することでした(そもそも私には明らかだったはずです!)ので、ユーザーはそれらが正しくロードされるまで続行できませんでした

0
JanB

シミュレーターで実行しようとすると、同じ問題が発生しました。

実際のApple TVデバイス(USB経由で接続)で試してみた後、有効な製品IDの取得を開始しました。

次に、コードでこれらの製品の1つを支払うように要求するだけで、(サンドボックスユーザーを使用して)認証を要求し、Apple TVで購入を承認することができます。

0
Ricardo Barroso

同じエラーのあるSwiftプロジェクトの回答:

私のエラーはここにありました:

_//identifiers: [String]
let productIDs = Set(arrayLiteral: identifiers) as Set<NSObject>!
let request = SKProductsRequest(productIdentifiers: productIDs)
_

しかし、このコードはコード= 0のメッセージでエラーになりますiTunesStoreに接続できません。 SKProductsRequest入力引数タイプを見てみましょう。

SKProductsRequest(productIdentifiers: Set<NSObject>!)

したがって、上記のコードは正当に見えます。しかし、そうではありません! Swift Setが問題です。入力引数に、Swift Set!

いくつかのIAPレッスンを繰り返しながら、答えを見つけました。作業コードは次のとおりです。

_let productIDs = NSSet(array: identifiers)
let request = SKProductsRequest(productIdentifiers: productIDs as! Set<NSObject>)
_

あなた必須今のところNSSetを使用しますが、Swift Setはすでに利用可能で、入力引数タイプとして設定されています!私にとってはバグのようです。バグを発生させます。

0
Dima Deplov
0
Basheer_CAD