当还没有购买时,IAP正在恢复

问题描述:

当用户调用restorePurchases()时,即使认为它们不拥有它,也会恢复非易失性com.premium。 以下是负责恢复购买和购买IAP的功能。这只是非消耗性IAP的一个问题。 购买没有问题。如果用户试图购买他们已有的IAP,则只需恢复。感谢您查看此内容。当还没有购买时,IAP正在恢复

func restorePurchases() { 
    SKPaymentQueue.default().add(self) 
    SKPaymentQueue.default().restoreCompletedTransactions() 
} 

func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) { 
    print("transactions restored") 

    for transaction in queue.transactions { 
     let t: SKPaymentTransaction = transaction 

     let prodID = t.payment.productIdentifier as String 
     print("starting restoring") 
     switch prodID { 
     case "com.premium": 
      print("restoring ads") 
      removeAds() 
     case "com.cash": 
      print("we dont restore coins") 
     case "com.level": 
      print("we dont restore levels") 
     default: 
      print("can't restore") 
     } 
    } 

这是我的付款队列也。

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 
    print("add paymnet") 

    for transaction:AnyObject in transactions { 
     let trans = transaction as! SKPaymentTransaction 
     print(trans.error) 

     switch trans.transactionState { 

     case .purchased: 
      print("buying, ok unlock iap here") 
      print(p.productIdentifier) 

      let prodID = p.productIdentifier as String 
      switch prodID { 
      case "com.premium": 
       print("buying ads") 
       removeAds() 
      case "com.cash": 
       print("buying coins") 
       addCoins() 
      case "com.level": 
       print("buying levels") 
       addLevels() 
      default: 
       print("can't buy") 
      } 

      queue.finishTransaction(trans) 
      break; 
     case .failed: 
      print("buy error") 
      queue.finishTransaction(trans) 
      break; 
     default: 
      print("default") 
      break; 

     } 
    } 
} 
+0

您是否每次都使用全新的测试用户帐户进行测试? – brandonscript

+0

@brandonscript是的我每次都使用一个新帐户。 – james

+0

我回滚了你的编辑,因为它删除了原来的代码,这是“问题”,并在一定程度上使答案失效。如果您喜欢 – Paulw11

您不应更新paymentQueueRestoreCompletedTransactionsFinished中的任何购买状态。此功能只是让您知道恢复过程已完成。您可以使用它来更新您的用户界面或显示警报或其他内容。

恢复过程将事务恢复到updatedTransactions函数,其中您以与处理.purchased状态相同的方式处理.restored状态。

基本上“恢复”只是为非消费型和自动续订订购购买类型重放购买交易流程。

+0

,那么您可以编辑您的问题以包含您的“新”代码,因此在我的paymentQueue函数中,在交换机trans.transactionState中。我应该使用.restored情况? – james

+0

是的,这是正确的 – Paulw11

+0

因此,当我调用restorePurchases()时,它会到达.restoringAttempt,但打印(p.productIdentifier)在控制台中打印一条空白行,因此它会转到默认状态并指出:无法购买。但是,如果我按下购买按钮,并登录但不购买。然后我试图恢复它的作品。那么我需要在我的restorePurchases()中包含哪些内容才能提示第一次登录?再次感谢。 – james