【问题标题】:In-App Purchases Crashing App With No Internet Connection应用程序内购买崩溃的应用程序没有互联网连接
【发布时间】:2014-10-17 22:24:43
【问题描述】:

我的应用内购买完美无缺,但如果我的 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 案例。

【问题讨论】:

  • 您应该修复您发布的错误的原因。您的代码似乎没有进行正确的结果检查。无论您是否进行适当的“可达性”检查,都应该这样做。
  • @rmaddy 我用源代码链接更新了问题。感谢您的评论。
  • 您无需要求人们下载、构建和测试您的应用,只需在您的问题中发布相关代码即可。相关代码是实际导致崩溃的代码。

标签: ios in-app-purchase storekit


【解决方案1】:

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
}

【讨论】:

  • 谢谢!我理解你的意思吗,释放委托会杀死损坏的 SKRequest 实例?
【解决方案2】:

为了防止这种崩溃,我需要在这个方法中添加一些代码来阻止用户进行购买。

- (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)

【讨论】:

    猜你喜欢
    • 2016-06-09
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多