iOS:如何检测用户是否订阅了可自动更新的订阅

时间:2016-08-10 02:30:59

标签: ios swift storekit

希望标题不言自明。我试图做这样的事情:

checkIfUserIsSubscribedToProduct(productID, transactionID: "some-unique-transaction-string", completion: { error, status in
    if error == nil {
        if status ==  .Subscribed {
            // do something fun
        }
    }
 }

是否有类似我提供的假设代码?我觉得我正在服用疯狂的药片

修改

在类似的问题中,我一直看到#34;哦,你必须验证收据"但没有解释如何,甚至收据是什么。有人可以告诉我如何验证收据"?我试过this tutorial,但似乎没有用。

编辑 - 赏金

请解决以下情况:用户订阅我的自动续订订阅并因此获得更多数字内容 - 很酷,已实施。但是,如何在每次打开应用程序时检查该订阅是否仍然有效(即他们没有取消订阅)? 检查此问题的最简单的解决方案是什么?是否有类似我在问题中提供的假设代码?请引导我完成此操作并提供有关该主题的任何进一步详细信息。

4 个答案:

答案 0 :(得分:24)

我知道每个人都非常关心我以及我在这方面做了什么 - 不要害怕,解决了我的问题。主要问题是我尝试the garbage and outdated code in this link,但它没有工作,所以我放弃了。然后我回到它并用Alamofire实现它并且效果很好。这是代码解决方案:

斯威夫特3:

let receiptURL = Bundle.main.appStoreReceiptURL
let receipt = NSData(contentsOf: receiptURL!)
let requestContents: [String: Any] = [
    "receipt-data": receipt!.base64EncodedString(options: []),
    "password": "your iTunes Connect shared secret"
]

let appleServer = receiptURL?.lastPathComponent == "sandboxReceipt" ? "sandbox" : "buy"

let stringURL = "https://\(appleServer).itunes.apple.com/verifyReceipt"

print("Loading user receipt: \(stringURL)...")

Alamofire.request(stringURL, method: .post, parameters: requestContents, encoding: JSONEncoding.default)
    .responseJSON { response in
        if let value = response.result.value as? NSDictionary {
            print(value)
        } else {
            print("Receiving receipt from App Store failed: \(response.result)")
        }
}

答案 1 :(得分:1)

你想要实现什么?您想检查特定的Apple ID吗?

我非常怀疑这可以通过SDK实现。参考Is it possible to get the user's apple ID through the SDK?,您可以看到您甚至无法直接询问ID,而是附加服务。

有什么办法可以缓存您自己服务器上的所有交易并在本地搜索其数据库,但这需要应用程序询问用户的Apple ID,以便应用程序可以在启动时更新订阅状态,因为它可以检查与设备关联的ID的IAP。

但是,用户只需键入他想要的内容即可 - 而且不太可能通过Apple的应用审核流程获得此功能。

答案 2 :(得分:1)

我正在使用MKSoreKit https://github.com/MugunthKumar/MKStoreKit进行自动续订订阅。但是在目标c中您可以检查库代码以获得解决方案。我在我的代码中使用它并且它运行正常。

使用以下方法,您可以轻松查看订阅状态..

if([MKStoreManager isProductPurchased:productIdentifier]) {
 //unlock it
}

它从设备获取苹果ID,我认为这是用户特定的

答案 3 :(得分:0)

正如一些评论所指出的那样,这些答案存在一些缺陷。

  1. 从客户端呼叫/verifyReceipt并不安全。
  2. 可以通过更改时间来伪造过期日期与设备时钟的比较(总是在取消免费试用后尝试一个有趣的技巧:))

还有其他一些教程,说明如何设置服务器以处理收据验证,但这只是问题的一部分。在每次启动应用程序时发出网络请求以打开包装并验证收据可能会导致问题,因此也应该进行一些缓存以使事情顺利进行。

RevenueCat SDK为此提供了很好的现成解决方案。

我喜欢这种方法的几个原因:

  • 验证收据服务器端(不需要我设置服务器)
  • 检查带有服务器时间戳记的“活动”订阅,因此不能通过更改设备时钟来进行欺骗
  • 缓存结果,使其超快并可以离线工作

此问题有更多详细信息:https://stackoverflow.com/a/55404121/3166209

它的作用是一个简单的函数,您可以根据需要多次调用它,并且在大多数情况下会同步返回(因为它已被缓存)。

subscriptionStatus { (subscribed) in
    if subscribed {
        // Show that great pro content
    }
}