繁体   English   中英

在没有互联网连接的情况下,应用内购买崩溃的应用

[英]In-App Purchases Crashing App With No Internet Connection

我的应用内购买功能非常完美,但是如果我的iPhone不在Wi-Fi上,并且使用蜂窝连接且信号较慢或没有信号,我会收到以下消息:

由于未捕获的异常“ NSInvalidArgumentException”而终止应用程序,原因:“无效的产品标识符:(空)”

在启用“ 购买”按钮之前,我应该检查互联网连接吗? 我希望有更简单的方法。 我需要做的只是从StoreKit.捕获任何连接错误StoreKit.

更新资料

对于我的应用内购买代码,我正在对raywenderlich.com的本指南进行一些修改 您也可以下载测试项目。

我的应用程序适用于iOS 8和7,本教程适用于iOS6。也许是个问题。

我只添加了(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error用于在恢复应用程序和SKPaymentTransactionStateDeferred情况时捕获错误。

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
}

为防止崩溃,我需要在此方法内添加一些代码,以防止用户进行购买。

- (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.我也将阻止购买按钮YES.

 requestProductsWithCompletionHandler:^(BOOL success, NSArray *products)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM