【问题标题】:SKPaymentTransaction.transactionState is always .restoredSKPaymentTransaction.transactionState 总是 .restored
【发布时间】:2020-05-11 21:59:42
【问题描述】:

我正在测试我的应用程序自动更新订阅,但 SKPaymentTransaction.transactionState 永远不会更改为 .purchased 并且始终是 .restored。一切正常,但自从我第一次打电话给SKPaymentQueue.default().restoreCompletedTransactions() 以来,我什么也得不到,只有.restored。我尝试从我的 iPhone 上删除应用程序,重新登录到我的沙盒帐户,创建一个新的沙盒帐户,重新启动 Xcode,清理构建文件夹,......我做错了什么?请在下面找到我的代码:

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        switch transaction.transactionState {
        case .purchased:
            SKPaymentQueue.default().finishTransaction(transaction)
            print(".purchased")
        case .failed:
            SKPaymentQueue.default().finishTransaction(transaction)
            print(".failed")
        case .restored:
            SKPaymentQueue.default().finishTransaction(transaction)
            print(".restored")
        default:
            break
        }
    }
}

@IBAction func restore(_ sender: UIBarButtonItem) {
    SKPaymentQueue.default().restoreCompletedTransactions()
}

func subscribe() {
    if SKPaymentQueue.canMakePayments() {
        let payment = SKPayment(product: availableProducts[indexPath.row])
        SKPaymentQueue.default().add(payment)
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    SKPaymentQueue.default().add(self)
}

【问题讨论】:

    标签: ios swift storekit skpaymenttransaction


    【解决方案1】:

    可能,一直是.restored,因为transaction还没有写完。


    通常我们把SKPaymentQueue.default().add(observer)放在AppDelegate中,

    这样交易将始终得到处理。

     class AppDelegate{
    
          func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
                SKPaymentQueue.default().add(self)
          }
    
    }
    
    extension AppDelegate: SKPaymentTransactionObserver {
    
          func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
                // ...
          }
    }
    

    当您将SKPaymentQueue.default().add(observer) 放入ViewController 时,因为ViewController 可能会被推送和弹出。

    也就是说,ViewController 实例被分配和释放。

    由于事务处理是异步的,其事务对应的ViewController实例可能不存在,或者不是同一个。

    所以它的行为很灵活。

    【讨论】:

    • 我明白你的意思,但我等了几分钟(只是为了测试),它似乎没有“能够完成”交易
    • 我发现了这个,它解决了我的问题:stackoverflow.com/a/36091267/488019 我是否应该在我的didFinishLaunchingWithOptions 中永久包含类似的内容以避免再次发生?
    【解决方案2】:

    我在这里找到:Clearing SKPAymentsQueue : Forcing Unfinished Transactions To Finish 我的问题是我有一些未完成的待处理交易,所以我将其添加到我的viewDidLoad 以“强制”完成所有交易。我应该永久包含它以避免再次发生吗?

    let currentQueue: SKPaymentQueue = SKPaymentQueue.default();
    for transaction in currentQueue.transactions {
        currentQueue.finishTransaction(transaction);
    }
    

    【讨论】:

      【解决方案3】:

      你应该检查队列的结果

      let transactions = queue.transactions
          if transactions.count > 0 {
              for transaction in queue.transactions {
                  if (transaction.transactionState == SKPaymentTransactionState.failed) {
                      //possibly handle the error
                      purchaseStatusBlock?(.failed)
                  } else if (transaction.transactionState == SKPaymentTransactionState.purchased) {
                      //deliver the content to the user
                      purchaseStatusBlock?(.purchased)
                  } else if (transaction.transactionState == SKPaymentTransactionState.restored) {
                      //deliver the content to the user
                      purchaseStatusBlock?(.restored)
                  } else {
                      //handle other transaction states
                  }
              }
          } else {
              purchaseStatusBlock?(.failed)
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-03
        • 1970-01-01
        • 2012-04-01
        • 2012-07-21
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 2010-11-06
        相关资源
        最近更新 更多