应用内购买需要很长时间才能显示确认警报视图

我遇到了以下问题:当我的应用程序在设备上运行并点击“购买”按钮时,会触发应用内购买机制,最多需要十秒钟才能显示标准确认UIAlertView ,其中显示:“你想要吗?”买…“。 我以前从未见过这样的行为。 通常它会立即发生。 所以首先我认为这可能是由于互联网连接不良或类似的情况,但模拟器使用相同的WiFi网络,它运行良好,警报视图立即呈现应有的。 所以这个问题可能就在其他地方。 有没有人解决这个问题?

这是按钮点击:

 - (void)buyItemTapped:(id)sender { [[InAppPurchaseManager sharedInstance] buy:[NSString stringWithFormat:@"com.mycompany.myapp.unit%d", [sender tag] + 1]]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(transactionFailed) name:TRANSACTION_FAILED_NOTIFICATION object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(productPurchased:) name:PRODUCT_PURCHASED_NOTIFICATION object:nil]; } 

购买方式:

 - (void)buy:(NSString *)identifier { SKProduct *product = [self.products objectForKey:identifier]; if (product) [self purchaseProduct:product]; else { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Invalid Product Identifier" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } } 

purchaseProduct方法:

 - (void)purchaseProduct:(SKProduct *)product { if ([SKPaymentQueue canMakePayments]) { SKPayment *payment = [SKPayment paymentWithProduct:product]; [[SKPaymentQueue defaultQueue] addPayment:payment]; } else NSLog(@"Cannot make purchase"); } 

这应该与实际用户尝试购买时没有任何关系,这是因为您在沙盒环境中运行应用程序,如果您使用模拟器,这将使其更慢。 此外,即使实际用户确实进行购买,手机也必须连接到苹果服务器,通过它的ID找到数百万其他人的IAP,确保信息匹配,使用加密将此信息安全地发送回手机,然后手机必须检查加密是否与成功消息匹配,然后将成功发送回用户。 正如您所看到的,在发送确认消息之前有一点时间是正常的。

我建议在SKPaymentTransactionStatePurchasing方法中添加一个加载屏幕,告诉用户您实际上是在获取信息。 再一次,这是你所看到的100%正常,Apple必须做很多检查,并在发回确认信息之前validation很多东西。 希望这可以帮助!

你在沙盒环境中吗? 如果是这样,那是正常的情况。我在中国,当我在设备上测试IAP时,它总是需要10秒以上。我认为这不是你的技术问题。请自己。:)

原因可能是,您处于沙盒环境中,偶尔会出现打嗝。 或者你的应用程序在执行购买时可能会做一些繁重的工作,这会降低设备速度(但在更强大的模拟器上运行速度很快)。