我一直在嘗試在iOS上測試一些易損件IAP,並且出現一個奇怪的錯誤。彈出一個警告:「這個應用程序內購買已經被購買,它將被免費恢復。[環境:沙盒]」。沙箱試圖恢復易損件IAP
我檢查過了,我確定我的IAP在iTunesConnect中可以使用。看來我的驗證過程在某種程度上失敗了,但我不希望這個錯誤信息。有人對這個有經驗麼?
我一直在嘗試在iOS上測試一些易損件IAP,並且出現一個奇怪的錯誤。彈出一個警告:「這個應用程序內購買已經被購買,它將被免費恢復。[環境:沙盒]」。沙箱試圖恢復易損件IAP
我檢查過了,我確定我的IAP在iTunesConnect中可以使用。看來我的驗證過程在某種程度上失敗了,但我不希望這個錯誤信息。有人對這個有經驗麼?
我不知道這是否是正確的行動,但呼籲:
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
上的重複交易
清除出來。我懷疑,由於停止在調試器或其他東西,我從來沒有在成功案例中調用它。
也許您解決您的問題了,但我遇到了同樣的問題,有一些額外的解決方案要點:
對不起,我用斯威夫特,但我認爲這是可以理解的在這裏。
首先,有在你的代碼中,兩個重要的時刻,你必須包括:
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)
}
}
您添加的觀測後,別忘了完成交易:
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
}
}
}
我在這裏解決的另一個問題是:我忘了添加完成代碼交易行,所以我已經與易損耗IAP打開了交易。
當我試圖再次購買這個沙盒用戶時,我收到了消息「這個應用程序內購買已經被購買了,它將被免費恢復[環境:沙盒]」這再次發生了甚至在我添加FinishTransaction之後。我改變了沙箱用戶。每次運行App時,App都會提示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)
}
}
這足以一次運行這段代碼,我認爲,這將趕上所有的「採購」交易,恢復他們,完成後。
當然,修復問題後,請刪除此附加代碼。
祝你好運!
當客戶端使用的事務未完成時會發生這種情況。
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
你應該在你的應用程序啓動階段註冊transactionObserver,保證你會得到通知所有未完成的交易。您應該完成這些交易,並執行其他任何所需的操作,以便將購買的產品正確地交付給用戶。
From apples programming guide(重點煤礦):
當你的應用啓動,如圖清單5-1註冊一個事務隊列觀察。確保觀察者隨時可以處理事務,而不僅僅是在將事務添加到隊列中之後。例如,考慮一下用戶在進入隧道之前在您的應用中購買了一些東西的情況。由於沒有網絡連接,您的應用無法傳送購買的內容。 當您的應用下次啓動時,StoreKit會再次調用您的事務隊列觀察器,並在此時傳送已購買的內容。同樣,如果您的應用無法將交易標記爲已完成,則每當您的應用啓動時,StoreKit都會調用觀察者,直到交易正確完成。
他們建議將以下代碼註冊觀察者:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
/* ... */
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
}
好像我有一個類似的問題。你修好了嗎? – Vladius 2015-04-01 18:14:17
我也面臨同樣的問題。你有沒有找到解決方案? – 2017-07-11 14:06:12