2010-09-22 225 views
4

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

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

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

回答

13

好,这可能是确凿的证据 -

据来自商店套件应用程序的官方数据流,你应该尝试进行购买之前检索有关可用购买(SKProductsRequest)信息(SKPaymentQueue )。

我添加了代码来做到这一点,即使本地化的数据没有被使用。我打了电话,核实了这个项目是否存在,并且只是抛弃了NSLOG。

购买过程中,没有错误!

然后我删除了名为SKProductsRequest的代码,并重新运行它,并且得到了“Payment requests are restricted ...”错误消息。

它似乎像商店套件框架被改变,以便要求您打电话给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]); 

    } 
} 

后续:如下所述,苹果技术说明QA1691证实了我的想法发生的事情是正确的 - 两个星期后,我们想通了:P

+0

此外,请查看此技术说明以了解有关此严重依赖性的更多详细信息。 http://developer.apple.com/library/ios/#qa/qa2010/qa1691.html – Brandon 2010-11-17 12:37:43

2

我突然开始得到这个了!上次我测试购买代码的时间是上周末,而且它工作的很好!

我甚至使用以前的版本来测试,以确保没有代码更改负责。此版本正在工作,并已提交给商店。

有些东西肯定是改变了,它似乎是从应用程序商店的一面!

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

为了让这个更令人困惑,我把从iTunes上下载的实时应用程序拉下来,并且购买顺利。这两种情况之间的差异 1.一个用我的发展概况,而不是部署配置文件始建 2.一个在沙箱中,而不是“真实的” 3.一个用来测试帐户做购买运行

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

更新 - 我通过电子邮件向Apple发送了这封电子邮件,但未收到任何回复,但错误突然消失,所有事情都按预期工作!

+0

我们的实时应用程序仍然工作,没有软件演变的修复,但新编译的发布版本没有。所以看起来苹果决定强制执行“先检查”流程,但只限于新的应用程序。令人困惑的是,至少可以说。 – Felixyz 2010-11-21 09:23:01

2

这里是我的关于什么情况发生理论我最近测试的一个新的应用程序的IAP:

  1. 沙箱IAP env不允许你测试IAP了后,你已经批准并提交审查。这是一个新的无证行为,据我所知,这对我们的iPhone SDK猴子造成了很多麻烦。在此次更改之前,您可以在提交Apple审核并在App获得批准之前对其进行测试。

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

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

我希望这会节省一些人的时间 - 一直花费在这个小时,并不得不经过几个应用程序拒绝,直到我找出它的工作。

+0

我不认为你的理论的第一部分是正确的:我们有一个在App Store上可用的应用程序,我仍然可以使用测试用户帐户进行购买,并成功通过沙盒进行验证。 – Felixyz 2010-11-21 09:21:10

0

你必须让它直接从xcode构建,让沙箱显然工作。