iOS:应用内购买管理多个自动更新订阅,带有升级和降级选项

Posted

技术标签:

【中文标题】iOS:应用内购买管理多个自动更新订阅,带有升级和降级选项【英文标题】:iOS: In App Purchase managing multiple auto-renewable subscriptions with upgrade and down grade option 【发布时间】:2016-06-23 18:58:34 【问题描述】:

我们正在开发一款适用于 iPhone 的 ios 应用程序,该应用程序将提供免费功能,并且应用程序将具有高级功能,其中包含 4 个应用内购买自动续订订阅选项,如下所示:

单月订阅 单年订阅 家庭包月 家庭包年

我们将在应用程序中拥有一个商店屏幕,它可以选择订阅我们的应用程序提供的各种订阅。

我们发现用户可以转到设备设置并管理他们的应用内购买订阅。

我们还计划提供选项,例如用户可以从一个订阅升级到另一个订阅,并且用户还应该能够降级他们的订阅,这将是所有相同的选项,反过来又回到免费版本 可能的升级选项:

免费提供任意 4 种订阅选项 单月到单年 单月到家庭月 每月一次到家庭每年一次 家庭每月到家庭每年

可能的降级选项:

家庭每年到家庭每月 家庭每年到单月 家庭月到单月 单年到单月 从任意 4 个订阅选项到免费版

注意:

根据 Apple 的说法,我们不能使用 Apple 家庭共享选项来共享应用内购买,因此我们正在应用程序中开发自己的家庭共享选项。 (参考:https://support.apple.com/en-in/HT203046)

查询:

    我们对如何在 iOS 应用程序中管理订阅存有疑问? 设备设置选项将如何显示我们的 4 个应用内购买选项,用于从一个选项升级和降级到另一个选项? 作为 iOS 开发人员,我们需要注意哪些事项来恢复自动更新订阅?如果用户尝试在我们的应用程序中使用具有多个用户帐户的 iTunes 帐户进行恢复,我们不清楚可能的情况,我们可以采取哪些预防措施,当用户购买一次订阅并尝试在多个用户帐户上恢复时,苹果允许哪些预防措施? Apple 将拒绝使用自动续订订阅选项的自定义家庭共享选项? 如果我们可以使用上述功能,我们最终需要注意哪些苹果不会处理? 如果我们在 iOS 应用程序中使用上述功能,违反苹果指南和应用程序拒绝的可能性有哪些?

如果有人能分享他们的观点或就我们应该采取的方式提供一些指导,或者我们是否偏离了苹果政策的轨道,这将对我们有很大帮助......您的所有这些反馈都会有所帮助我们把东西搬到这里来。

谢谢

【问题讨论】:

订阅链接到一个 Apple ID;如果您选择允许将多个用户帐户链接到单个订阅购买,这取决于您,但用户将只能使用用于订阅的 Apple ID 恢复购买。至于苹果是否会拒绝你的应用,这个在 SO 上无法回答;只有苹果可以说。 感谢@Paulw11 的快速反馈,是的,允许多个用户帐户链接到我们可以从后端处理的单个订阅,因为在某些实时场景中可以像夫妻一样可能会使用相同的苹果 ID 进行应用内购买,但我想知道我们是否这样做苹果会拒绝我们的应用:( @Paulw11,似乎苹果允许通过在与服务器的收据验证中发送其他详细信息来限制用户,通过使用我们可以在其他用户尝试恢复时识别哪个用户与购买交易相关联。 坚持使用您自己的服务器将收据的副本连同某种凭据或标识符一起发送到您的服务器,以便您可以跟踪哪些收据属于特定用户参考:developer.apple.com/library/prerelease/ios/documentation/… 是的,您可以将订阅与用户 ID 相关联,我相信如果您想要的话,您应该能够将多个帐户与订阅相关联,但正如我所说,只有 Apple可以说他们是否会批准。 【参考方案1】:
    我们对如何在 iOS 应用程序中管理订阅存有疑问?

因为您使用的是自己的用户管理系统,所以您应该将与数据库中的用户关联的订阅状态保持不变。当用户在应用中创建购买时,应用应将此收据发送到您的 API,然后 API 将继续发送到 validate it。

一旦持久化,将一个计划进程排入队列以在Subscription Expiration Date 上运行,以更新记录并无限期地更新,直到到期日期不再是未来。

当用户打开应用以确定其订阅状态时,您的应用应查询您的 API。不要依赖应用中本地的收据,因为您用户的家庭成员设备不会关联此次购买。

    设备设置选项将如何显示我们的 4 个应用内购买选项,用于从一个选项升级和降级到另一个选项?

如果 iTunes Connect 中列出的所有产品属于同一个“订阅系列”,它们将出现在用户 iTunes 帐户的订阅管理页面中。

当用户在产品之间切换时,将创建一个事务并将一个SKPaymentTransactionStatePurchased 事件添加到SKPaymentQueue。这将是一笔新交易,其Original Transaction Identifier 与第一次购买来自同一订阅系列的产品相同,Product Identifier 反映了新产品。

因此,您希望应用中的事务观察器在后台运行以接收任何新事务。收到新交易时,您可以 a) 将整个收据发送到您的 API 或 b) 通知您的 API 已收到新交易并重新验证已保留的收据。

