代码之家  ›  专栏  ›  技术社区  ›  g.revolution

iphone:应用内购买错误

  •  4
  • g.revolution  · 技术社区  · 14 年前

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

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

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

    4 回复  |  直到 14 年前
        1
  •  13
  •   software evolved    14 年前

    好吧,这可能是冒烟的枪--

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

    我添加了代码来实现这一点,即使没有使用本地化的数据。我打了个电话,确认了物品是否存在,然后就扔了一个NSLOG。

    购买通过了,没有错误!

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

    似乎商店工具包框架被修改了,要求您调用SKProductsRequest,以便在向SKPaymentQueue添加商品时正确地进行购买。

    从计算机科学的角度讲,它们似乎在两个逻辑上相关但独立的模块之间引入了一种硬依赖关系。这是一个非常糟糕的做法。

    -(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

        2
  •  2
  •   software evolved    14 年前

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

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

    我会注意到,商店的“官方”数据流要求应用程序检索可供购买的产品列表,但我在iTunes Connect中定义了购买之后硬编码了标识符。我检查了购买ID是否有变化,结果是没有。

    为了让这更让人困惑,我从iTunes上下载了live应用程序,购买过程还算顺利。这两种情况的区别是 1其中一个是使用我的开发概要文件而不是部署概要文件构建的 2一个是在沙箱里跑而不是“真的”

    为了确保它不是一个坏的测试帐户,我刚刚创建了一个新帐户并尝试用它进行测试。没什么区别。

        3
  •  2
  •   avive    14 年前

    以下是我最近对一个新应用程序的IAPs测试的理论:

    因此,在这种情况下,即使请求IAP商店提供有效的产品id也帮不上忙。

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

    我希望这将节省一些人的时间-一直花了几个小时在这个问题上,并经历了几个应用程序拒绝,直到我发现它并开始工作。

        4
  •  0
  •   nickthedude    14 年前