Gol*_*Joe 5 objective-c in-app-purchase ios
我一直在尝试在iOS上测试一些可消耗的IAP,我收到一个奇怪的错误.弹出一个警告:
"此应用内购买已经被购买.它将免费恢复.[环境:沙箱]"
我已经检查过了,我确定我的IAP可以在iTunesConnect中使用.似乎我的验证过程以某种方式失败,但我不希望这个错误消息.有人对这个有经验么?
我不确定这是否是正确的操作,但是要求:
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
Run Code Online (Sandbox Code Playgroud)
在重复交易清除了他们.我怀疑,由于停在调试器或其他东西,我从未在成功案例中调用它.
小智 7
可能你已经解决了你的问题,但我遇到了同样的问题,并有一些额外的解决方案点:
对不起,我使用Swift,但我认为这是可以理解的.
首先,您的代码中有两个重要时刻,您必须涵盖:
class InAppPurchaseViewController: UIViewController , SKProductsRequestDelegate
, SKPaymentTransactionObserver //NOTE THIS!
{
override func viewDidLoad() {
super.viewDidLoad()
//
...
...
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
// here you create the observer
}
//before you leave this ViewController you should delete this Observer.
//I had a bug which worked like this: when user leaved the IAPViewController without
//buying something and then came back, viewDidLoad added one more Observer
// so App crashed on the attempt to buy
// for example:
@IBAction func exitTapped(sender: AnyObject) {
dismissViewControllerAnimated(true) { () -> Void in
SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}
}
Run Code Online (Sandbox Code Playgroud)
添加观察者后,不要忘记完成交易:
func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .Restored:
print("Restored")
break
case .Failed:
print("Failed")
//FINISH TRANSACTION
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
break
case .Purchasing:
print("Purchasing")
break
case .Purchased:
// DO your stuff here
// ...
// and FINISH TRANSACTION
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
}
break
case .Deferred:
print("Deferred")
break
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里解决的另一个问题是:我忘了添加完成事务代码行,所以我使用耗材IAP打开了事务.
当我试图再次购买这个Sandbox用户时,我收到了消息"这个应用程序内购买已经被购买了.它将免费恢复.[环境:沙箱]"这种情况一再发生,即使我添加了FinishTransaction.我更改了沙盒用户.应用程序每次运行应用程序时都会提示FirstSandBoxUser iTunes密码.灾难......非常烦人......
每当我尝试使用FirstSandBoxUser进行此次购买时,transaction.transactionState都是.Purchasing,您无法在此状态下完成交易!
我做了一个假设,如果事务没有完成,StoreKit就像非消耗品那样,所以我应该开始一个恢复过程,然后抓紧时间完成交易.这是代码:
func paymentQueue // see above
//....
case .Purchasing:
print("Purchasing")
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
break
//...
}
func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) {
for transaction in queue.transactions {
queue.finishTransaction(transaction)
}
}
Run Code Online (Sandbox Code Playgroud)
一旦运行此代码就足够了,我认为它将捕获所有"采购"事务,恢复它们并在完成之后.
当然,修复问题后删除此附加代码.
祝好运!
| 归档时间: |
|
| 查看次数: |
2468 次 |
| 最近记录: |