iOS:应用程序内购买管理多个自动续订订阅,具有升级和降级选项

2023-11-26

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

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

我们将在应用程序内有一个商店屏幕,其中包含订阅我们应用程序提供的各种订阅的选项。

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

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

  • 免费提供任意 4 个订阅选项
  • 单月改为单年
  • 单身包月到家庭包月
  • 单人每月一次到家庭每年一次
  • 家庭每月到家庭每年

可能的降级选项:

  • 家庭每年到家庭每月
  • 家庭每年到单身每月
  • 家庭包月到单身包月
  • 单年改为单月
  • 从任意 4 个订阅选项到免费版本

Note:

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

Queries:

  1. 我们有一些疑问如何在 iOS 应用程序中管理订阅?
  2. 设备设置选项将如何显示我们的 4 个应用内购买选项,用于从一个选项升级到另一个选项?
  3. 作为 iOS 开发者,恢复自动续订订阅需要注意哪些事项?我们不清楚如果用户尝试在我们的应用程序中使用具有多个用户帐户的 iTunes 帐户进行恢复,可能会出现什么情况,当用户购买一次订阅并尝试在多个用户帐户上恢复时,苹果允许采取哪些预防措施?
  4. 苹果将​​拒绝使用自动续订订阅选项的自定义家庭共享选项?
  5. 如果我们能够使用以上功能,那么最终我们需要注意哪些点是苹果无法处理的呢?
  6. 如果我们在 iOS 应用程序中使用上述功能,违反苹果指南和应用程序拒绝的可能性有哪些?

如果有人能分享他们的观点或提供一些指导,告诉我们应该走哪条路,或者我们是否偏离了苹果政策的轨道……所有这些反馈将帮助我们获得东西在这儿移动。

Thanks


  1. 我们有一些疑问如何在 iOS 应用程序中管理订阅?

由于您使用自己的用户管理系统,因此您应该在数据库中保留与用户关联的订阅状态。当用户在应用程序中创建购买时,应用程序应将此收据发送到您的 API,然后该 API 将继续验证它.

一旦持久化,将计划的进程排入队列以在订阅到期日期无限更新记录,直到过期日期不再是未来。

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

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

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

当用户在产品之间切换时,将创建一个交易并SKPaymentTransactionStatePurchased事件将被添加到SKPaymentQueue。这将是一笔具有相同内容的新交易原始交易标识符作为首次购买同一订阅系列的产品产品标识符反映新产品。

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

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

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

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

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

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

  1. 苹果将​​拒绝使用自动续订订阅选项的自定义家庭共享选项?

我对此表示怀疑,但我不是苹果公司,所以不要相信我的话。 Spotify 有一个类似的计划,称为“Spotify 家族“用户可以与家人共享他们的 Spotify 帐户,但不确定他们的 iTunes 应用程序是否启用了此功能。

  1. 如果我们能够使用以上功能,那么最终我们需要注意哪些点是苹果无法处理的呢?
  1. 您需要自己的 API 来进行用户管理和家庭关联
  2. 您的用户需要在您的应用程序上登录/注册
  3. 如果家庭用户的家长帐户已经购买过商品,您将需要阻止其购买。
  4. 将收据和供应商标识符保留在数据库中。
  5. 使用处理收据验证验证API.
  6. 持久保存一个事务表,并认为该表是自引用的,以便事务可以通过以下方式属于原始事务:original_transaction_id。确保transaction_id专栏是独一无二的。
  7. 每次交易到期更新时验证收据。
  1. 如果我们在 iOS 应用程序中使用上述功能,违反苹果指南和应用程序拒绝的可能性有哪些?

我在其中什么也没看到指导方针除了部分17.2:

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

