2015-03-24 104 views
4

我一直在嘗試在iOS上測試一些易損件IAP,並且出現一個奇怪的錯誤。彈出一個警告:「這個應用程序內購買已經被購買,它將被免費恢復。[環境:沙盒]」。沙箱試圖恢復易損件IAP

我檢查過了,我確定我的IAP在iTunesConnect中可以使用。看來我的驗證過程在某種程度上失敗了,但我不希望這個錯誤信息。有人對這個有經驗麼?

+0

好像我有一個類似的問題。你修好了嗎? – Vladius 2015-04-01 18:14:17

+0

我也面臨同樣的問題。你有沒有找到解決方案? – 2017-07-11 14:06:12

回答

7

我不知道這是否是正確的行動,但呼籲:

[[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
上的重複交易

清除出來。我懷疑,由於停止在調試器或其他東西,我從來沒有在成功案例中調用它。

4

也許您解決您的問題了,但我遇到了同樣的問題,有一些額外的解決方案要點:

對不起,我用斯威夫特,但我認爲這是可以理解的在這裏。

首先,有在你的代碼中,兩個重要的時刻,你必須包括:

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) 
    } 
} 

這足以一次運行這段代碼,我認爲,這將趕上所有的「採購」交易,恢復他們,完成後。

當然,修復問題後,請刪除此附加代碼。

祝你好運!

0

當客戶端使用的事務未完成時會發生這種情況。

[[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 

你應該在你的應用程序啓動階段註冊transactionObserver,保證你會得到通知所有未完成的交易。您應該完成這些交易,並執行其他任何所需的操作,以便將購買的產品正確地交付給用戶。

From apples programming guide(重點煤礦):

當你的應用啓動,如圖清單5-1註冊一個事務隊列觀察。確保觀察者隨時可以處理事務,而不僅僅是在將事務添加到隊列中之後。例如,考慮一下用戶在進入隧道之前在您的應用中購買了一些東西的情況。由於沒有網絡連接,您的應用無法傳送購買的內容。 當您的應用下次啓動時,StoreKit會再次調用您的事務隊列觀察器,並在此時傳送已購買的內容。同樣,如果您的應用無法將交易標記爲已完成,則每當您的應用啓動時,StoreKit都會調用觀察者,直到交易正確完成

他們建議將以下代碼註冊觀察者:

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    /* ... */ 

    [[SKPaymentQueue defaultQueue] addTransactionObserver:observer]; 
}