尝试使用iAP购买时,应用程序崩溃并在Xcode中显示。 我从某人那里购买了这个代码,但没有其他人抱怨评论页面上的iAP错误,我可以发誓我测试过它之前工作正常。我甚至尝试了新鲜的项目,它仍然在崩溃。我只是编码的初学者,所以我可以做基本的事情,但请具体,我很欣赏它。我不认为它与条款配置文件或证书有任何关系导致其在代码中的权利。也有一段时间,可能听起来很愚蠢,但是在iTunes中连接相同的捆绑ID和iAP信息是否需要配置?我已经尝试了所有设置,它仍然没有工作。无论如何,代码不应该崩溃。请看一下,我会发布截图和代码。
我的AppController.mm中与iAP有关的大部分代码都在这里:(对不起,不知道为什么它在代码格式中拼凑它怪...我只是复制和粘贴。所以我只是#m; m要把错误部分放在一起)
- (void) openRestore:(NSObject*)prms
{
[[SKPaymentQueue defaultQueue]restoreCompletedTransactions];
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
NSArray *myProduct = response.products;
NSLog(@"%@",[[myProduct objectAtIndex:0] productIdentifier]);
SKPayment *newPayment = [SKPayment paymentWithProduct:[myProduct objectAtIndex:0]];
[[SKPaymentQueue defaultQueue] addPayment:newPayment];
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
[self failedTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
default:
break;
}
}
}
答案 0 :(得分:0)
根据您发布的屏幕截图,会发生以下情况:您的应用从服务器请求产品列表。服务器通过说没有产品(即空数组)来响应。然后,应用程序尝试将有关阵列中第一个产品的信息打印到控制台(即索引为“0”的产品)。由于空数组中没有索引0,因此它会在索引超出范围异常时崩溃。
因为你的代码强烈期望总是至少返回一个产品(这似乎不是一个很好的设计选择,但这是另一个观点),它似乎很可能直接原因此特定崩溃背后的原因是此应用程序没有正确设置iAP。您的iAP处理代码没有看到期望看到的内容。
我建议为您提供documentation如何create和test应用内购买产品。
编辑(在评论中回答Zach的请求):
好吧,让应用不会在这个特定的地方崩溃很容易,但就像我说的那样,如果没有正确设置,那就不会让应用内购买本身有效。< / p>
为了防止您发布的代码崩溃,您可以添加明确检查产品数组是否为空,如下所示:
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
NSArray *myProduct = response.products;
if (myProduct.count > 0) {
NSLog(@"%@",[[myProduct objectAtIndex:0] productIdentifier]);
SKPayment *newPayment = [SKPayment paymentWithProduct:[myProduct objectAtIndex:0]];
[[SKPaymentQueue defaultQueue] addPayment:newPayment];
}
}