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

时间:2011-10-30 21:04:42

标签: ios in-app-purchase

我正在尝试按照此处描述的技术将应用内购买添加到我的应用中:

Introduction to In-App Purchases in iOS 6 Tutorial

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

com.mycompany.myapp.myproduct1

包ID(在p列表中指定,也在应用商店中指定)设置如下:

 com.mycompany.myapp

我正在使用教程IAHelper中的助手类来处理购买功能(相关代码如下所示)。它还有一个子类,主要用于将应用内产品的ID添加到IAHelper的产品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连接中找到该产品。然而,我在那里设置了一个产品,产品的ID与包ID相同,再加上产品标识符,即

bundle id:  com.mycompany.myapp
product id: com.mycompany.myapp.product1

我已经多次检查过了。

我注意到iTunes将广告产品的状态列为“准备提交”。我需要做一个额外的步骤才能使它可用吗?

总的来说,我做错了什么?

10 个答案:

答案 0 :(得分:36)

我遇到了类似的问题。以下是从Apple阅读此technical note后需要处理/检查的一些步骤:

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

正如官方文档所述,需要提交二进制文件,既不提交应用内购买的截图。我在各种博客上看到了很多关于这方面的误导信息。

检查完您已解决此列表中的每个点后,删除您的应用并重新安装。

我基本上错过了两件事:正确设置我的ios付费应用程序合同,而我没有在我的设备上安装新的配置文件。可能那是你的问题吗?

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我在模拟器上测试应用程序时遇到同样的问题。在Device中尝试它并为我工作。

答案 3 :(得分:1)

我有同样的问题。我已填写应用购买协议,请填写您的合同,税款和银行信息,以便您拥有有效的合同。另外,我在App Store Connect(在应用程序购买中)的屏幕快照(“ App Store促销(可选)”和“查看信息,即使它说是可选的”)中添加了屏幕截图。确保“应用内购买”中的产品状态为“准备提交”。最后,我得到了产品。

答案 4 :(得分:0)

答案 5 :(得分:0)

我有类似的问题。我使用了在IAP的另一个应用程序中运行的代码,所以它应该一直在工作,但我收到了无效的产品ID错误,没有收到任何结果。原来,这是一个时间问题。我试图在返回到应用程序之前处理返回的产品,因此错误是在产品有时间加载之前终止应用程序!我的程序逻辑是:

  • 用户打开商店视图& IAP产品已加载
  • UITableView加载了产品列表(但来自本地保存的数组)
  • 用户点击表格单元格上的“购买”按钮 - 如果发生这种情况也是如此 很快,实际的产品还没有退回 - 应用程序崩溃

对我来说,答案是从退回的产品构建表格(首先应该对我很明显!)所以用户无法继续直到他们被正确加载

答案 6 :(得分: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已经可用并且它被设置为输入参数类型!对我来说看起来像个错误,我会发现一个错误。

答案 7 :(得分:0)

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

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

然后,您只需要在代码上请求支付其中一种产品,您就可以被要求进行身份验证(使用沙箱用户)并批准您在Apple TV上购买。

答案 8 :(得分:0)

如果您遵循 Apple 的文档,您可能会和我在同一条船上。如果您要设置沙盒测试,则需要确保未设置 .storekit 文件。 Apple 的文档与此有关,它确实要求您在“在 Xcode 中启用 StoreKit 测试”部分下执行此操作

按照这些说明进行操作,但确保将 StoreKit 配置设置为无

来源:https://developer.apple.com/documentation/xcode/setting_up_storekit_testing_in_xcode#3625696

答案 9 :(得分:-1)

我想我可能找到了答案here

应用内购买网页中的这一措辞引导我:

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.