iPhone应用内购买 - response.products仍为空?

46
基本上,我尝试在测试应用程序中设置应用内购买,然后再将其实施到我们公司正在开发的正式应用程序中。我已经阅读了 Store kit pdf 和其他一些片段约 1000 次,但产品仍然被返回为空。以下是我迄今为止所做的事情:
设置测试应用程序和应用内购买测试项目 我在 iPhone Dev Centre 的公司开发者门户网站上为“Test App One”创建了一个新的应用程序 ID。我确保前缀是 com.mycompany.testappone,以确保可以配置应用内购买。在应用程序 ID 部分停留时,我通过选中“启用应用内购买”选项来配置应用内购买。
我在 iTunes Connect 中创建了“Test App One”,并完成了通常的程序,但选择了“稍后上传二进制文件”,并且没有提交审核,因为该应用程序什么都不做。我们肯定不必提交应用程序进行审核才能使其工作吧?然后,我单击管理应用内购买,并创建了一个新的产品 ID 为“test1”的产品,并批准了它,以便可以出售。
代码 我在 XCode 中设置了一个名为 TestAppOne 的新项目,现在这里是我正在使用的唯一 2 个类:
TestAppOneAppDelegate.h:
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>  

@interface TestAppOneAppDelegate : NSObject <UIApplicationDelegate, SKRequestDelegate, SKProductsRequestDelegate> {
    UIWindow *window;
}

TestAppOneDelegate.m:

#import "TestAppOneAppDelegate.h"

static NSString *kMyFeatureIdentifier1 = @"com.mycompany.testappone.test1";

@implementation TestAppOneAppDelegate
@synthesize window;

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
 if([SKPaymentQueue canMakePayments]) {
  NSLog(@"IN-APP:can make payments");
 }
 else {
  NSLog(@"IN-APP:can't make payments");
 }

 [self requestProductData];
 [window makeKeyAndVisible]; 
}

- (void)requestProductData {
 NSLog(@"IN-APP:requestProductData");
 SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject:kMyFeatureIdentifier1]];
 request.delegate = self; 
 [request start];
 NSLog(@"IN-APP:requestProductData END");  
} 

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
 NSLog(@"IN-APP:productsRequest");
 NSArray *myProduct = response.products;
 NSLog(@"IN-APP:array count: %i", [myProduct count]);
 [request autorelease];
 NSLog(@"IN-APP:productsRequest END"); 
}

- (void)dealloc {
    [window release];
    [super dealloc];
}

@end

在设备上进行测试
我创建了一个沙盒测试账号,并从iPhone上注销了我的iTunes账号,但没有像文档所告诉我们的那样,在购买阶段提示之前登录测试账号。然后我构建了应用程序,这是我得到的日志:

IN-APP:can make payments
IN-APP:requestProductData
IN-APP:requestProductData END
IN-APP:productsRequest
IN-APP:array count: 0
IN-APP:productsRequest END

请问我是否遗漏了任何步骤或者做错了什么。不幸的是,苹果并没有提供任何示例应用程序。

10个回答

34

另一个经常被忽视的重要步骤是确保你已经设置了iOS付费应用程序合同,该合同位于iTunes Connect的“Contracts, Tax, and Banking”部分。首先,你需要点击请求按钮,然后点击3个设置按钮(联系人信息、银行信息和税务信息)。


2
我是否必须添加有效的银行账户才能进行应用内购买测试? - Philipp Jahoda
1
在沙盒中,我没有启用这些功能,因此无法获取产品列表。 - hariszaman
2
将银行信息添加到iTunes账户是有效的。 - Neeraj Joshi

24

实际上,我认为您必须提交二进制文件才能使其正常工作。

您可以将发布日期设置为遥远的未来。


4
提交后立即拒绝它。不要将日期设置在未来并忘记它! - Stephen Darlington
7
谢谢。不幸的是,苹果在他们的文档中忘记了包括这个非常重要的信息,但我在阅读这篇有帮助的教程后发现了这一点:http://troybrant.net/blog/2010/01/in-app-purchases-a-full-walkthrough/。 - user218485
到了2014年,这种情况仍然存在。在新的iTC中,您只需提交新的构建,无需提交审核。 - Steven Stefanik
这个教程指出:“如果您还没有这样做,请在iTunes Connect中提交您的应用程序元数据。”我的应用程序元数据是什么?我该如何提交它? - sydd
1
在测试时不需要提交二进制文件。请确保协议、税务和银行信息的准确性。您需要提交银行详细信息。请参考https://developer.apple.com/library/content/technotes/tn2259/_index.html。 - posha

22

检查是否存在无效的产品ID。

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

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

如果有无效的产品ID,请访问http://troybrant.net/blog/2010/01/invalid-product-ids/。这是一个非常全面的检查清单。

编辑:(13/11/20) 该网站似乎已经无法访问。我不确定这是否是一个永久性问题,但您可以从archive.org查看页面: https://web.archive.org/web/20200212001158/http://troybrant.net/blog/2010/01/invalid-product-ids/


10

检查您在XCode中的捆绑标识符(例如com.company.appname)是否与iTunes Connect中的标识符匹配。

您无需提交二进制文件即可使其工作。


1
我重命名了项目,但是捆绑标识符也发生了变化(Xcode 的奇怪行为)。这导致所有产品 ID 都无效了。你的答案解决了这个问题。谢谢。 - Abdalrahman Shatou

5

只需在设备上删除应用程序,然后再从XCode重新启动即可。

这种方法对我解决了问题。

无需上传二进制文件或在iTunes Connect创建应用内购买后等待数小时。


3

感谢alpere的回答,我发现我使用了错误的产品ID。它不是我认为的de.company.appname.PROFESSIONAL_LICENSE。在我的情况下,只使用PROFESSIONAL_LICENSE(不包括前面的bundle id内容)就可以了 :)


2

在沙盒测试InAppPurchase时无需上传二进制文件。您只需要在iTunesConnect中添加InAppPurchase项目并将其放置在“准备提交”(必须)状态下即可。如果您将其提交审核,它将始终返回“product empty”的响应。


1
尝试添加一个免费订阅产品。如果它出现在响应中,则您的代码没有问题。由于免费订阅是唯一不需要协议、税收和银行业务的类型,如果它出现而其他类型没有出现,则可能与您的合同有关的问题。

1
这真的起作用了。免费的出现了,但付费的没有出现,因为合同没有签署。测试的好提示。 - gmogames

0
在我的情况下,原因是由于苹果错误地启用了内容托管。只有当我关闭它时,该产品才可用。

0
在我的情况下(MacOS),我正在创建一个测试应用程序(与主应用程序具有相同的Bundle ID)。只有在我将Bundle名称(二进制名称)设置为与原始应用程序相同时,SKFetchRequest才开始仅返回测试应用程序的产品ID。

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