验证来自多个应用的​​ iOS 个自动续订订阅

Validate iOS auto-renewable subscriptions from multiple apps

我在一家游戏开发公司工作,该公司每月至少发布一款游戏。对于我们真正的粉丝,我们希望开始提供对我们游戏的订阅,这样他们就可以玩我们所有的游戏(在任何平台上),而无需经常购买。

iOS 的想法是使用应用内自动续订订阅。这会生成我们存储在后端的收据。后端可以验证此收据并向应用程序提供有关用户订阅的信息。 该系统将解决很多问题:您可以在 1 个游戏中订阅,并在任何您喜欢的设备上玩所有游戏。

但现在我们遇到了问题:一个月后收据不再有效,我们需要检查 iTunes 商店以查看用户是否仍有有效订阅。

我的第一个想法是使用 "latest_receipt_info" 字段来获取最新收据并对其进行验证。但是根据文档,此功能只能用于 iOS 6 个收据:

"Only returned for iOS 6 style transaction receipts for auto-renewable subscriptions."

source: https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-

尽管我实际上仍然可以在全新的 iOS 10 收据中使用此字段,但我认为使用它并不明智,因为它已被弃用。

(另一个消息来源告诉你不应该再使用它了:https://forums.developer.apple.com/message/156580#156580

apple推荐的方案是在app中实现一个SKPaymentTransactionObserver。这将在可用时检索最新的收据,并将其发送到后端。尽管这远非理想,但这可以工作......但是:

这意味着该应用程序必须处于活动状态才能检索最新的收据。在我们的例子中,用户很可能在 app1 中订阅,几天后下载了 app2、3 和 4,但再也没有使用过 app1。所以在这种情况下,永远不会获取最新的收据(因为只有 app1 的观察者才能访问收据)

要解决此问题,我们应该能够从订阅组中的任何应用程序中获取此订阅的收据。但是根据苹果网站 (https://developer.apple.com/app-store/subscriptions/ ) 上的文档,您只能从 1 个应用程序访问订阅,并且您必须自己做多个应用程序的事情:

You can offer auto-renewable subscriptions to access multiple apps in your portfolio. Each app must be approved to use auto-renewable in-app purchases and must be published under the same developer name on the App Store.

In iTunes Connect, you’ll need to set up separate and equivalent auto-renewable in-app purchases in each app offered in the multi-app subscription so that users can subscribe from any app. To avoid users paying multiple times for the same offering, you are responsible for verifying that they are subscribers in one of the apps before showing any subscription options. To do this, consider maintaining an account management system in which users create an account with your business to sign in to each app.

那么有没有什么办法可以做到我们想要的,而不是强迫用户每个月都回到他用来购买订阅的应用程序?

在上次 WWDC 上,我们去了 StoreKit 实验室,并就此亲自询问了 StoreKit 布道者。我们被告知 iTunes validateReceipt 端点的 'latest_receipt_info' 字段 return 正是我们应该使用的,以检查订阅是否已续订。 这不会在不久的将来被弃用,但他们确实有计划添加一些服务器到服务器的通信来解决我们 运行 遇到的一些问题:

  1. 您的服务器将能够从 Apple 获得有关任何订阅续订、取消、降级等的通知。
  2. 在由 validateReceipt 端点编辑的 latest_receipt_info return 中,将添加一些字段,提供诸如当前订阅过期后订阅是否续订、收费是否有问题等信息用户信用卡等

来源:

WWDC 2017 Session 303 - What's new in StoreKit
WWDC 2017 Session 305 - Advanced StoreKit