SKPayment队列添加付款并不总是触发本机确认对话框

SKPaymentQueue addPayment doesn't always trigger native confirm dialog

本文关键字:本机 确认 对话框 添加 队列 付款 SKPayment      更新时间:2023-10-16

好的,我正在将IAP实施到iOS应用程序中,只有商店中的某些产品实际上触发了本机购买处理对话框。

背景:

该应用程序使用带有javascript绑定的cocos2dx来实现跨平台性。我们正在涉足iOS原生领域,以实现商店处理。

这些调用都正常工作:

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[SKPaymentQueue canMakePayments];
[[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];

最后一个注释。所有产品 ID 都会被检查并在productsRequest:request didReceiveResponse:response回调中返回为有效,但前提是我没有在发送的标识符中包含捆绑 ID。我看到的大多数例子都说这是必需的,但如果包括这些例子,它们都返回为invalidProductIdentifiers。这是否表明存在问题?

因此,目前某些产品在其(先前验证的)ID传递给[[SKPaymentQueue defaultQueue] addPayment:payment]后会显示本机购买确认对话框。他们中的大多数人事后什么都不做。没有回调paymentQueue:queue updatedTransactions:transactions,没有错误代码,没有崩溃。

我看不出为什么有些有效而大多数人不工作的模式。至少有一个消耗品,非消耗品和订阅工作,所以我不认为是这样。我发现,如果我在[[SKPaymentQueue defaultQueue] addPayment:payment]后中断并逐步完成代码暂停,则一些产品工作的频率很小,尽管它并不一致。这让我认为这可能是一个线程问题,但您可以在下面看到我尝试过的内容,但没有帮助。

我尝试过的事情:

在SO和其他地方阅读,人们建议更改测试用户,用[[SKPaymentQueue defaultQueue] finishTransaction:transaction]清除队列,并且Apple的沙盒服务器有时会"出现问题"。但是这些都没有解决它,而且让我感到奇怪的是,我没有遇到崩溃或错误,它只是对某些产品ID根本没有反应。

这是我尝试过的一些事情的实际通话:

- (void)purchaseProductWithId:(const char*)item_code
{
   /** OCCASIONALLY MAY NEED TO CLEAR THE QUEUE **
   NSArray *transactions = [[SKPaymentQueue defaultQueue] transactions];
   for(id transaction in transactions){
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
   }// */
// dispatch_async(dispatch_get_main_queue(),^ {
      SKPayment *payment = [SKPayment paymentWithProductIdentifier:[NSString stringWithUTF8String:item_code]];
//    [[SKPaymentQueue defaultQueue] performSelectorOnMainThread:@selector(addPayment:) withObject:payment waitUntilDone:NO];
      [[SKPaymentQueue defaultQueue] addPayment:payment];
// } );
}

如果还有其他有用的代码,请告诉我。

感谢您的帮助。

编辑:我已经从这个问题中添加了hasAddObserver检查,这也不是问题。

原来这是暂时的。我不想指责苹果的沙盒服务器是片状的,但什么都没有改变,然后几天后它突然起作用了。

因此,如果您有类似的问题,请休息一下,稍后再回来?