SKPaymentQueue addPayment并不总是触发本机确认对话框

时间:2013-09-19 11:51:05

标签: c++ ios objective-c in-app-purchase cocos2d-x

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

背景

该应用程序使用cocos2dx和javascript绑定进行交叉平台化。我们正在进入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和其他地方阅读时,人们建议changing test usersclearing the queue[[SKPaymentQueue defaultQueue] finishTransaction:transaction],Apple的Sandbox服务器有时“有问题”。但这一切都没有解决它,并且让我感到奇怪的是我没有遇到崩溃或错误,它只是对某些产品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];
// } );
}

如果有任何其他可能有用的代码,请告诉我。

感谢您的帮助。

修改 我添加了this问题的hasAddObserver支票,这也不是问题。

1 个答案:

答案 0 :(得分:1)

原来这是暂时的。我不想指责Apple的沙盒服务器是不稳定的,但没有任何改变,几天后它突然发挥作用。

所以,如果你有类似的问题,可以休息一下,稍后再回来?