代码之家  ›  专栏  ›  技术社区  ›  Chewie The Chorkie

为Sandbox用户恢复应用内购买似乎可以验证新用户,即使他们从未购买过该应用[重复]

  •  0
  • Chewie The Chorkie  · 技术社区  · 7 年前

    当用户调用restorepurchases()时,不可消费的com.premium会被恢复,即使他们认为自己不拥有它。 以下是负责恢复采购和采购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 回复  |  直到 8 年前
        1
  •  5
  •   Paulw11    8 年前

    您不应在中更新任何采购状态 paymentQueueRestoreCompletedTransactionsFinished . 这个函数只是让您知道恢复过程已经完成。您可以使用它来更新您的用户界面或显示警报或其他内容。

    恢复过程将要恢复的事务发送到 updatedTransactions 在您处理 .restored 以与处理 .purchased 状态。

    本质上,“恢复”只是为非消耗性和自动更新订阅购买类型重播购买事务处理过程。

    推荐文章