我的应用程序内购买是完美的,但如果我的iPhone不在Wi-Fi上并使用信号较慢或无信号的蜂窝连接,我会收到此消息:
由于未捕获的异常终止应用' NSInvalidArgumentException',原因:'无效的产品标识符:(null)'
在启用购买按钮之前,我应该检查互联网连接吗?我希望有更简单的方法。我只需要从StoreKit.
更新
对于我的应用内购买代码,我使用了一点点修改this guide from raywenderlich.com.您也可以下载the test project.
我的应用适用于iOS 8和7,本教程适用于iOS 6.也许这是一个问题。
我在恢复应用和(void)paymentQueue:(SKPaymentQueue *)queue
restoreCompletedTransactionsFailedWithError:(NSError *)error
案例时仅添加了SKPaymentTransactionStateDeferred
来捕获错误。
答案 0 :(得分:3)
使用didFailWithError
方法释放代理以防止崩溃:
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
{
NSLog(@"Failed to load list of products.");
_productsRequest = nil;
_completionHandler(NO, nil);
_completionHandler = nil;
request.delegate = nil; // Release the delegate
}
答案 1 :(得分:1)
为防止此次崩溃,我需要在此方法中添加一些代码,以防止用户购买。
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
{
NSLog(@"Failed to load list of products.");
_productsRequest = nil;
_completionHandler(NO, nil);
_completionHandler = nil;
}
在飞行模式下测试时,这非常有效。如果在显示应用程序内购买屏幕后关闭飞行模式并在点击购买之前打开,我们还需要一个错误处理程序。如果信号在购买时消失。
我们应该处理SKPaymentTransactionStateFailed
案例:
- (void)failedTransaction:(SKPaymentTransaction *)transaction
{
// failedTransaction
if (transaction.error.code != SKErrorPaymentCancelled)
{
NSLog(@"Transaction error: %@", transaction.error.localizedDescription);
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
// Update UI and / or post error message
}
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
当用户点击取消时,您绝对不想显示提醒。
如果成功BOOL
未成功YES.
requestProductsWithCompletionHandler:^(BOOL success, NSArray *products)