【问题标题】:Standard checking if user has active subscription(auto renewable subscription). IOS Swift标准检查用户是否有活动订阅(自动更新订阅)。 IOS 斯威夫特
【发布时间】:2016-09-30 13:02:53
【问题描述】:

我阅读了大量有关自动续订订阅的内容,但我对如何检查用户是否有有效订阅有疑问。

这就是我获得收据的方式

func validateRecipt(callback:(receipt:NSDictionary?)->()){
        let recuptUrl = NSBundle.mainBundle().appStoreReceiptURL
        if let receipt: NSData = NSData(contentsOfURL:recuptUrl!) {

            //https://sandbox.itunes.apple.com/verifyReceipt    //TEST ENVIRONMENT
            //https://buy.itunes.apple.com/verifyReceipt        //PRODUCTION ENVIRONMENT
            let request = NSMutableURLRequest(URL: NSURL(string: "https://sandbox.itunes.apple.com/verifyReceipt")!, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10)

            let session = NSURLSession.sharedSession()
            request.HTTPMethod = "POST"
            let receiptdata:NSString = receipt.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
            let payload:NSDictionary = {["receipt-data" : receiptdata, "password" : "mySharedKey"]}()
           //, password\" : \"" + EGConstants.sharedSecret + "\" }"

            do {

            let payloadData:NSData = try(NSJSONSerialization.dataWithJSONObject(payload, options: NSJSONWritingOptions(rawValue: 0)))

            request.HTTPBody = payloadData
            let task = session.dataTaskWithRequest(request) { (data, response, err) in

                do {
                    let json = try(NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary)

                    if(err != nil) {
                        print(err!.localizedDescription)
                        let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
                        print("Error could not parse JSON: '\(jsonStr)'")
                        callback(receipt: nil)
                    }
                    else {
                        if let parseJSON = json {


                            callback(receipt: parseJSON)
                        }
                        else {
                            let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
                            print("Recipt Error: \(jsonStr)")
                            callback(receipt: nil)
                        }
                    }
                } catch {

                }
            }



            task.resume()

            } catch {}
        }
    }

我的问题是:

1.如何使用Receipt查看用户是否有活跃订阅? (我是否需要解析收据并获取product subscription的最后一笔交易的最后expires_date?)

2. 每次启动应用都刷新收据可以吗?(这样我可以检查用户是否取消了他的订阅)如果没有,我什么时候需要刷新收据?

ps。如果我有错误的概念或问题,请引导我走向正确的道路。提前致谢

【问题讨论】:

  • 虽然这并不能回答您的问题,但我想提一下,您不能通过将请求发送到 iTunes 来进行本地收据验证。此验证应由服务器作为您控制的唯一一侧执行。见Validating Receipts With the App Store
  • @EugeneDubinin 服务器意味着在我的应用程序之外?像网络服务器?
  • 是的。您可以提交Base64 收据数据的服务器,并从该服务器接收由 iTunes 完成的验证结果。
  • @EugeneDubinin 有没有可能不做任何其他的东西,比如服务器的东西?
  • 为了找出本地验证程序,请再次阅读Validating Receipts LocallyBUT,我不确定是否需要验证来解决您的问题。我没有订阅经验。

标签: ios objective-c swift in-app-purchase


【解决方案1】:

也许,现在回答为时已晚,但最后,我一直在研究类似的问题。但是,我必须在本地解析和验证收据,这在我看来更好,因为您不需要进行额外的 http 调用。

我已经实现了一个小型库来简化在本地使用应用内收据。

随意使用。 Github link

以下是解决问题的示例:

import TPInAppReceipt

do {
    let receipt = try InAppReceiptManager.shared.receipt()

    //retrive active auto renewable subscription for a specific product and date
    let purchase = receipt.activeAutoRenewableSubscriptionPurchases(ofProductIdentifier: "ProductName", forDate: Date())

    //retrive all auto renewable subscription purchases for a specific product
    let allAutoRenewableSubscriptionPurchases = receipt.purchases(ofProductIdentifier: "productName").filter({ return $0.isRenewableSubscription })
} catch {
    print(error)
}

【讨论】:

  • 我尝试了这段代码,但没有任何反应,只有 2 个警告说它从未使用过
  • @BroSimple 库已更新,GitHub 页面上有示例
  • 我没有看到示例,我正在打印自动续订的 json 收据,但我无法使用 TPInAppReceipt 验证此 json
  • @BroSimple 很遗憾您无法验证 json 文件,您只能验证本地收据
  • 我从我的服务器获得了从 Apple 获得的收据,我该怎么办? Github 没有明确的说明,我在Working With a Receipt 中添加了代码,在里面我添加了Useful methods 并没有任何反应,我看到的唯一示例项目是项目本身,它没有功能
猜你喜欢
  • 2016-12-16
  • 1970-01-01
  • 2016-12-24
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 2017-09-10
  • 2016-03-25
相关资源
最近更新 更多