我们的应用程序有一个锁定产品列表,这些产品共享相同的耗材产品ID(即许多产品的一个耗材产品ID)。我们的服务器向我提供了产品列表以及与之关联的产品ID:
item name =“itemA”iphoneProductId =“consumable.test.1”
item name =“itemB”iphoneProductId =“consumable.test.1”
item name =“itemC”iphoneProductId =“consumable.test.1”
我们之所以选择耗材,是因为我们的产品是动态创建的,需要立即供用户使用(请不要回复,建议我们使用非耗材,如果没有我,还有很多其他原因难以解释泄露有关我们正在使用的公司的私人信息,以及我们使用消耗品的原因。这使我们可以让多个产品共享相同的价格。
当用户购买itemA(例如)时,该项目被解锁。但是,有时,当用户尝试成为itemB时,Apple会返回“您已经购买过此内容但尚未下载的内容”。点按确定立即下载'。消费品肯定不会发生这种情况。我知道我们的系统非常复杂,但就苹果商店套件而言,只是再次购买相同的产品。
这可能只是沙盒问题吗?由于应用程序尚未发布,我们无法进行实时测试。事实上,由于我们的客户关注这个问题,所以这整个问题暂缓了发布。
我已经按照iphone文档中的相同代码和少数应用内购买教程进行了操作。我看到论坛上的很多人似乎已经目睹了上面“已购买”的消费品产品对话,但没有一个能得到回应。
请帮忙!感谢
答案 0 :(得分:7)
问题是你永远不会完成交易。您需要将其从队列中删除。
像:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
答案 1 :(得分:1)
我假设你打电话给-[SKPaymentQueue finishTransaction:]
。
在我的头顶,有几种可能性:
黑客是循环浏览几个(10?100?)耗材的列表,假设当你回到列表中较早的耗材时,它将完成处理。
另一种解决方案是预先分配大量非消耗品(“product.1”,“product.2”,......,“product.100”)并将具有适当价格的产品分配给产品。服务器。然后可以在iTunes Connect上更改价格,或者根据需要分配其他产品ID。
答案 2 :(得分:1)
感谢您的快速回复,但我的应用似乎确实正在完成交易等。
我的应用程序购买类项目变得非常复杂,所以我回复创建一个带有测试耗材产品的新基础项目,以及从这个开源获取的应用程序采购经理/观察员的标准实现:
http://blog.mugunthkumar.com/coding/iphone-tutorial-%E2%80%93-in-app-purchases/#idc-cover
出现同样的问题。这是顺序:
的 1。首次购买耗材(以下是我打印出的调试版)
_MKStoreManager:buyFeature:test.consumable.1
__MKStoreObserver:SKPaymentTransactionStatePurchased
__MKStoreObserver:completeTransaction
_MKStoreManager:provideContent
的 2。 “感谢您购买”对话框由Apple显示
第3。第二次购买耗材:
_MKStoreManager:buyFeature:test.consumable.1
__MKStoreObserver:SKPaymentTransactionStatePurchased
__MKStoreObserver:completeTransaction
_MKStoreManager:provideContent
__MKStoreObserver:SKPaymentTransactionStateFailed
__MKStoreObserver:failedTransaction
的 4。 “你已经购买了它,但尚未下载。点击确定立即下载。[环境:沙箱]”对话框由苹果显示。
在步骤3中,交易既被购买又失败的同时也没有意义。你有什么想法。
答案 3 :(得分:1)
不值得使用消耗品用于非消耗品,因为Apple会拒绝它。以下是发生在我身上的事情:
我遇到了同样的问题。解释您已经购买该商品的消息只会偶尔显示一次,并且主要是因为您购买了很多东西 - 一个接一个地购买。
我们已经在App Store进行了审核,得到了以下答案:
.....
We have completed the review of your in-app purchase but cannot post it to the App Store because the Purchasability Type is not set correctly. For information on Purchasing and Currency guidelines, please see section 11 of the App Store Review Guidelines [ https://developer.apple.com/appstore/resources/approval/guidelines.html ].
.....
The purchase of a [magazine issue] is set to "consumable", however based on product functionality it should be set as non-consumable instead.
.........
You are required to create a new in-app purchase product with the correct purchasability type.
..........
我希望这可以节省时间和头痛。
答案 4 :(得分:1)
我遇到了同样的问题。我犯的错误是在发送finishTransaction之前取消分配购买。确保在完成交易后处理交易结果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
BOOL success = YES;
for (SKPaymentTransaction *transaction in transactions){
switch (transaction.transactionState){
case SKPaymentTransactionStatePurchased:
success = YES;
break;
case SKPaymentTransactionStateFailed:
if (transaction.error.code == SKErrorPaymentCancelled){
if(DEBUG) NSLog(@"Transaction failed => Payment cancelled.");
}else if (transaction.error.code == SKErrorPaymentInvalid){
if(DEBUG) NSLog(@"Transaction failed => Payment invalid.");
}else if (transaction.error.code == SKErrorPaymentNotAllowed){
if(DEBUG) NSLog(@"Transaction failed => Payment not allowed.");
}else if (transaction.error.code == SKErrorClientInvalid){
if(DEBUG) NSLog(@"Transaction failed => client invalid.");
}else if (transaction.error.code == SKErrorUnknown){
if(DEBUG) NSLog(@"Transaction failed => unknown error.");
}else{
if(DEBUG) NSLog(@"I have no idea.");
}
success = NO;
break;
case SKPaymentTransactionStateRestored:
success = YES;
break;
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
NSLog(@"transaction finished: %@", transaction);
}
if(success){
// do something
}
}
希望能帮助你们中的一些人。
干杯, ķ。
答案 5 :(得分:0)
在交易完成后,你应该把这一行[[SKPaymentQueue defaultQueue] finishTransaction:transaction]放在新购买或恢复购买上。
答案 6 :(得分:0)
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
确保已在处理请求的控制器上添加此方法。