Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS应用内购买在恢复完成后自动购买_Ios_Swift_In App Purchase_Payment_Restore - Fatal编程技术网

iOS应用内购买在恢复完成后自动购买

iOS应用内购买在恢复完成后自动购买,ios,swift,in-app-purchase,payment,restore,Ios,Swift,In App Purchase,Payment,Restore,我正在用sandbox测试应用内购买。在paymentQueue updateTransactions方法中,我捕获事务状态,然后如果状态购买或恢复,我尝试解锁内容(用户已订阅,然后将模式转换为Premium) 到目前为止,一切正常。用户将购买物品,然后用户进入高级模式。若用户从其设备中删除了应用程序,则恢复案例也可以工作,并将模式转换为高级模式 但不知何故,在用户点击恢复按钮后,在那个时间并没有出现任何问题。但若用户靠近应用程序,然后打开两次,用户将再次看到购买的案例。一些购买案例在没有任何购

我正在用sandbox测试应用内购买。在paymentQueue updateTransactions方法中,我捕获事务状态,然后如果状态购买或恢复,我尝试解锁内容(用户已订阅,然后将模式转换为Premium)

到目前为止,一切正常。用户将购买物品,然后用户进入高级模式。若用户从其设备中删除了应用程序,则恢复案例也可以工作,并将模式转换为高级模式

但不知何故,在用户点击恢复按钮后,在那个时间并没有出现任何问题。但若用户靠近应用程序,然后打开两次,用户将再次看到购买的案例。一些购买案例在没有任何购买尝试的情况下再次工作

我的理解是,添加SKProductQueue observer updatedTransaction方法调用后。然后不知何故,购买案例是可行的

这很难描述我正在做什么,但基本上是在用户下次点击“还原”按钮后,更新的Transaction方法突然起作用,购买的案例也起作用。此外,我将使用“购买”和“还原”功能,但这些功能看起来是正确的

任何想法都将不胜感激

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

    for transaction in transactions {
          print(transaction.transactionState.status(), transaction.payment.productIdentifier)
        switch transaction.transactionState {


        case .purchasing  : break

        case .purchased:

            // set true for premium mode then turn back to main screen from purchase screen.
             UserDefaults.standard.setValue(true, forKey: "isUserSubscribe")
             UserDefaults.standard.synchronize()

                getBackMainScreenProvider.Instance.returnMain()
             print("purchased")
             queue.finishTransaction(transaction)

             break

        case .failed:
            queue.finishTransaction(transaction)
            break
        case .restored:
              // this case is works more than once but if user has more than purchase 
            // but its okay.
             UserDefaults.standard.setValue(true, forKey: "isUserSubscribe")
             UserDefaults.standard.synchronize()
             getBackMainScreenProvider.Instance.returnMain()

             AppDelegate.restoreClickFlag = true

            queue.finishTransaction(transaction)


            break

        default : break
        }
    }

}


 func purchase (product: IAPProduct) {

     guard let productToPurchase  = products.filter({ $0.productIdentifier == product.rawValue }).first else { return }
     let payment  = SKPayment(product: productToPurchase)  // request to the  Appstore in order to   payment process
    paymentQueue.add(payment)
    print("nasıl...")

}

func restorePurchases () {

    print("restoring purchases...")

    paymentQueue.restoreCompletedTransactions()

}

没有人能回答你的问题,因为他们不知道你在用UserDefaults做什么。@ElTomato我告诉你整个故事,但是如果你不想得到任何东西,那就是你的问题。我正在存储包含用户购买的布尔值。之后,应用程序转向高级模式,但我已经说过,这不是问题发生的原因。一切都很顺利。问题与高级模式无关。用户还原后,updatedTransaction函数意外工作。这就是问题所在。我不建议在
UserDefault
s中保存
isUserSubscribe
。。。强烈建议您改用钥匙链
UserDefault
s是最安全的(因此越狱设备很容易就能免费订阅)。