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