4

好的,我正在将 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问题的检查,这也不是问题。

4

1 回答 1

1

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

因此,如果您有类似的问题,也许可以休息一下,稍后再回来解决?

于 2014-01-22T18:05:00.720 回答