iOS:如何检测用户是否订阅了 auto-renewable 订阅

iOS: How to detect if a user is subscribed to an auto-renewable subscription

希望标题是self-explanatory。我正在尝试做这样的事情:

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

我提供的假设代码是否存在?我觉得我在吃疯狂的药

编辑

在类似的问题中,我一直看到 "oh you gotta validate the receipt" 的通用答案,但没有解释如何收据,甚至没有说明收据是什么。有人可以告诉我如何 "validate the receipt" 吗?我尝试了 this tutorial 但似乎没有用。

编辑 - 赏金

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

您特别想达到什么目的?您要检查特定的 Apple ID 吗?

我非常怀疑这是否可以通过 SDK 实现。参考 Is it possible to get the user's apple ID through the SDK? 你可以看到你甚至不能直接要求 ID 而是附加的服务。

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

但是,用户可以随意输入任何内容 - 不太可能通过 Apple 的应用程序审核流程。

我知道每个人都非常关心我以及我在这方面的表现 - 不要害怕,解决了我的问题。主要问题是我尝试了来自 documentation 的 Apple 示例代码,但它没有用,所以我放弃了。然后我回到它并用 Alamofire 实现它并且效果很好。这是代码解决方案:

Swift 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)")
        }
}

我正在使用 MKSoreKit https://github.com/MugunthKumar/MKStoreKit 进行自动续订 subscriptions.but 它在 objective c 您可以检查库代码 solution.I 我在我的代码中使用它并且它工作正常。

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

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

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

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

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

还有一些其他教程介绍如何设置服务器来处理收据验证,但这只是问题的一部分。在每次应用程序启动时发出网络请求来解压和验证收据可能会导致问题,因此也应该有一些缓存来保持事情 运行 顺利进行。

RevenueCat SDK 为此提供了一个很好的开箱即用的解决方案。

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

  • 验证收据服务器端(不需要我设置服务器)
  • 检查具有服务器时间戳的 "active" 订阅,因此无法通过更改设备时钟来欺骗
  • 缓存结果,因此速度超快并且可以离线工作

这个问题有更多细节:

它的工作原理是一个简单的函数,您可以根据需要经常调用它,并且在大多数情况下 return 会同步调用(因为它已缓存)。

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