ios - 取消订阅后,用户仍可以访问应用程序

标签 ios swift in-app-purchase in-app-subscription

我遇到的问题是,如果您尝试取消订阅,应用程序仍会继续运行。

这是我的代码片段:

override func viewDidLoad() {
    super.viewDidLoad()

    if(SKPaymentQueue.canMakePayments()) {
        print("IAP is enabled, loading")
        let productID: NSSet = NSSet(objects: "Seb.DiPlus.RenewingSubMonthAuto", "Seb.DiPlus.RenewingSubYearAuto")
        let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>)
        request.delegate = self
        request.start()
    } else {
        print("please enable IAPS")
    }
}

@IBAction func subscribeMonth(_ sender: Any) {
    for product in list {
        let prodID = product.productIdentifier
        if(prodID == "Seb.DiPlus.RenewingSubMonthAuto") {
            p = product
            buyProduct()
        }
    }
}

@IBAction func subscribeYear(_ sender: Any) {
    for product in list {
        let prodID = product.productIdentifier
        if(prodID == "Seb.DiPlus.RenewingSubYearAuto") {
            p = product
            buyProduct()
        }
    }
}

@IBAction func restoreComplete(_ sender: UIButton) {
    restorePurchases()
}

@IBAction func exit(_ sender: Any) {
    _exit(0)
}

func restorePurchases() {
    if SKPaymentQueue.canMakePayments(){
        print("restored complete")
        SKPaymentQueue.default().add(self)
        SKPaymentQueue.default().restoreCompletedTransactions()
    }
    else{
        print("restored faild, IAP not activ?")
    }
}

func buyProduct() {
    print("buy " + p.productIdentifier)
    let pay = SKPayment(product: p)
    SKPaymentQueue.default().add(self)
    SKPaymentQueue.default().add(pay as SKPayment)
}

func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
    print("product request")
    let myProduct = response.products
    for product in myProduct {
        print("product added")
        print(product.productIdentifier)
        print(product.localizedTitle)
        print(product.localizedDescription)
        print(product.price)

        list.append(product)
    }
}

func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
    print("transactions restored")
    for transaction in queue.transactions {
        let t: SKPaymentTransaction = transaction
        let prodID = t.payment.productIdentifier as String

        switch prodID {
        case "Seb.DiPlus.RenewingSubMonthAuto":
            print("Subscribe Month!")
            if abo < 1 {
                readySubscribe()
            }
            abo = 1
            break
        case "Seb.DiPlus.RenewingSubYearAuto":
            print("Subscribe Year!")
            if abo < 1 {
                readySubscribe()
            }
            abo = 1
            break
        default:
            print("IAP not found")
        }
    }
}

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

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

        switch trans.transactionState {
        case .purchased:
            print("buy ok, unlock IAP HERE")
            print(p.productIdentifier)

            let prodID = p.productIdentifier
            switch prodID {
            case "Seb.DiPlus.RenewingSubMonthAuto":
                print("Subscribe Month!!")
                if abo < 1 {
                    readySubscribe()
                }
                abo = 1
                break
            case "Seb.DiPlus.RenewingSubYearAuto":
                print("Subscribe Year!!")
                if abo < 1 {
                    readySubscribe()
                }
                abo = 1
                break
            default:
                print("IAP not found")
            }
            queue.finishTransaction(trans)
        case .failed:
            print("buy error")
            alert(title: "ERROR", message: trans.error?.localizedDescription)
            queue.finishTransaction(trans)
            break
        default:
            print("Default")
            break
        }
    }
}

func readySubscribe()  {
    UserDefaults.standard.setValue(checkSubscribe, forKeyPath: "subscribe")
    UserDefaults.standard.synchronize()
    self.performSegue(withIdentifier: "readySubscribe", sender: self)

}

func alert (title:String, message:String?){

    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)

    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
    }))

    self.present(alert, animated: true, completion: nil)
}

一旦我点击恢复购买,即使订阅不再激活,您也可以继续使用该应用程序。

因此调用函数readySubscribe()。

最佳答案

您不应在 paymentQueueRestoreCompletedTransactionsFinished 中激活任何购买。当恢复过程完成时调用此函数。您可以使用它来更新您的 UI 或提醒用户。

产品的实际恢复应在您的 paymentQueue(_queue: SKPaymentQueue, UpdatedTransactions transactions: [SKPaymentTransaction]) 函数中处理。

已恢复的事务显示状态为.restored。您应该像处理 .purchased 状态一样处理它们。

由于您使用的是自动续订订阅 IAP,您还需要检查收据的到期日期,并为订阅续订时出现的新交易做好准备。因此,您的应用在 didFinishLaunchingWithOptions 中应该做的第一件事就是创建一个支付队列观察者。

关于ios - 取消订阅后,用户仍可以访问应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53308395/

相关文章:

Android 应用内计费 Phonegap 1.0

ios - 审核团队沙盒帐户

ios - 符合协议(protocol)的类 - 编译时检查

iphone - Photobucket iOS 集成

ios - 使用 AFNetworking NSOperations 连续下载大量文件......内存不足

ios - 顶部导航栏已禁用

iphone - 如何在 iOS 中获取应用内购买的区域设置货币价格?

ios - coredata中两个NSDate之间的查询

ios - 单击按钮弹出 UIPickerView (Swift)

ios - 在 iOS 中通过 URL 播放视频