SKProductsRequest无法在iOS 11模拟器

时间:2017-09-19 14:51:50

标签: ios in-app-purchase storekit skproduct

在iOS模拟器中购买是众所周知的"不,它是不可能的"。但是,通过向iOS 11之前使用的SKProduct提供商品标识来检索SKProductsRequest信息。

SKProductsRequestDelegate我收到以下错误:Error Domain=SSErrorDomain Code=0 "Cannot connect to iTunes Store" 根据我的发现,当产品标识符错误或Apple Sandbox服务器关闭时,可能会发生这种情况。然而事实并非如此,因为产品在iOS 10上运行良好。

我的产品提取实现与Apple guides

几乎相同

是否有其他人遇到此问题或找到解决方案?

当应用在物理设备上运行时,产品正在正常加载。 我正在使用Xcode 9.0。

3 个答案:

答案 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];
    }
}

答案 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];
}

答案 2 :(得分:0)

类似的问题和这个答案对我有帮助: https://stackoverflow.com/a/58065711/5525237

顺便说一句:用真机测试完全解决了问题