我正在为一个应用开发内购功能,这个应用是免费的(有广告和一些被锁定的功能)。购买内购将会去除广告并提供完整的功能。
所以,我设置了一个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上激活?
是的。
你是否尝试从设备中删除应用程序并重新安装?
多次。
非常感谢您的帮助。我希望有人能帮我使应用内购买功能正常工作。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运行应用程序,你猜怎么着?产品标识符无效!!!请帮帮我,任何人,我快要发疯了!!!