无法使应用内购买正常运作

5

我正在为一个应用开发内购功能,这个应用是免费的(有广告和一些被锁定的功能)。购买内购将会去除广告并提供完整的功能。

所以,我设置了一个SKProductsRequest对象,并传递了我的产品ID(com.mydomain.Myapp.fullversion),然后执行“start”方法。这没有失败,继续调用productsRequest:didReceiveResponse:方法,其中NSLog显示response.products.count等于零——出现问题了!

首先是一个愚蠢的问题。

Q1. 在我的测试设备上通过Xcode运行应用程序时,测试设备是否需要连接到互联网(例如打开无线)?或者只需运行Xcode的Mac连接到互联网即可?(已回答:测试设备需要连接)

Q2.我该怎么做才能让它工作呢?

我检查了以下所有内容:

你是否为你的App ID启用了内购功能?
在Provisioning Portal中,我有'bundle_seed_id.com.mydomain.Myapp',并且“In-App Purchase”已启用。

你是否已经清除了要销售的产品?
在iTunes Connect中,我已经创建了我的内购项目“com.mydomain.Myapp.fullversion”,并已清除要销售的产品。

你的项目的.plist Bundle ID是否与你的App ID匹配?
是的,它设置为“com.mydomain.Myapp”。

你是否已经生成并安装了新的Provisioning Profile用于新的App ID?
是的,我已经创建并安装了'com.mydomain.Myapp'的PP。

你是否已经配置了你的项目使用这个新的Provisioning Profile进行代码签名?
我只有在“Code Signing Identity”下有条目(而没有CS Entitlements、CS Resource Rules Path和Other CS Flags)。它是由Automatic Profile Selector设置的,iPhone Developer与Myapp匹配,并且设置为Debug > Any SDK和Release > Any iOS SDK。

当进行SKProductRequest时,你是否使用了完整的产品ID?
是的,我正在使用'com.mydomain.Myapp.fullversion'。

你是否等待了几个小时,以便将你的产品添加到iTunes Connect中?
是的,我已经等待了24小时。

你的银行详细信息是否在iTunes Connect上激活?
是的。

你是否尝试从设备中删除应用程序并重新安装?
多次。

这里有个观察结果:在测试设备上,我未登录“iTunes和App Store”,但当我从Xcode在测试设备上运行应用时,它没有要求我登录(我已在iTunes Connect中设置好一个测试用户并准备使用)。因此,我的应用程序运行了,调用了SKProductRequest上的start方法,但从未提示我登录“iTunes和App Store”。
非常感谢您的帮助。我希望有人能帮我使应用内购买功能正常工作。Byron。
更新1:这里提供一些代码,虽然我不确定这会有多大帮助,就像我上面说的,在productsRequest:didReceiveResponse:处失败,没有返回任何产品。
首先我调用:
[[MyappIAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *products)
     {
         if (success)
         {
             NSLog(@"SUCCESS - WE HAVE PRODUCTS");

             _products = products;

             NSLog(@"_products.count = %d", _products.count);
         }
         else
         {
             if(products == nil)
             {
                 NSLog(@"FAILED - WE HAVE NO PRODUCTS");
             }
         }
     }];

该代码如下:

- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler
{
    _completionHandler = [completionHandler copy];

    NSLog(@"IAPHelper, requestProductsWithCompletionHandler{}, _productIdentifiers = %@", [_productIdentifiers anyObject]);

    _productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers];
    _productsRequest.delegate = self;
    [_productsRequest start];

}

“start”并没有失败,而是继续调用了productsRequest:didReceiveResponse:方法。
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

{

NSLog(@"Loading list of products...");

NSLog(@"iAPHelper, productRequest:didRecieveResponse{}, Products count = %d", response.products.count);

一旦进入此函数,如果response.products.count等于零,则失败。

我刚刚向productRequest:didReceiveResponse{}中添加了以下调试代码:

for (NSString *invalidProductId in response.invalidProductIdentifiers)
{
    NSLog(@"Invalid product id: %@" , invalidProductId);
}

它指出'com.mydomain.Myapp.fullversion'是无效的。

更新2:这已经不是一个笑话了-仍然无法工作!

我完全按照http://developer.apple.com/library/ios/#technotes/tn2259/_index.html的步骤操作。我认为问题可能在于在创建应用内购买时我上传了截图-但我通过删除应用内购买、重新创建它并确保它处于“等待截图”状态来纠正了这个问题,如文档所述。我现在已经等了12个小时以上,让重新创建的应用内购买过滤通过苹果的服务器。我从我的测试设备中删除了应用程序。检查我是否注销了测试设备上的商店。重新启动我的测试设备。在Xcode中执行“清除”并重新启动Xcode。从Xcode运行应用程序,你猜怎么着?产品标识符无效!!!请帮帮我,任何人,我快要发疯了!!!


@s.bandara 很遗憾,这也不起作用。 - Byron Cox
2个回答

6

问题已解决

在向苹果公司提出技术支持请求后,代表终于找到了我的问题所在。

在iTunes Connect中查看我的应用程序时,它标明具有“Myapp”的捆绑ID。而在启用应用内购买的Provisioning Portal中的App ID为'bundle_seed_id.com.mydomain.Myapp'。并不明显,或者至少对我来说不是很明显,这个App ID由需要与iTunes Connect中的应用程序捆绑ID匹配的捆绑ID组成。

我在Provisioning Portal中创建的第一个App ID是通配符*的。当您开始创建新应用程序时,它要求您输入一个捆绑ID, 您可以从Provisioning Portal中的App IDs下拉列表中选择。如果您选择了通配符的Bundle ID,则会要求您输入Bundle ID后缀,这就是我会输入'Myapp', 然后'Myapp'变成了您的Bundle ID。有点奇怪,因为我以为那只是一个后缀。

之后(几个月后),当我决定想要实现应用内购买时,我将发现无法使用Push Notifications或应用内购买通配符App IDs。所以我随后在Provisioning Portal中创建了一个新的App ID,并按照提示输入了“建议使用反向域名样式字符串作为App ID的Bundle Identifier部分”-因此我输入了'com.mydomain.Myapp'。我不知道我为App ID创建的捆绑ID必须与先前在iTunes Connect中创建的应用程序的捆绑ID匹配。

现在我在Provisioning Portal中创建了一个名为'bundle_seed_id.Myapp'的新App ID,我的Product ID 'com.mydomain.Myapp.fullversion' 不再无效,现在似乎可以工作。


1

A1. 您需要在测试设备上建立连接。

A2. 发布一些代码。


我不知道为什么你要点踩。我回答了他的一个问题。你需要在设备上建立连接才能测试设备上的互联网,不能使用计算机的连接。请纠正。另外,为了回答问题2,我们需要看一些代码。 - Joris Weimar
@JorisWeimar 谢谢回答Q1。我提问的原因是我不确定如果您在测试设备上有一个连接,是否会尝试将您带到真正的应用商店而不是沙盒版本。 - Byron Cox
@ByronCox 请在您的问题中发布相关代码,我会查看它。 - Joris Weimar
请参见上面的更新2。已重新创建但仍无法工作。绝望。 - Byron Cox
两个选项。第一个是把你的代码发给我,我会用我的标识符替换掉你的,然后在应用商店中看看是否是代码问题(我怀疑不是)。第二个是把我的设备添加到你的配置文件中,然后把移动配置文件发给我,我会使用我的现有应用内代码来连接你的应用内购买。 - Joris Weimar
显示剩余2条评论

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