Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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 - Fatal编程技术网

Ios 如何检查应用内购买(自动续费订阅)的购买状态?

Ios 如何检查应用内购买(自动续费订阅)的购买状态?,ios,swift,in-app-purchase,Ios,Swift,In App Purchase,我使用自动续费订阅为该应用创建了应用内购买功能。问题是,我不确定如何检查购买状态,订阅是否已用完或仍处于活动状态 以下是我尝试保存已购买状态的位置: func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { print("add payment") for transaction: AnyObject in transactions

我使用自动续费订阅为该应用创建了应用内购买功能。问题是,我不确定如何检查购买状态,订阅是否已用完或仍处于活动状态

以下是我尝试保存已购买状态的位置:

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

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

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

            let prodID = p.productIdentifier
            switch prodID {
                case "com.test.UnlockTools.Subscription1":
                    print("tool set 1 unlocked")
                    uTool1()
                    print("tool set 2 unlocked")
                    uTool2()
                    print("tool set 3 unlocked")
                    uTool3()
                    UserDefaults.standard.set(true, forKey: "isSubbed")
                default:
                    print("IAP not found")
                }
            queue.finishTransaction(trans)
        case .failed:
            print("buy error")
            queue.finishTransaction(trans)
            break

        default:
            print("Default")
            break
        }
    }
}
这就是我调用UserDefaults并允许或拒绝按钮交互的地方:

override func viewDidLoad() {
    super.viewDidLoad()

    if(SKPaymentQueue.canMakePayments()) {
        print("IAP is enabled, loading")
        let productID: NSSet = NSSet(object: "com.test.UnlockTools.Subscription1")
        let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>)
        request.delegate = self
        request.start()
    } else {
        print("please enable IAPS")
    }

    status = UserDefaults.standard.bool(forKey: "isSubbed") ?? false

    if status == true {
        unlockTool1.isUserInteractionEnabled = true
        unlockTool2.isUserInteractionEnabled = true
        unlockTool3.isUserInteractionEnabled = true
    } else {
        unlockTool1.isUserInteractionEnabled = false
        unlockTool2.isUserInteractionEnabled = false
        unlockTool3.isUserInteractionEnabled = false
    }

}
override func viewDidLoad(){
super.viewDidLoad()
if(SKPaymentQueue.canMakePayments()){
打印(“IAP已启用,正在加载”)
让productID:NSSet=NSSet(对象:“com.test.UnlockTools.Subscription1”)
let请求:SKProductsRequest=SKProductsRequest(产品标识符:productID as!Set)
request.delegate=self
request.start()
}否则{
打印(“请启用IAPS”)
}
status=UserDefaults.standard.bool(forKey:“isSubbed”)??false
如果状态==true{
unlockTool1.isUserInteractionEnabled=true
unlockTool2.isUserInteractionEnabled=true
unlockTool3.isUserInteractionEnabled=true
}否则{
unlockTool1.isUserInteractionEnabled=false
unlockTool2.isUserInteractionEnabled=false
unlockTool3.isUserInteractionEnabled=false
}
}
如果我找到状态,那么我将能够将状态保存为true/false。我尝试使用UserDefaults并取得了一些成功。但不确定我是否将代码放在了最佳位置

如果订阅仍处于活动状态,我希望允许用户单击按钮,如果订阅已用完,则拒绝按钮单击


如果需要,我将添加更多代码。任何帮助都将不胜感激。

检查订阅状态的唯一方法是使用Apple的
/verifyReceipt
端点验证收据是否仍然有效

您可以做的是在购买后缓存一些过期日期,并使用该日期检查订阅是否有效。如果超过了有效期,你可以与苹果公司重新核对收据,看是否续签。还有一些边缘案例,用户在到期日之前被退款,他们的订阅被取消——你应该定期向苹果更新收据,以检查此案例。理想情况下,这一切都应该发生在服务器端,以避免盗版


这里有一篇很好的帖子,很好地总结了苹果订阅带来的烦恼:

使用ProductIdentifier检查产品是否已经购买了,怎么样?或者这不适用于订阅?您将使用产品标识符和过期日期来确定订阅是否处于活动状态:啊,好的。我只是在检查是否有办法在收据验证之外获得某种购买状态。但似乎没有别的办法。Thanks@SlavictheSlavic实际上是的。同样的方法,但这个图书馆比以前容易多了TPInAppReceipt'检查一下。