【问题标题】:What should happen when non-purchased user press the restore purchase button in iOS?非购买用户在iOS中按下恢复购买按钮会发生什么?
【发布时间】:2015-06-28 05:05:22
【问题描述】:

我的沙盒测试账号可以购买非消耗品并恢复。一切正常。但是,如果该帐户之前没有购买过该项目,则按下恢复按钮不会执行任何操作。我在调试面板中什么也看不到。我希望 iOS 能够检测某个用户是否购买了该商品,如果没有,则显示一条消息,要求他们购买。是这样工作还是当前的行为完全可以接受?

这是连接到主情节提要内的按钮的恢复购买代码 (Swift):

@IBAction func restoreButtonPressed(sender: UIButton) {
    statusLabel.text = "Status: Restoring Purchase"
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}

其他实现的方法包括:

正常购买

func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) {}

适用于正常恢复

func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue!) {}

以前从未见过来自此方法的消息

func paymentQueue(queue: SKPaymentQueue!, restoreCompletedTransactionsFailedWithError error: NSError!) {}

谢谢!

【问题讨论】:

    标签: ios swift in-app-purchase


    【解决方案1】:

    您可以检查队列是否有任何返回的交易,如果没有则意味着没有购买要恢复:

    func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue!) {
      if queue.transactions.count == 0 {
        let alert = UIAlertView()
        alert.title = "Oops"
        alert.message = "There are no purchases to restore, please buy one"
        alert.addButtonWithTitle("Buy")
        alert.addButtonWithTitle("Cancel")
        alert.show()
     }
    }
    

    【讨论】:

    • 谢谢!不敢相信我没有考虑过检查交易数量!
    • 谢谢!我的应用程序被拒绝了,因为当用户没有购买我的 IAP 时,我的恢复按钮什么也没做。拒绝原因尚不清楚,但我认为这会解决它。
    • 嗨,在我的应用程序中,我使用相同的 if 语句来检查 queue.transactions 金额,但即使我从未购买过该产品,它也会给我 1,不知道为什么,所以我的无论如何,应用程序执行都是恢复,这意味着如果用户点击我的恢复购买按钮,他们将免费获得 IAP。这发生在沙盒模式下,以及当应用程序在 App Store 上发布时。 iOS 10,Swift 3。这是苹果的错误吗?
    • 如果 transactions.count > 0 那么我可以调用收据验证功能吗?
    • 嗨,我收到了苹果的收据,当我点击恢复 btn 而不购买该产品时,它给了我 1 天的订阅期。
    【解决方案2】:

    你可以试试这个:

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    
    
        for transaction in transactions {
    
            switch transaction.transactionState {
            case .purchasing: print("Payment is being processed")
    
            case .purchased: print("USER PURCHASED YOUR PRODUCT")
    
                SKPaymentQueue.default().finishTransaction(transaction)
    
            case .restored:
    
                if transaction.original?.transactionIdentifier != nil { // this identifier uniquely identifies a completed tansaction.
            //    queue.restoreCompletedTransactions()
    
                    print("THE BUYER BOUGHT THIS PRODUCT BEFORE")
    
                } else {
                 /*
                  display UIAlertController showing an error
                  there is no receipts, user never purchased this product.
                                    */
                }
    
    
            case .failed:
                self.dismiss(animated: true, completion: nil)
    
                SKPaymentQueue.default().finishTransaction(transaction)
            case .deferred:
    
               print("pending")
    
            @unknown default:
               break
            }
    
    
        }
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      相关资源
      最近更新 更多