【问题标题】:iOS: How to detect if a user is subscribed to an auto-renewable subscriptioniOS:如何检测用户是否订阅了自动更新订阅
【发布时间】:2016-12-16 05:51:07
【问题描述】:

希望标题是不言自明的。我正在尝试做这样的事情:

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

是否存在类似于我提供的假设代码的内容?我觉得我正在服用疯狂的药丸

编辑

在类似的问题中,我不断看到“哦,您必须验证收据”的一般答案,但没有说明收据的方式或什至是什么。有人可以向我提供如何“验证收据”吗?我试过this tutorial,但似乎没有用。

编辑 - 赏金

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

【问题讨论】:

    标签: ios swift storekit


    【解决方案1】:

    我知道每个人都非常关心我以及我在这方面的表现 - 不要害怕,解决了我的问题。主要问题是我尝试了来自documentation 的Apple 示例代码,但它不起作用,所以我放弃了它。然后我回到它并用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)")
            }
    }
    

    【讨论】:

    • 我确实同意你的好回答,但是出于安全考虑,最好在你的服务器端检查你的服务器端的到期日期与苹果的到期日期。 ` let currentTime = NSDate().timeIntervalSince1970 let expired = currentTime > expiresTime` 如果用户将设备的日期更改为过去,则该检查可能会通过,
    • 好点。假设我的服务器端不过是 Firebase?
    • 在那种情况下我没有使用过 firebase,但是如果你冷控制后端的验证,它会很酷。
    • 应用购买或定期订阅成功或取消订阅后如何获取单用户付款信息/收据 我需要将此信息维护到我的服务器。有什么办法吗?
    • 来自 Apple 的警告:“重要提示:不要从您的应用调用 App Store 服务器 /verifyReceipt 端点”
    【解决方案2】:

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

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

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

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

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

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

    这个问题还有更多细节:https://stackoverflow.com/a/55404121/3166209

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      但是,用户可以随便输入他想要的任何内容 - 而且不太可能通过 Apple 的应用审核流程。

      【讨论】:

      • 好吧,Apple ID 就是一个不好的例子。我只是想表达我正在寻找一种方法来检查订阅是否处于活动状态。假设用户订阅,然后立即删除他们的订阅 - 我需要一种检测方法。
      • @rigdonmr 你的意思是取消订阅还是取消自动续订?如果是前者,则在取消here 下描述该过程
      • 我猜这两种情况都需要处理。我的首要问题是,是否有一个 API 可以让我发送特定于用户订阅的内容(收据、交易 ID 等),然后我会得到类似“活动”“取消自动”的状态续订”“完全取消”。看看我要做什么?
      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-30
        • 2021-12-12
        • 1970-01-01
        • 1970-01-01
        • 2017-04-06
        • 2016-12-24
        • 1970-01-01
        • 2013-09-29
        相关资源
        最近更新 更多