iOS应用内购买 - 未收到任何产品

20

我试图为我的应用程序添加应用内购买功能,遵循这里描述的技术:

iOS 6 应用内购买介绍教程

我已通过itunes connect添加了一个产品,其ID设置如下:

com.mycompany.myapp.myproduct1

Bundle id指定了应用程序的唯一标识符,可以在应用程序的p-list文件和应用商店中找到。它的格式如下:

 com.mycompany.myapp

我正在使用教程中的帮助类IAHelper来处理购买功能(相关代码如下所示)。它还有一个子类,主要用于向IAHelper的产品ID数组添加应用内产品的ID。

为了测试代码,我创建了一个名为“show products”的按钮,调用这个方法:

- (IBAction) showProducts {

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(productsLoaded:) name:kProductsLoadedNotification object:nil];

    Reachability *reach = [Reachability reachabilityForInternetConnection]; 
    NetworkStatus netStatus = [reach currentReachabilityStatus];    
    if (netStatus == NotReachable) {        
        NSLog(@"No internet connection!");        
    } else {        
        if ([InAppMyAppAPHelper sharedHelper].products == nil) {


            // here's where it calls the helper class method to request the products
            [[InAppMyAppAPHelper sharedHelper] requestProducts];

            self.hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
            _hud.labelText = @"Loading vocabulary...";
            [self performSelector:@selector(timeout:) withObject:nil afterDelay:30.0];

        }        
    }

}

这是从iTunesConnect请求产品的方法,如上所述:

- (void)requestProducts {

    self.request = [[[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers] autorelease];
    _request.delegate = self;
    [_request start];

}

(请注意,以“_”为前缀的变量是指在多个合成语句中去掉下划线后与同名的实际变量)

最后,在IAHelper中接收到响应时会调用以下方法:

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

    NSLog(@"IAHelper, received products results...");   

    self.products = response.products;
    self.request = nil;    

    // Here's the loop to list the products received
    for (id product in _products){
        NSLog(@"IAHelper, received product is: %@", product); 
    }


    [[NSNotificationCenter defaultCenter] postNotificationName:kProductsLoadedNotification object:_products];    
}
在上述代码中,日志语句显示方法已被调用,但打印接收到的产品的循环没有列出任何内容。
因此看起来它没有在iTunes Connect中找到产品。然而,我已经在那里设置了一个产品,并且产品的ID与包ID相同,再加上产品标识符。
bundle id:  com.mycompany.myapp
product id: com.mycompany.myapp.product1

我已经检查了好几次。

我注意到iTunes将广告插件产品的状态列为“准备提交”。 我是否需要额外采取步骤使其可用?

总体而言,我做错了什么?


我遇到了同样的问题,在我的情况下,捕获和then部分都在执行,不知道为什么。我是在模拟器中测试的。在真实设备上测试可以正常工作。 - Khim Bahadur Gurung
10个回答

49

我遇到了完全相同的问题。阅读了苹果公司的技术说明后,以下是需要注意/检查的步骤:

  • 创建唯一的App ID
  • 为该App ID启用应用内购买
  • 在您的设备上生成并安装一个新的配置文件
  • 在Xcode中更新包标识符和代码签名配置文件
  • 检查项目的.plist包标识符是否与您的App ID匹配
  • 完成合同、税务和银行信息。您需要一个有效的合同

正如官方文档所述,不需要提交二进制文件或应用内购买截图。我看到很多博客对此有误导性的信息。

在检查了列表中的每个点之后,删除您的应用并重新安装它。

基本上,我在我的应用程序中缺少了两件事情:为iOS付费应用程序正确设置合同,并且没有在我的设备上安装新的配置文件。也许这就是您的问题?