使用 (a) 可能会出现问题,因为随着时间的推移,收据会变得越来越大,每次都需要用户提供更多带宽。

使用 (b) 也有其缺点,因为您可能会遇到诸如用户切换 iTunes 帐户等边缘情况的麻烦。解决方案是将应用程序identifierForVendor 与收据一起存储,如果不匹配,则要求应用程序发送整个收据。大多数情况下,您只会通知 API 发生了交易,在少数情况下标识符不匹配,它会发送新的收据。

    作为 iOS 开发人员,我们需要注意哪些事项来恢复自动更新订阅?如果用户尝试在我们的应用程序中使用具有多个用户帐户的 iTunes 帐户进行恢复,我们不清楚可能的情况,我们可以采取哪些预防措施,当用户购买一次订阅并尝试在多个用户帐户上恢复时,苹果允许哪些措施?

恢复时,将创建具有新事务 ID 的新事务,但原始事务 ID 将相同。如果您在数据库中创建交易表,则可以确保交易及其原始交易只与单个用户相关联,从而防止用户在其他设备上恢复购买并获得对订阅的访问权限。

恢复的交易将被推入队列SKPaymentTransactionStateRestored,所以当这种情况发生时,我建议将收据发送到您的 API 并正常处理收据;将任何新交易与原始用户相关联。

    Apple 将拒绝使用自动续订订阅选项的自定义家庭共享选项?

我对此表示怀疑,但我不是 Apple,所以不要相信我的话。 Spotify 有一个名为“Spotify Family”的类似方案,用户可以与家人共享他们的 Spotify 帐户,但不确定是否为他们的 iTunes 应用启用了此功能。

    如果我们可以使用上述功能,我们最终需要注意哪些苹果不会处理?
    您需要自己的 API 以及用户管理和家庭关联 您的用户需要在您的应用上登录/注册 如果家庭用户的父帐户已经购买过商品,您需要阻止他们购买。 将收据和标识符保留在数据库中。 使用validation API 处理收据验证。 保留一个事务表并认为该表是自引用的,以便事务可以通过original_transaction_id 属于原始事务。确保 transaction_id 列是唯一的。 每次交易到期续订时验证收据。
    如果我们在 iOS 应用程序中使用上述功能,违反苹果指南和应用程序拒绝的可能性有哪些?

我在guidelines 中看不到任何内容,除了第 17.2 部分:

要求用户分享个人信息(例如电子邮件地址和出生日期)才能正常运行的应用将被拒绝

我认为这个有点矛盾,因为在 17.5 中它声明:

包含帐户注册或访问用户现有帐户的应用必须包含隐私政策,否则将被拒绝

我想这意味着用户必须能够在无需注册的情况下使用该应用程序,但我知道很多应用程序的例子就是这样做的。

【讨论】:

这个答案是救命稻草。我建议将其转换/扩展为解决一般问题的博客文章“我的应用程序的用户管理与 iTunes Connect/Apple Pay 中的用户管理之间应该有什么关系。” 在沙盒应用内购买测试中,我在同一组中购买了 2 件产品。我认为应该只订阅最新的,同一组中的其他人会自动取消。是吗?如果是,那么为什么我在同一组中购买了 2 件商品?

以上是关于iOS:应用内购买管理多个自动更新订阅,带有升级和降级选项的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 应用中管理应用内购买订阅的多个服务级别的流程是啥?

关于应用内购买的问题:自动更新订阅

消耗品自动更新订阅 iOS

在应用内购买中取消自动续订订阅

处理“终身”订阅以及自动续订应用内购买

iOS - 在一台设备上支持多个用户帐户的应用中的可更新应用内购买