2017-09-19 7 views
7

Der Kauf in einem iOS-Simulator ist ein bekanntes "Nein, das ist nicht möglich". Allerdings Abrufen SKProduct Informationen von Produktkennzeichnungen zu einem SKProductsRequest Bereitstellung verwendet, bevor iOS arbeitet 11.SKProductsRequest funktioniert nicht in iOS 11 Simulatoren

Im SKProductsRequestDelegate Ich erhalte die folgende Fehlermeldung: Error Domain=SSErrorDomain Code=0 "Cannot connect to iTunes Store" Von dem, was ich herausgefunden hat, kann dies entweder geschehen, wenn der Produkt-IDs sind falsch, oder die Apple Sandbox Server sind ausgefallen. Dies ist jedoch nicht der Fall, da Produkte fein auf 10 iOS ..

Meine Umsetzung von Produkt fetching geladen werden, ist so ziemlich die gleiche wie in den Apple guides

Ist jemand erlebt diese oder eine Lösung gefunden?

Die Produkte werden geladen, wenn die App auf einem physischen Gerät ausgeführt wird. Ich verwende Xcode 9.0.

Antwort

4

Gleiches hier. Wenn Sie die Anfrage bei einem Fehler wiederholen, versuchen Sie es erneut. Nach der x-ten Wiederholung wird es endlich die Produkte zurückgeben. Es kann 10, 50 oder sogar mehr als 100 Wiederholungen dauern.

Das ist also, wie mein Code sieht jetzt:

- (void)inquireProducts { 
    _availableProducts = [NSMutableArray arrayWithCapacity:0]; 
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"productIds" withExtension:@"plist"]; 
    knownProductIdentifiers = [NSArray arrayWithContentsOfURL:url]; 
    if (knownProductIdentifiers && knownProductIdentifiers.count) { 
     // Keep a strong reference to the product request 
     productsRequest = [[SKProductsRequest alloc]initWithProductIdentifiers:[NSSet setWithArray:knownProductIdentifiers]]; 
     productsRequest.delegate = self; 
     [productsRequest start]; 
    } 
} 

#pragma mark SKProductsRequestDelegate method 

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { 
    for (SKProduct *product in response.products) { 
     [_availableProducts addObject:product]; 
    } 
    productsRequest = nil; 
    [[NSNotificationCenter defaultCenter] postNotificationName:IAPPurchaseNotification object:self]; 
} 

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error { 
    if (request == productsRequest) { 
     static int count = 0; 
     NSLog(@"Request %@ failed on %d. attempt with error: %@", request, ++count, error); 
     productsRequest = nil; 
     // try again until we succeed 
     [self inquireProducts]; 
    } 
} 
+2

Danke für den Vorschlag @ vilmoskörte! Das könnte ein Weg sein, aber im Falle eines tatsächlichen Problems glaube ich, dass wir es endlos wiederholen würden. Aber zum Debuggen ist es eine gute Idee. Ich habe gestern eine DTS zu Apple geschickt und bekam eine Antwort recht schnell, mir sagend, dass es wie ein Fehler aussieht (zumindest haben sie seit iOS 11 nicht gesagt, dass Sie Produkte in Simulatoren nicht holen sollen) So ich schickte sie Fehlerbericht. Hoffen wir, dass sie das bald beheben werden. :) –

+0

Ja, es wird endlos wiederholen. Um dies zu verhindern, könnte man natürlich den Zähler benutzen, um ein Limit zu setzen, indem man etwas wie if (count == 200) return; in die letzte Methode einfügt. –

+1

In demselben Problem ausgeführt. Scheint, unabhängig von der Anzahl der Anfragen zu arbeiten. Scheint im Allgemeinen nicht zu funktionieren. Dies führt dazu, dass alle Komponententests für meine Abonnements fehlschlagen. Kein Spaß. Hat jemand ein Feedback darüber, ob daran gearbeitet wird? –

0

Es ist ein Apfel Problem. Ich hatte auch ein ähnliches Problem. Nachdem ich viel versucht habe, erinnere ich mich an die Produktanforderungsmethode für 10 Mal und ich bekam Antwort im zweiten Versuch. Es funktioniert nur auf iOS 9 und 11. Nicht für iOS 10. Und sobald Sie Ihre Produkte bekommen, werden Sie es sicher in der ersten Zeit später bekommen. Es funktioniert sowohl auf dem Gerät als auch auf dem Simulator. Meine Implementierung ist wie:

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error 
{ 

int tried=(int)[[NSUserDefaults standardUserDefaults] integerForKey:@"try"]; 
[[NSUserDefaults standardUserDefaults] setInteger:tried+1 forKey:@"try"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

if([[GameState shared].availableInApps count]==0&&(int)[[NSUserDefaults standardUserDefaults] integerForKey:@"try"]>10) 
{ 
    [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(retry_product) userInfo:nil repeats:NO]; 
} 
Verwandte Themen