我认为这有点矛盾,因为17.5它指出:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS:应用程序内购买管理多个自动续订订阅,具有升级和降级选项 的相关文章

  • ios7 navigationController PushViewController 动画错误

    看来我在 navigationController PushViewController 方法中发现了一个错误 为了重新创建它 我采用了示例主详细信息项目并对 didSelectRow method void tableView UITab
  • 在 iOS 上使用 Web 服务的最佳方式?

    我想构建一个 iOS 应用程序 让您登录到网络服务 之后 应用程序将 当用户选择时 通过 https 发送登录名 密码以及请求的变量 例如 在请求 新闻更新 后 它将收到 XML 格式的请求信息 类似于
  • 在带有 Storyboard 的 XCode 4 中以模态方式推送视图时,出现“对开始/结束外观转换的不平衡调用”警告

    在网上进行了一些研究但没有成功后 我来这里向您询问有关我的警告的问题 实际上 我有一个带有导航控制器的视图 V1 我想在 V1 完成加载时推送模态视图 V2 所以我用performSegueWithIdentifier方法 我正在使用故事板
  • 为什么我不能在 Realm 属性上使用 private

    我正在尝试在 RealmSwift 中存储一个枚举案例 但 Realm 不支持枚举 本文 https medium com it works locally persisting swift enumerations with realm
  • 如何解决 CoreData mogenerator 未找到问题

    我收到如下所示的错误 我不知道我错过了什么 我该如何解决这个问题 如下图所示 Users nischalhada Documents XcodePro mnepalnews revisited 2 0 CoreData mogenerato
  • iOS 滚动视图允许滚动过去的内容

    我正在努力优化我的应用程序以适应横向和较小的屏幕 我主要使用滚动视图来实现这一点 在我的其中一个视图中 我有一个容器视图 当我在故事板中的设备之间切换时 这个容器视图看起来很完美 容器视图映射到具有滚动视图的视图控制器 该滚动视图的顶部 底
  • 为什么这个谓词格式会变成 '= nil'

    有人建议这个线程 https stackoverflow com questions 40686005 nspredicate crash after swift 3 migration与我的问题完全相同 但是 我的应用程序没有崩溃 并且我
  • iOS 中的构建对象文件扩展名是什么?

    当我在项目中构建java对象类时 将创建带有 class扩展名的构建文件 并且人类不可读 快速构建文件怎么样 example car java gt build gt car class 构建后会是什么 car swift gt build
  • 如何恢复消耗品应用内购买?

    我正在开发一款 iOS 游戏 用户可以通过应用内消耗品购买一定数量的内部货币 比如 1000 金币 如果用户想将余额从一台设备转移到另一台设备 如何恢复消耗品购买 在苹果的文档中 它说我们必须使用我们自己的服务器 但是如何获取用户的Appl
  • 进入前台后刷新数据

    更改默认设置后 我想在AppDelegate中进入前台时刷新myViewController的数据 我所做的是 AppDelegate m void applicationDidFinishLaunching UIApplication a
  • 关于窗口层次结构的警告

    我的调试器中出现这样的警告 这是什么意思 Warning Attempt to present
  • 架构armv7的重复符号

    尝试在我现有的应用程序中使用 Layar SDK 时出现以下错误 我该如何解决这个问题 Ld Users pnawale Library Developer Xcode DerivedData hub afxxzaqisdfliwbzxbi
  • iphone:如何停止快门动画?

    我有两个问题 1 我想知道如何在相机加载时停止快门动画 我正在使用 UIImagePickerController 我已经参考了堆栈溢出的许多答案 但没有成功 2 我在相机中有一个自定义按钮 使用cameraOverlayView并想通过单
  • 指定访问组时出现 KeychainItemWrapper 错误

    相当长一段时间以来 我一直在使用 KeychainItemWrapper 的 ARC 版本成功读取和写入私有钥匙串项目 我现在正在努力将我的 iOS 应用程序转换为使用共享访问组 以便我的 2 个共享相同应用程序前缀的应用程序可以访问钥匙串
  • 为什么我的视图仍然以横向呈现?

    我的视图是由导航控制器控制的 因此我将导航控制器支持的方向设置为明确的纵向和纵向UpSideDown 这可以工作 但是如果调用视图时前一个视图处于横向状态 它将以横向方式呈现并保持横向状态 直到设备旋转 如何防止这种情况发生 这是我的代码
  • SKNode 上的 runAction 未完成

    我使用 NSOperation 子类来获取串行执行SKAction正如这个问题中所描述的 如何在 Swift 中子类化 NSOperation 以将 SKAction 对象排队以进行串行执行 https stackoverflow com
  • Swift C 回调 - Swift 类指针的 takeUnretainedValue 或 takeRetainedValue

    我有一些UIView or UITableViewCell 里面我有 C 回调 例如 CCallback bridge self observer data gt Void in let mySelf Unmanaged
  • init 中的 Swift 通用约束

    我有通用的 我希望能够用特定的约束来初始化它 约束仅用于初始化 班里的其他人并不关心 这是一个简化的示例 struct Generic
  • 苹果推送通知在生产中不起作用

    我们完全陷入困境 请帮忙 我和我的团队制作了一个 iPhone 应用程序 这是我们第一次在 iOS 上尝试 一切都很好 直到我们提交应用程序并在应用程序商店上可用为止 推送通知服务无法正常工作 我在网上搜索并尝试根据人们的建议仔细检查我们的
  • IPV6 快速可达性

    我是 swift 和 xcode 的新手 并且我的应用程序因 IPV6 而被拒绝 性能 2 1 当我们执行以下操作时 您的应用程序会在运行 iOS 9 3 5 并连接到 IPv6 网络的 iPad 和 iPhone 上崩溃 具体来说 当我们

