iOS 应用内购买 - 未收到任何产品
Posted
技术标签:
【中文标题】iOS 应用内购买 - 未收到任何产品【英文标题】:iOS in app purchase - no products received 【发布时间】:2011-10-30 21:04:42 【问题描述】:我正在尝试按照此处描述的技术将应用内购买添加到我的应用中:
Introduction to In-App Purchases in ios 6 Tutorial
我通过 itunes connect 添加了一个产品,它的 id 设置如下:
com.mycompany.myapp.myproduct1
bundle id(在 p-list 和应用商店中指定)设置如下:
com.mycompany.myapp
我正在使用教程中的帮助程序类 IAHelper 来处理购买功能(相关代码如下所示)。它还有一个子类,主要用于将应用内产品的 id 添加到 IAHelper 的产品 id 数组中。
为了测试代码,我创建了一个标有“显示产品”的按钮,它调用了这个方法:
- (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 与 bundle id 相同,加上产品标识符,即
bundle id: com.mycompany.myapp
product id: com.mycompany.myapp.product1
我已经检查了好几次了。
我注意到 iTunes 将插件产品的状态列为“准备提交”。我需要采取额外的步骤才能使其可用吗?
总的来说,我做错了什么?
【问题讨论】:
我有同样的问题,在我的情况下,catch 和 then 部分都在执行,不知道为什么。我在模拟器中测试。在真实设备中进行测试按预期工作 【参考方案1】:我遇到了完全相同的问题。在阅读 Apple 的 technical note 后,需要解决/检查以下一些步骤:
创建唯一的应用 ID 为此应用 ID 启用应用内购买 在您的设备上生成并安装新的配置文件 在 Xcode 中更新包 ID 和代码签名配置文件 检查您项目的 .plist Bundle ID 是否与您的 App ID 匹配 填写您的合同、税务和银行信息。您需要一份有效的合同正如官方文档所述,没有需要提交二进制文件,也不需要提交应用内购买的屏幕截图。我在各种博客上看到了很多关于此的误导性信息。
检查您已解决此列表中的每个问题后,删除您的应用并重新安装。
我基本上错过了两件事:正确设置我的 ios 付费应用合同,并且我没有在我的设备上安装新的配置文件。这可能是你的问题吗?
【讨论】:
有效合同。那是我的问题... :( 从这个列表中获得了所有内容,以及其他讨论中的更多内容。我以为这是我的配置文件,但在与证书地狱战斗后,结果相同...... 我目前正在尝试进行沙盒测试,这对于合同、税收和银行信息是否有效。我目前的状态待定... 希望他们解雇那些认为“在测试 IAP 之前有有效合同”的蠢驴。 @JPillanes 不用担心。对于任何阅读本文的人来说,不管它有什么价值,我实际上昨天解决了我的问题(最终与协议/合同无关),所以“活动”至少在某种程度上表示“有效合同”。【参考方案2】:productsRequest:didReceiveResponse 中没有返回有效产品是一个众所周知的问题。原因有很多,其中一些在 TN2259 中给出,尤其是 FAQ#6。通常问题是应用程序没有将自己指向沙盒。这通常是因为开发人员没有按顺序做这三件事: 1)删除应用程序的旧版本(删除,而不是覆盖) 2)使用设置应用程序退出设备上的应用程序商店 3) 在设备(不是模拟器)上从 Xcode 运行应用,并仅在应用商店询问时使用测试用户登录商店。
【讨论】:
【参考方案3】:我在模拟器上测试应用程序时遇到了同样的问题。在设备中尝试它并为我工作。
【讨论】:
【参考方案4】:我遇到了同样的问题。我填写了应用内购买协议,填写了您的合同、税务和银行信息,以便您拥有有效的合同。我还在 App Store Connect(在应用程序购买中)的部分(App Store Promotion(可选)和评论信息,即使它说是可选的)添加了屏幕截图。确保您在应用内购买中的产品具有“准备提交”状态。终于在那之后我得到了产品。
【讨论】:
【参考方案5】:如果您在模拟器上进行测试,请按照此链接上的步骤操作: https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/DevelopingwithStoreKit/DevelopingwithStoreKit.html#//apple_ref/doc/uid/TP40008267-CH103-SW1
【讨论】:
此链接已损坏【参考方案6】:我遇到了类似的问题。我使用了在另一个 IAP 应用程序中运行的代码,所以它应该可以运行,但是我收到了 Invalid Product ID 错误并且没有收到任何结果。原来这是一个时间问题。我试图在退回的产品返回应用程序之前对其进行处理,因此错误是在产品有时间加载之前终止应用程序!我的程序逻辑是:
用户打开商店视图并加载 IAP 产品 UITableView 加载了产品列表(但来自本地保存的数组) 用户单击表格单元格上的购买按钮 - 如果这种情况也发生 很快,实际产品尚未退回 - 应用崩溃对我来说,答案是根据退回的产品构建表格(首先对我来说应该很明显!)所以用户在正确加载之前无法继续
【讨论】:
【参考方案7】:同样错误的 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 已经可用并且它被设置为输入参数类型!对我来说看起来像一个错误,我会触发一个错误。
【讨论】:
【参考方案8】:我们在尝试在模拟器上运行它时遇到了同样的问题。
在真正的 Apple TV 设备(通过 USB 连接)上试用后,我们开始获得有效的产品 ID。
那么您只需要在您的代码上请求支付其中一种产品的费用,并且您应该能够被要求进行身份验证(使用沙盒用户)并批准您在 Apple TV 上的购买。
【讨论】:
【参考方案9】:如果您遵循 Apple 的文档,您最终可能会和我在同一条船上。如果您要设置沙盒测试,则需要确保未设置 .storekit
文件。 Apple 的文档与此有关,它确实要求您在“在 Xcode 中启用 StoreKit 测试”部分下执行此操作
按照这些说明操作,但确保将 StoreKit 配置设置为无
来源:https://developer.apple.com/documentation/xcode/setting_up_storekit_testing_in_xcode#3625696
【讨论】:
【参考方案10】:我想我可能已经找到了答案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.
当您尚未测试应用内购买代码时,您可以采取什么措施来绕过不想提交应用以供审核的第 22 条规定:将其提交以供审核,然后立即自行拒绝.这使其处于“开发者被拒绝”的状态。
比你可以添加你的产品,根据博客,
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.
【讨论】:
您提到的博客中的此声明已过时或不正确。正如官方文档所述:developer.apple.com/library/ios/#technotes/tn2259/_index.html:测试应用内购买不需要上传二进制文件。 技术说明甚至说你不应该上传二进制文件。如果被拒绝,或者开发者被拒绝,你需要有一个应用批准才能再次测试!以上是关于iOS 应用内购买 - 未收到任何产品的主要内容,如果未能解决你的问题,请参考以下文章
Apple 订阅或应用内购买在商店版本中不起作用 - 应用内产品详细信息未显示或获取