2017-09-19 2 views
7

L'achat dans un simulateur iOS est bien connu "non, ce n'est pas possible". Cependant, la récupération SKProduct informations en fournissant des identifiants de produit à un SKProductsRequest utilisé pour travailler avant iOS 11.SKProduitsDemande ne fonctionne pas dans iOS 11 Simulateurs

Dans le SKProductsRequestDelegate je reçois l'erreur suivante: Error Domain=SSErrorDomain Code=0 "Cannot connect to iTunes Store" D'après ce que j'ai découvert, cela peut se produire soit lorsque les identificateurs de produits sont faux, ou les serveurs Apple Sandbox sont en panne. Toutefois, ce n'est pas le cas puisque les produits sont chargés bien sur iOS .. 10

Ma mise en œuvre de fetching produit est à peu près le même que dans le Apple guides

Quelqu'un connaît bien ce ou trouvé une solution?

Les produits se chargent correctement lorsque l'application s'exécute sur un périphérique physique. J'utilise Xcode 9.0.

Répondre

4

Même ici. Si vous répétez la requête en cas d'échec, réessayez. Après l'énième répétition, il retournera finalement les produits. Cela peut prendre 10, 50 ou même plus de 100 répétitions.

Voilà donc comment mon code ressemble maintenant:

- (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

Merci pour la suggestion @ vilmoskörte! Cela pourrait être un moyen de contourner le problème, bien qu'en cas de problème réel, je crois que nous réessayerions sans cesse. Mais pour le débogage, c'est une bonne idée. J'ai envoyé un DTS à Apple hier et j'ai reçu une réponse assez rapide, me disant que ça ressemble à un bug (au moins, ils n'ont pas dit depuis iOS 11 que vous n'êtes pas censé aller chercher des produits dans les simulateurs). envoyé leur rapport de bogue. Espérons qu'ils vont régler ça bientôt. :) –

+0

Oui, il réessayera sans cesse. Pour éviter cela, on pourrait bien sûr utiliser le compteur pour définir une limite en insérant quelque chose comme 'if (count == 200) return;' dans la dernière méthode. –

+1

En cours d'exécution dans ce même problème. Semble fonctionner indépendamment du nombre de demandes. Juste semble ne pas fonctionner en général. Cela provoque l'échec de tous mes tests unitaires pour mes abonnements. Pas drôle. Quelqu'un a-t-il des commentaires sur la question de savoir si cela est en cours? –

0

Il est une question de pomme. J'ai aussi eu un problème similaire. Après avoir essayé beaucoup, je me souviens de la méthode de demande de produit pour 10 fois et j'ai eu une réponse dans un deuxième essai. Cela fonctionne sur iOS 9 et 11 seulement. Pas pour iOS 10. Et une fois que vous obtenez vos produits, vous l'aurez surement dans la première fois plus tard. Cela fonctionne sur l'appareil et le simulateur. Ma mise en œuvre est comme:

- (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]; 
}