2017-09-19 4 views
7

iOS 시뮬레이터에서 구매하는 것은 "잘 모르겠습니다"라고 잘 알려져 있습니다. 그러나, 나는 다음과 같은 오류 받고 있어요 아이폰 OS (11) 전에 SKProductsRequestDelegate에서SKProducts iOS 11 시뮬레이터에서 작동하지 않는 요청

를 작동하는 데 사용되는 SKProductsRequest에 제품 식별자를 제공하여 SKProduct 정보를 검색 : 내가 알아 낸 바로는 Error Domain=SSErrorDomain Code=0 "Cannot connect to iTunes Store" 을,이 경우 제품 식별자 중 하나를 발생할 수 Apple Sandbox 서버가 다운되었습니다. 제품은 아이폰 OS 10에서 잘로드 때문에이 ..이 아니다

제품 페칭 내 구현이 거의 Apple guides

와 동일하다 다른 사람이이 경험하거나 해결책을 찾을 수 있습니까?

앱이 실제 장치에서 실행 중일 때 제품이 잘로드됩니다. Xcode 9.0을 사용하고 있습니다.

답변

4

여기에 동일합니다. 실패했을 때 요청을 반복하면 다시 시도하십시오. 덤피 반복 후 그것은 마침내 제품을 반환합니다. 10 번, 50 번 또는 100 번 이상의 반복이 필요할 수 있습니다.

그래서이 내 코드는 지금 모습입니다 :

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

제안 해 주셔서 감사합니다. @ vilmoskörte! 실제 문제의 경우 우리는 끝없이 다시 시도 할 것이지만 그것이 주변의 한 방법 일 수 있습니다. 하지만 디버깅을 위해서는 좋은 생각입니다. 나는 어제 DTS를 보냈고 버그처럼 보였다고 응답했다. (적어도 iOS 11 이후로는 시뮬레이터에서 제품을 가져 오지 않아야한다.) 그래서 나는 버그 리포트를 보냈습니다. 그들이 곧이 문제를 해결할 수 있기를 바랍니다. :) –

+0

네, 끝없이 다시 시도하겠습니다. 이를 방지하기 위해 물론 마지막 메소드에 'if (count == 200) return;'과 같은 것을 삽입하여 카운터를 사용하여 제한을 설정할 수 있습니다. –

+1

동일한 문제가 발생했습니다. 여러 요청과 관련이없는 것으로 보입니다. 그냥 일반적으로 작동하지 않는 것 같습니다. 이로 인해 내 구독에 대한 모든 단위 테스트가 실패하게됩니다. 재미 없어. 누구든지이 작업이 진행되고 있는지에 대한 피드백을 받습니까? –

0

그것은 사과 문제입니다. 나는 또한 비슷한 문제가 있었다. 많은 것을 시도한 후에, 나는 10 번 제품 요청 방법을 회상하고 나는 두 번째 시도에서 응답을 얻었다. iOS 9 및 11에서만 작동합니다. iOS 10에는 적합하지 않습니다. 일단 제품을 구입하면 나중에 처음으로 구입하게됩니다. 그것은 장치와 시뮬레이터 모두에서 작동합니다. 구현 내용은 다음과 같습니다.

- (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]; 
} 
관련 문제