2017-09-19 40 views
7

Mua trong trình mô phỏng iOS là một "không, không thể thực hiện được". Tuy nhiên, lấy SKProduct thông tin bằng cách cung cấp định danh sản phẩm cho một SKProductsRequest từng làm việc trước khi iOS 11.SKProductsRequest không hoạt động trong iOS 11 Mô phỏng

Trong SKProductsRequestDelegate Tôi nhận được lỗi sau: Error Domain=SSErrorDomain Code=0 "Cannot connect to iTunes Store" Từ những gì tôi phát hiện ra, điều này có thể xảy ra, hoặc khi các định danh sản phẩm sai, hoặc các máy chủ Apple Sandbox bị hỏng. Tuy nhiên đây không phải là trường hợp kể từ khi sản phẩm được nạp tốt trên iOS 10 ..

thực hiện của tôi về quyến rũ sản phẩm là khá nhiều giống như trong Apple guides

là bất cứ ai khác trải qua này hoặc tìm thấy một giải pháp?

Sản phẩm đang tải tốt khi ứng dụng đang chạy trên thiết bị thực. Tôi đang sử dụng Xcode 9.0.

Trả lời

4

Tương tự tại đây. Nếu bạn lặp lại yêu cầu khi nó không thành công, chỉ cần thử lại. Sau sự lặp lại thứ mười một, cuối cùng nó sẽ trả lại sản phẩm. Nó có thể mất 10, 50 hoặc thậm chí hơn 100 lần lặp lại.

Vì vậy, đây là cách mã của tôi trông bây giờ:

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

Cảm ơn đề xuất @ vilmoskörte! Đó có thể là một cách xung quanh nó, mặc dù trong trường hợp của một vấn đề thực tế tôi tin rằng chúng tôi sẽ không ngừng thử lại. Nhưng để gỡ lỗi thì đó là một ý tưởng hay. Tôi đã gửi một DTS tới Apple hôm qua và nhận được phản hồi khá nhanh, nói với tôi rằng nó trông giống như một lỗi (ít nhất là họ không nói vì iOS 11 bạn không được phép tìm nạp sản phẩm trong trình mô phỏng) Vì vậy, tôi đã gửi cho họ Báo cáo lỗi. Hãy hy vọng họ sẽ sửa lỗi này sớm. :) –

+0

Có, nó sẽ không ngừng thử lại. Để ngăn chặn điều này, người ta có thể sử dụng bộ đếm để đặt giới hạn bằng cách chèn một cái gì đó như 'if (count == 200) return' vào phương thức cuối cùng. –

+1

Chạy vào cùng một vấn đề này. Dường như làm việc không liên quan đến số lượng yêu cầu. Có vẻ như không hoạt động nói chung. Điều này gây ra tất cả các kiểm tra đơn vị của tôi cho đăng ký của tôi không thành công. Không vui. Bất cứ ai nhận được bất kỳ thông tin phản hồi về việc liệu điều này đang được làm việc trên? –

0

Đây là một vấn đề táo. Tôi cũng có vấn đề tương tự. Sau khi thử nhiều, tôi nhớ lại phương thức yêu cầu sản phẩm trong 10 lần và tôi đã nhận được phản hồi trong lần thử thứ hai. Nó chỉ hoạt động trên iOS 9 và 11. Không cho iOS 10. Và một khi bạn nhận được sản phẩm của bạn, bạn sẽ chắc chắn nhận được nó trong lần đầu tiên sau đó. Nó hoạt động trên cả thiết bị và trình mô phỏng. Triển khai của tôi là:

- (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]; 
} 
Các vấn đề liên quan