2012-03-29 8 views
4

Ich habe ein Problem. Delegierte Methoden von SKProductsRequest werden niemals aufgerufen. Dies wurde zuvor gefragt, aber es gab keine Antworten. StoreKit delegate functions are not getting calledStoreKit Delegate-Methode wird nicht aufgerufen

Ich bin nicht Englisch als Mutter Lautsprecher, ich manchmal komisch klingen mag:.. P :(

ich StoreKit in meinem iOS-App implementieren möchte ich eine Klasse gemacht, um alle StoreKit Kommunikation zu behandeln Dies ist der Code:

@implementation VRStoreController 
- (void) requestProducts 
{ 
    SKProductsRequest *request= [[SKProductsRequest alloc] 
           initWithProductIdentifiers: 
           [NSSet setWithObject: @"myProductID"]]; 
    request.delegate = self; 
    [request start]; 
    [[UIApplication sharedApplication]setNetworkActivityIndicatorVisible:YES]; 

} 

- (void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response 
{ 
    NSLog(@"F7U12"); 
    [[UIApplication sharedApplication]setNetworkActivityIndicatorVisible:NO]; 
    NSArray *myProducts = response.products; 
    NSLog(@"%@", myProducts); 

} 

I

@interface VRAppDelegate 
@property (strong, nonatomic) VRStoreController *store; 
@end 

Seltsamer eine Instanz in meine app-Delegaten erstellt, dieser Code funktioniert ok, wenn ich [store requestProducts] in meinem APPD laufen idFinishLaunching: Methode.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    //app initialization... 

    self.store = [[VRStoreController alloc]init]; 
    [store requestProducts]; //This works ok, delegate method gets called. 
    return YES; 
} 

Aber wenn ich den Code in Einstellungen Tableview ausführen: DidSelectRowAtIndexPath: die delegierte Methode wird nie aufgerufen.

//VRAppDelegate.m 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    //app initialization... 
    self.store = [[VRStoreController alloc]init];//initialize store 
    return YES; 
} 

//VRSettingsViewController.m 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    switch (indexPath.section) { 
     //case 0, 1... 
     case 2: 
     { 
      VRStoreController *store = ((VRAppDelegate *)[UIApplication sharedApplication].delegate).store; 
      [store requestProducts]; //calls SKProductRequest start, but never calls delegate method. 
      NSLog(@"GO PRO"); 
     } 
     default: 
      break; 
    } 
} 

Ich weiß nicht, was mache ich schlecht. Fast alles versucht und keine Fehler, keine Abstürze, aber der Delegierte wird nie aufgerufen. Jede Hilfe wäre sehr willkommen.

Vielen Dank im Voraus!

Antwort

16

Ich fand endlich das Problem, das ich hatte. Ich behielt die SKProductRequest nicht, also wurde die Anfrage gestartet und dann wurde sie gedumpt. ich es dieses, indem Sie feste

//VRStoreController.m 

@interface VRStoreController() 
@property (strong, nonatomic) SKProductRequest *request; //Store the request as a property 
@end 

@implementation VRStoreController 
@synthesize request; 

- (void) requestProducts 
{ 
    self.request = [[SKProductsRequest alloc] //save the request in the property 
          initWithProductIdentifiers: 
          [NSSet setWithObject: @"myProductID"]]; 
    self.request.delegate = self; 
    [self.request start]; 
    [[UIApplication sharedApplication]setNetworkActivityIndicatorVisible:YES]; 
} 

Obwohl das Problem behoben ist, glaube ich, dass es should't die Notwendigkeit der Beibehaltung Anfrage, da ich bereits die Startmethode genannt und haben ihre Delegierten festgelegt, sollte es tun alles andere für sich selbst, und sollte sich selbst behalten, bis es eine Antwort (oder einen Fehler) empfängt und sich danach selbst zurückzieht.

+0

Herzlichen Glückwunsch zum Fix! Wenn Sie dazu in der Lage sind, stellen Sie bitte sicher, dass Sie Ihre Antwort als "akzeptiert" markieren, damit andere bemerken, dass Ihr Problem gelöst wurde und Sie von Ihrer Lösung lernen können. Cheers ~ –

+1

Ich stimme zu, es sollte nicht beibehalten werden, nur mehr unnötige Zeilen Code. – spybart

+0

Endlich funktioniert es. Es funktionierte nicht nach der oben genannten Technik, dann synthetisiere ich auch meine inApp-Klasse (die in einer anderen Klasse aufgerufen wird). Alles funktioniert, keine Abstürze mehr und Delegierte rufen an :) – Muzammil

18

SKProductsRequestDelegate Das Protokoll entspricht auch das SKRequestDelegate-Protokoll, das die folgenden Methoden hat:

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error; 
- (void)requestDidFinish:(SKRequest *)request; 

diejenigen Implementieren und sehen, ob einer von ihnen genannt wird. Sie erhalten wahrscheinlich einen Fehler oder eine andere unerwartete Antwort.

+2

diese wurden nicht aufgerufen weder – BoteRock

+0

Das hat mir geholfen, danke. –