在iOS 11模拟器中,SKProductsRequest无法工作。

10

在iOS模拟器中购买是众所周知的"不可行"。但是,在iOS 11之前提供产品标识符给SKProductsRequest以检索SKProduct信息是有效的。

SKProductsRequestDelegate中,我遇到了以下错误:Error Domain=SSErrorDomain Code=0 "Cannot connect to iTunes Store"。 根据我的发现,这可能是由于产品标识符错误或Apple Sandbox服务器宕机造成的。但是,既然在iOS 10上产品正常加载,那么这不是问题的原因。

我的产品获取实现基本与Apple指南中一样。

有没有其他人遇到这个问题或找到解决方案?

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

3个回答

5

我也有同样的问题。如果请求失败,只需再次尝试即可。在第N次重复后,它最终会返回产品。可能需要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,并很快得到了回复,告诉我看起来像是一个bug(至少他们没有说自iOS 11以来你不能在模拟器中获取产品) 所以我向他们发送了Bug报告。让我们希望他们能尽快修复这个问题。 :) - emn.mun
是的,它将不断重试。为了防止这种情况发生,当然可以使用计数器来设置一个限制,例如在最后一个方法中插入类似于 if (count == 200) return; 的代码。 - vilmoskörte
1
遇到了相同的问题。似乎与请求数量无关。总之,它似乎根本不起作用。这导致我所有订阅的单元测试都失败了。很不好玩。有人得到任何关于是否正在解决此问题的反馈吗? - Bill Burgess
2
已经向一位苹果工程师确认,这是他们正在研究的问题。好消息是他们正在着手解决,希望能够修复。坏消息是,他们表示模拟器中本来就不应该/不会工作,之前能够工作已经很不错了。所以...是的。 - Bill Burgess
我的经验是,在请求重复几次后,有时甚至在请求重复很多次后,productsRequest:request didReceiveResponse:最终会被调用。 - vilmoskörte

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接