4

我正在开发一个应用程序并在其中使用应用内购买。我在 iTunes Connect 中创建了应用内产品。直到昨天一切正常。但今天。它开始给出这个错误。

“错误:付款请求仅限于通过 Store Kit 的 didRecieveResponse 方法返回为有效的产品。”

我不知道是什么问题。请回复

4

4 回答 4

13

好吧,这可能是确凿的证据——

根据 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

于 2010-09-22T23:33:54.187 回答
2

我也突然开始得到这个!我最后一次测试购买代码是在上周末,当时它工作正常!

我什至使用以前的版本进行测试,以确保没有代码更改负责。此版本正在运行,并已提交到商店。

某些东西肯定发生了变化,而且似乎来自应用商店方面!

我会注意到商店的“官方”数据流要求应用程序检索可供购买的产品列表,但我改为在 iTunes Connect 中定义购买后对标识符进行硬编码。我检查了购买 ID 是否已更改,答案是没有。

为了让这更令人困惑,我从 iTunes 中删除了实时应用程序构建,并且购买顺利进行。这两种场景的区别是 1. 一种是使用我的开发配置文件而不是部署配置文件构建的 2. 一种在沙箱中运行而不是“真实” 3. 一种使用测试帐户进行购买

为了确保它不是一个糟糕的测试帐户,我刚刚创建了一个新帐户并尝试使用它进行测试。它没有任何区别。

更新——我就此向 Apple 发送了电子邮件,但(尚未)收到任何回复,但错误突然消失了,一切都开始按预期工作!?!

于 2010-09-22T19:55:35.257 回答
2

这是我最近对新应用的 IAP 测试所发生的情况的理论:

  1. 沙盒 IAP 环境在您批准并提交审核后不再允许您测试 IAP。据我所知,这是一种新的无证行为,这让我们的 iPhone SDK 猴子很头疼。在此更改之前,即使在提交 IAP 以供 Apple 审核之后且在应用程序获得批准之前,您也可以测试 IAP。

因此,在这种情况下,即使向 IAP 商店请求有效的产品 ID 也无济于事。

  1. 看来,作为审查过程的一部分,Apple 添加了以下自动化测试:使您的所有 IAP 无效并测试您的应用程序,以确保您在使用 IAP 填充 UI 之前发送有效 IAP ID 的请求。因此,如果您不使用代码解决此问题,您的应用程序将被拒绝,但他们会告诉您,请求有效 ID 只是推荐的最佳实践,而不是必需的,但根据我的经验,现在是必需的。

我希望这可以节省一些时间 - 在这方面花费了几个小时并且不得不经历几个应用程序拒绝,直到我弄清楚并开始工作。

于 2010-10-10T19:42:42.340 回答
0

您必须直接从 xcode 构建它才能让沙箱现在显然可以工作。

于 2010-12-31T01:18:44.983 回答