我正在开发一个应用程序并在其中使用应用内购买。我在 iTunes Connect 中创建了应用内产品。直到昨天一切正常。但今天。它开始给出这个错误。
“错误:付款请求仅限于通过 Store Kit 的 didRecieveResponse 方法返回为有效的产品。”
我不知道是什么问题。请回复
我正在开发一个应用程序并在其中使用应用内购买。我在 iTunes Connect 中创建了应用内产品。直到昨天一切正常。但今天。它开始给出这个错误。
“错误:付款请求仅限于通过 Store Kit 的 didRecieveResponse 方法返回为有效的产品。”
我不知道是什么问题。请回复
好吧,这可能是确凿的证据——
根据 Store Kit 应用程序的官方数据流,您应该在尝试购买 (SKPaymentQueue) 之前检索有关可用购买的信息 (SKProductsRequest)。
我添加了代码来做到这一点,即使没有使用本地化数据。我打了电话,验证了该项目是否存在,然后转储了一个关于它的 NSLOG。
购买成功,没有错误!
然后我删除了调用 SKProductsRequest 的代码,并重新运行它,并得到“付款请求受到限制......”错误消息。
似乎商店工具包框架已更改为要求您调用 SKProductsRequest,以便在将它们添加到 SKPaymentQueue 时购买行为正确。
在计算机科学方面,它们似乎在两个逻辑相关但独立的模块之间引入了硬依赖。这是一个非常糟糕的做法。
尝试将此代码添加到您的应用程序中,并在对 SKPaymentQueue 进行“真实”调用之前的某个时间调用 dumpProductInfo 并查看它是否开始工作——确保使用您的实际产品标识符更新嵌入的字符串文字。
-(void) dumpProductInfo
{
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"com.company.domain.app.purchase"]];
request.delegate = self;
[request start];
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
NSArray *myProduct = response.products;
// populate UI
NSLog(@"Products:");
for (int i = 0; i < [myProduct count]; i++)
{
SKProduct *product = [myProduct objectAtIndex:i];
NSLog(@"Name: %@ - Price: %f ID: %@" ,
[product localizedTitle],
[[product price] doubleValue],
[product productIdentifier]);
}
}
跟进:如下所述,Apple 技术说明 QA1691 确认我认为发生的事情是正确的——在我们弄清楚两周后:p
我也突然开始得到这个!我最后一次测试购买代码是在上周末,当时它工作正常!
我什至使用以前的版本进行测试,以确保没有代码更改负责。此版本正在运行,并已提交到商店。
某些东西肯定发生了变化,而且似乎来自应用商店方面!
我会注意到商店的“官方”数据流要求应用程序检索可供购买的产品列表,但我改为在 iTunes Connect 中定义购买后对标识符进行硬编码。我检查了购买 ID 是否已更改,答案是没有。
为了让这更令人困惑,我从 iTunes 中删除了实时应用程序构建,并且购买顺利进行。这两种场景的区别是 1. 一种是使用我的开发配置文件而不是部署配置文件构建的 2. 一种在沙箱中运行而不是“真实” 3. 一种使用测试帐户进行购买
为了确保它不是一个糟糕的测试帐户,我刚刚创建了一个新帐户并尝试使用它进行测试。它没有任何区别。
更新——我就此向 Apple 发送了电子邮件,但(尚未)收到任何回复,但错误突然消失了,一切都开始按预期工作!?!
这是我最近对新应用的 IAP 测试所发生的情况的理论:
因此,在这种情况下,即使向 IAP 商店请求有效的产品 ID 也无济于事。
我希望这可以节省一些时间 - 在这方面花费了几个小时并且不得不经历几个应用程序拒绝,直到我弄清楚并开始工作。
您必须直接从 xcode 构建它才能让沙箱现在显然可以工作。