iphone:应用内购买错误

时间:2010-09-22 11:11:36

标签: iphone objective-c in-app-purchase storekit

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

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

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

4 个答案:

答案 0 :(得分:13)

好的,这可能是吸烟枪 -

根据Store Kit应用程序的官方数据流,您应该在尝试购买之前检索有关可用购买的信息(SKProductsRequest)(SKPaymentQueue)。

我添加了代码来做到这一点,即使没有使用本地化数据。我打了电话,验证了该项目的存在,并且刚刚向NSLOG倾诉了它。

购买完成后,没有任何错误!

然后我删除了名为SKProductsRequest的代码,并重新运行它,并得到“付款请求受限制...”错误消息。

似乎商店套件框架的更改方式是要求您调用SKProductsRequest,以便在将tehy添加到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

答案 1 :(得分:2)

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

我甚至使用以前的版本进行测试,以确保不会对代码更改负责。这个版本正在运行,并已提交给商店。

有些东西肯定会改变,它似乎来自应用程序商店的一面!

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

为了让这更令人困惑,我从iTunes中删除了实时应用程序,购买过程很顺利。两种情况之间的差异是 1. one是使用我的开发配置文件而不是部署配置文件构建的 2.一个在沙箱中运行而不是“真实” 3.一个人使用测试账户进行购买

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

更新 - 我通过电子邮件向Apple发送了此消息,但尚未收到回复,但错误突然消失,一切都按预期开始工作了!?!

答案 2 :(得分:2)

这是我的理论,关于我最近为新应用程序测试IAP所发生的事情:

  1. 沙盒IAP环境不允许您在批准并提交审核后再测试IAP。据我所知,这是一个新的无证件行为,这给我们的iPhone SDK猴子带来了许多麻烦。在此更改之前,即使在提交Apple审核之后以及应用程序获得批准之前,您也可以拥有测试IAP。
  2. 因此,在这种情况下,即使向IAP商店申请有效的产品ID也无济于事。

    1. 看来,作为审核流程的一部分,Apple添加了以下自动化测试:使您的所有IAP无效并测试您的应用,以确保在使用IAP填充UI之前发送有效IAP ID请求。因此,如果您没有使用您的代码解决此问题,您的应用程序将被拒绝,但他们会告诉您,请求有效的ID只是建议的最佳做法,而不是必需的,但根据我的经验,它现在是必需的。
    2. 我希望这会节省一些时间 - 花费数小时的时间,并且不得不经历几次应用程序拒绝,直到我发现它并开始工作。

答案 3 :(得分:0)

你必须直接从xcode构建才能让沙箱显然正常工作。