2016-05-21 6 views
11

"これはアプリの購入で既に購入されていますが、無料で復元されます"が表示されますが、代理人のupdatedTransactionsは呼び出されず何も起こらず、IAPは実行されません。SKPaymentQueue updatedTransactionsが呼び出されていません

正常に動作している復元購入を実装しましたが、ユーザーが非消耗品の購入をやり直さないようにするにはどうすればよいでしょうか?また、代理人updatedTransactions(SKPaymentTransactionState.Restored)

アプリを削除して再インストールした後でも、このポップアップが表示されます。私がお勧めしたい - ここ

は私code.Pleaseは、あなたが問題になる可能性が.restoreCompletedTransactions()を呼び出し後にトランザクションオブザーバーを設定している私は何のwrong.Thanksに

func makePaymentForProduct(product:SKProduct){ 
    let payment = SKPayment.init(product: product) 
    SKPaymentQueue.defaultQueue().addPayment(payment) 
    SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
} 

func restorePurchases(){ 
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions() 
    SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
} 


//MARK: SKProductsRequestDelegate 

func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) { 
    self.delegate?.didGetProducts(response.products) 
} 

func request(request: SKRequest, didFailWithError error: NSError) { 
    self.delegate?.purchaseFailed(error.localizedDescription) 
} 

//MARK: SKPaymentTransactionObserver 

func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 

    for (_, transaction) in transactions.enumerate() { 
     switch (transaction.transactionState) { 
     case SKPaymentTransactionState.Purchased: 
      self.completeTransaction(transaction) 
      break 
     case SKPaymentTransactionState.Restored: 
      self.restoreTransaction(transaction) 
      break 
     case SKPaymentTransactionState.Failed: 
      self.failedTransaction(transaction) 
      break 
     default: 
      break 
     } 
    } 
} 

func completeTransaction(transaction:SKPaymentTransaction){ 
    self.delegate?.purchaseSuccessful() 
    SKPaymentQueue.defaultQueue().finishTransaction(transaction) 
} 

func restoreTransaction(transaction:SKPaymentTransaction){ 
    self.delegate?.purchaseSuccessful() 
    SKPaymentQueue.defaultQueue().finishTransaction(transaction) 
} 

func failedTransaction(transaction:SKPaymentTransaction){ 
    self.delegate?.purchaseFailed("") 
    SKPaymentQueue.defaultQueue().finishTransaction(transaction) 
} 


//Restore Purchase 

func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) { 
    self.delegate?.purchaseRestored() 
} 

func paymentQueue(queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: NSError) { 
    self.delegate?.purchaseFailed(error.localizedDescription) 
} 
+0

このリンクを参照してください:http://stackoverflow.com/questions/26235822/in-app-purchase-in-swift-with-a-single-productこのIAPコードは私に非常に役立ちました。 –

答えて

2

をやっているなら、私に知らせていますお試しください

func restorePurchases(){ 
    SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions() 
} 

上記の実装ではなく、試してみてください。

副注釈として、元のコードがトランザクションオブザーバを複数の場所に追加していることがわかります。可能であれば、これを1つの場所に減らすことを検討するとよいかもしれません。

関連する問題