在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。
答案 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
顺便说一句:用真机测试完全解决了问题