随机推荐

  • Rails 3.2.8 Application.js 和 Application.css 未按预期工作

    当我尝试包括 application css 文件的内容是 This is a manifest file that ll be compiled into application css which will include all th
  • 为什么弹性物品不包裹?

    我正在尝试制作多行具有相同高度的正方形 每行 3 个 我为此编写了一些 HTML 和 CSS 但这些框都位于同一行 这是我到目前为止所拥有的 list wrapper display flex width 100 list wrapper
  • 自动 XSD 验证

    根据 lxml 文档 DTD 是根据解析文档的 DOCTYPE 自动检索的 您所要做的就是使用启用了 DTD 验证的解析器 http lxml de validation html validation at parse time 但是 如
  • 简单的日志文件格式

    我不确定是否有人问过 但我找不到这样的东西 我的程序使用一个简单的 txt 文件用于日志目的 它只是创建 打开一个文件并附加行 一段时间后 我开始记录相当多的活动 因此文件变得太大并且难以读取 我知道 这不是写的方式来做到这一点 但我只需要
  • 在网页中嵌入视频 (HTML)

    我想在网页中嵌入视频 我不想使用 Flash 因为它不适用于大量平台 我不愿意使用 HTML5 因为它还不太标准 它是标准 但大多数人没有支持它的浏览器 还有其他办法吗 或者我应该坚持使用 HTML5 和一个巨大的横幅告诉人们升级他们的浏览
  • ASP.NET ConnectionString AttachDbFilename=|数据目录|

    这是关于 ConnectionStrings ASP NET MVC 与 Visual Studio 2012 Ultimate 和 SQL Server Express 2012 的内容 在此继续本教程 http www asp net
  • 与伞式框架的链接

    我有 ios 应用程序 我想在其中实现 Flurry analytics 导入 Flurry 并 ling libsystem network dylib 后 我遇到了这个无法解决的问题 ld cannot link directly wi
  • Django/mod_wsgi OSError: [Errno 13] 权限被拒绝: 当 DEBUG = OFF 时为“静态”

    我在 Centos 6 2 服务器 运行 apache mysql php 上有一个 Django 1 4 应用程序 使用 mod wsgi 并将我的项目部署在虚拟环境中 该应用程序本身是我在托管服务上使用多年的应用程序 现在我正在自己的机
  • next.js getStaticPaths 列出每个路径还是仅列出附近的路径?

    使用 Next js 导出静态页面 我在动态路由中得到了这样的结果pages id js我放入的任何路径getStaticPaths将创建部分 凉爽的 列出每一页是否更好 getStaticPaths return some functio
  • 将 Powerpoint 演示嵌入到 C# 应用程序中

    我希望能够将 powerpoint 演示文稿嵌入到 C 表单 WinForms 中 基本上我们有一台 52 英寸的显示器 其想法是在一个角落循环播放 PPT 然后其他 3 个角落将显示程序本身的信息 我原以为这会很简单 但看来我错了 有人建
  • Windows 文件路径路径中的空格

    我正在使用 python 进行文件操作 我的文件路径为 filepath E ABC SEM 2 testfiles all txt 当我使用 python 打开文件时 它说 IOError No such file 但是 该文件存在于驱动
  • 如何在重定向到外部页面之前在 jquery 中预加载(缓存)该页面?

    我正在做一个phonegap应用程序 我有一个 index html 页面 其中有一个重定向到网站应用程序的登录按钮 当点击登录按钮时 我想要一个加载 gif 来显示页面 正在被缓存 预加载并在完成后重定向到页面 我希望有一个示例脚本代码
  • 改变material-ui按钮的字体大小,并让按钮缩放?

    我似乎在更改 Material UI 用于 React RaishedButton 上的字体大小以及让按钮本身与其正确缩放时遇到问题
  • Visual Studio 中的静态和动态链接

    我理解静态和动态链接的概念 据了解 在Windows平台上 dll是动态库和 lib是静态库 我的困惑 我做了一个必须使用 OpenCV 库的项目 基本上 我必须使用以下 5 个 OpenCV 库 lopencv core lopencv
  • jQuery $.post 和 json_encode 返回一个带有引号的字符串

    我正在使用 jQuery 的 post 调用 它返回一个带有引号的字符串 引号是由 json encode 行添加的 如何阻止添加引号 我在 post 通话中遗漏了什么吗 post getSale php function data con
  • 检查表是否存在[重复]

    这个问题在这里已经有答案了 我有一个桌面应用程序 其中嵌入了数据库 当我执行程序时 我需要检查特定的表是否存在 如果不存在则创建它 给定我的数据库的名为 conn 的 Connection 对象 我如何检查它 DatabaseMetaDat
  • JavaScript 执行连接到 mongoHQ shell 失败

    尝试直接访问 MongoHQ gt mongo mongodb heroku email protected 10046 myapp MongoDB shell version 2 4 3 connecting to mongodb her
  • 是否可以通过编程方式清除控制台历史记录?

    使用控制台应用程序时 在某个位置输入的所有内容的历史记录Console ReadLine 被储存了 当控制台提示输入某些内容时 按向上 向下光标将滚动浏览此历史记录 并且可以通过按 F7 查看整个历史记录 使用 C 是否有办法禁用此行为或清
  • 从 YouTube 网址获取持续时间

    我正在寻找一个函数 可以从 url 中提取视频的 YouTube 持续时间 我读了一些教程但不明白 我使用网址在我的网站上嵌入视频 并且我有一个提取缩略图的功能 我只想要类似的东西来获取持续时间 这是我如何获得拇指 function get
  • iOS:应用程序内购买管理多个自动续订订阅,具有升级和降级选项

    我们正在为 iPhone 开发一款 iOS 应用程序 该应用程序将具有免费功能 并且该应用程序将具有高级功能 其中有 4 个应用程序内购买自动续订订阅选项 如下所示 单月订阅 单年订阅 家庭包月 家庭每年订阅 我们将在应用程序内有一个商店屏