2011-11-11 7 views
1

私のiPhoneアプリでは、アプリ内購入を設定しました。私はこのような要求を開始:アプリの購入の返事は一切受け付けていません

SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject: @"com.nicknoble.tiprounder.upgrade"]]; 
request.delegate = self; 
[request start]; 

をそして私は、応答を取得するには、このメソッドを使用します。

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response 
{ 
    NSLog(@"response recieved"); 
} 

そして、この1エラーキャッチする:

-(void)request:(SKRequest *)request didFailWithError:(NSError *)error 
{ 
    NSLog(@"%@",error.description); 
} 

をしかし、どちらも今まで取得しますと呼ばれる。私のプロジェクトに警告やエラーはなく、デバイス(iPhone)でこれを実行しています。助言がありますか?

EDIT:

だから、それは私の窓のルートビューコントローラではなく、私が提示モーダルビューコントローラ上で動作します。ここに私のメインビューコントローラからのコードは次のとおりです。ここで

TestViewController *testView = [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil]; 
[self presentModalViewController:testView animated:YES]; 

はTestViewControllerための.hファイルである:ここでは

#import <UIKit/UIKit.h> 
#import <StoreKit/StoreKit.h> 

@interface TestViewController : UIViewController <SKProductsRequestDelegate> 
@end 

は私の.mファイルのコードは次のとおりです。

#import "TestViewController.h" 

@implementation TestViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers:  [NSSet setWithObject: @"com.nicknoble.tiprounder.upgrade"]]; 
    request.delegate = self; 
    [request start]; 
} 

-(void)request:(SKRequest *)request didFailWithError:(NSError *)error 
{ 
    NSLog(@"%@",error.description); 
} 

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response 
{ 
    NSLog(@"response recieved"); 
} 

@end 

私は絶望的です。どんな助けも素晴らしいだろう!ありがとう!

答えて

0

最初に商品のIDを確認してください。 も、これらのメソッドが実装されているクラスが何らかの形でリリースされていないかどうかを確認します。 (自動返信され、応答を待っている間に自動的に解放される可能性があります)

+0

プロダクトIDは完全に一致し、imはARCを使用しています。私のコードのどこにもリリースやオートレリースはありません。 – user1007895

+0

hmm ...おそらく、クラスのいくつかのコードが問題を啓発するかもしれません。 – samfisher

+0

私はこれが本当にこれに関連する私のプロジェクトの唯一のコードだと思いました。あなたは何が助けになるのかもっと具体的になることができますか? – user1007895

6

SKProductsRequestインスタンスは、リクエストの期間中保持する必要があります。そうでなければ、それを保持している何もないので、(代理人に知らせることなく)黙って死にます。

ARCは、コードが割り当てられたスコープを終了するとすぐにSKProductsRequestを取り除きます。

解決策は、SKProductsRequestをivarに保ち、要求が完了するか失敗するときにnilに設定することです。既に進行中のリクエストの開始を防ぐためにも便利です:

// Define _productsRequest as an ivar of type SKProductsRequest in your class 

- (void)someMethodThatInitiatesTheProductsRequest 
{ 
    if(_productsRequest != nil) 
     return; // There's already a request in progress. Don't start another one. 

    SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject: @"com.nicknoble.tiprounder.upgrade"]]; 
    request.delegate = self; 
    [request start]; 

    _productsRequest = request; // <<<--- This will retain the request object 
} 

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response 
{ 
    NSLog(@"response recieved"); 
    _productsRequest = nil; // <<<--- This will release the request object 
} 

-(void)request:(SKRequest *)request didFailWithError:(NSError *)error 
{ 
    NSLog(@"%@",error.description); 
    _productsRequest = nil; // <<<--- This will release the request object 
} 
+1

+1ですが、リクエストの代わりに議論を続ける必要がありません。コールを受け取る必要があり、リクエストでもそれを保持しない(プロパティ定義ではstrongの代わりにassignを使用します)。 – Drux

関連する問題