8
有效合同。这就是我的问题… :( - JP Illanes
从这个列表中制作了所有内容,以及从其他讨论中获得了更多内容。我以为是我的配置文件的问题,但在与证书问题斗争后,结果仍然相同... - Dima Deplov
1
我目前正在尝试进行沙盒测试,这对于合同、税务和银行信息的有效性是否是必需的?我的当前状态是待定... - Rajesh
6
希望他们解雇那个认为“在测试应用内购买前需要有效合同”的蠢货。 - elemento
1
@JPIllanes 没问题,无论读到这个信息的人是否有所帮助,我昨天已经解决了我的问题(最后与协议/合同无关),因此“Active”可能表示“有效合同”。 - twiz
显示剩余3条评论

2
在productsRequest:didReceiveResponse中没有返回有效产品是一个众所周知的问题。有很多原因,其中一些在TN2259中特别是FAQ#6中给出。通常问题是应用程序没有指向沙盒。这通常是因为开发人员没有按顺序执行以下3个步骤: 1)删除应用程序的旧版本(删除,而不是覆盖) 2)使用设置应用程序从设备上的应用商店注销 3)从Xcode在设备上运行应用程序(而不是模拟器),并仅在应用商店要求时使用测试用户登录。

1

当我在模拟器上测试应用程序时,遇到了同样的问题。但是在设备上尝试后,它对我有效。


1
我遇到了同样的问题。我填写了应用内购买协议,完成了合同、税务和银行信息,以便您拥有有效的合同。此外,我在 App Store Connect(应用内购买)的“应用商店推广(可选)”和“审核信息”部分添加了截屏,即使它说是可选的。确保您的应用内购买产品状态为“准备提交”。最后,我得到了产品。

0

我曾经遇到过类似的问题。我使用了在另一个应用程序中可用的IAP代码,因此它应该可以工作,但是我一直收到“无效的产品ID”错误并且没有结果返回。原来这是一个时间问题。我试图在返回产品之前处理返回的产品,因此错误会在产品加载完成之前终止应用程序!我的程序逻辑是:

  • 用户打开商店视图并加载IAP产品
  • 使用UITableView从本地数组中加载产品列表
  • 如果用户太快点击表格单元格上的购买按钮,则实际产品尚未返回-应用程序崩溃

对我来说,答案是从返回的产品构建表格(这应该是我一开始就能想到的!),以便用户在正确加载后才能继续。


0

此链接已损坏。 - Reinhard Männer

0

我们曾经遇到了同样的问题,试图在模拟器上运行它时卡住了一段时间。

在真正的Apple TV设备上尝试后(通过USB连接),我们开始获得有效的产品ID。

然后,您只需要在代码中请求其中一个产品的付款,您应该能够被要求使用沙盒用户进行身份验证并批准您在Apple TV上的购买。


0

0

针对具有相同错误的Swift项目的答案:

我的错误在这里:

//identifiers: [String]
let productIDs = Set(arrayLiteral: identifiers) as Set<NSObject>!
let request = SKProductsRequest(productIdentifiers: productIDs)

但是这段代码会导致错误,错误代码为0,消息为无法连接到iTunes Store。 让我们看一下SKProductsRequest输入参数类型:

SKProductsRequest(productIdentifiers: Set<NSObject>!)

所以,上面的代码看起来很正常。但实际上不是这样的!Swift的Set是问题所在,因为在输入参数中我们看到了Swift Set!

在迭代一些IAP课程时找到了答案。以下是可行的代码:

let productIDs = NSSet(array: identifiers)
let request = SKProductsRequest(productIdentifiers: productIDs as! Set<NSObject>)

目前你必须使用NSSet,尽管Swift的Set已经可用并且被设置为输入参数类型!看起来对我来说是个错误,我会提交一个bug报告。


-1

我想我可能已经在这里找到了答案。

应用内购买网页上的这段措辞引导我找到了它:

The first In-App Purchase for an app must be submitted for review at the same time that you submit an app version. You must do this on the Version Details page. Once your binary has been uploaded and your first In-App Purchase has been submitted for review, additional In-App Purchases can be submitted using the table below.

如果您不想在测试应用内购买代码之前提交应用进行审核,那么可以采取的方法是先提交应用进行审核,然后立即自行拒绝。这将使其状态变为“开发者已拒绝”。

然后您就可以添加您的产品了。根据博客所述,

After saving the product, just choose the “Submit with app binary” option. This will tie the product to the app binary, so when you finally submit the 100% complete app binary, the product will be submitted as well.

4
该博客中提到的声明已经过时或不正确。根据官方文档http://developer.apple.com/library/ios/#technotes/tn2259/_index.html所述,测试应用内购买不需要上传二进制文件。 - tiguero
技术说明甚至指出您不应上传二进制文件。如果被拒绝或开发人员拒绝,则需要先获得应用程序批准才能再次进行测试!! - Joris van Liempd iDeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接