iOS 中的收据验证在沙箱测试期间返回不正确的信息

2024-01-07

我正在为我的应用程序实施收据验证,因为它是付费的,并且在以后的应用程序内购买中将是免费的。

我已经设置了我的服务器和一切,并且我已经发送了收据数据。但是,当我收到响应时,无论如何,响应 JSON 总是显示original_application_version was 1.0。我验证收据背后的想法是,如果您的原始应用程序版本在 1.x 之前,那么您可以自动解锁高级版本。

然而,即使对于以前从未安装过该应用程序的全新 Beta 测试人员来说,original_application_versionJSON 中返回值 1.0。

我的服务器上的 URL 是https://sandbox.itunes.apple.com/verifyReceipt。当我将其更改为生产 URL 时,我得到了 21007 的响应(这意味着我应该更改为测试环境)。

有人经历过这个吗?我非常怀疑它会神奇地开始在生产中返回正确的值,但出于测试目的它完全被破坏了。它在 TestFlight 构建和直接从 Xcode 构建时返回不正确的信息。


您在沙盒环境中获得的内容与以下一致文档 https://developer.apple.com/library/archive/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW_9:

原始应用程序版本

最初购买的应用程序的版本。

这对应于以下值CFBundle版本(在 iOS 中)或 Info.plist 文件中的 CFBundleShortVersionString(在 macOS 中) 最初购买。

在沙箱环境中,该字段的值始终为“1.0”。

Ref: Receipt Fields: Original Application Version https://developer.apple.com/library/archive/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW_9

在沙箱环境下,该字段的值始终为1.0而在生产环境中,它将是CFBundleVersion用户第一次安装此应用程序的时间。

基于此,大多数人采用以下解决方案:

  • 他们改变了CFBundleVersion aka Build (not Version)新风格
  • 检查此值以区分旧的付费应用程序和较新的免费应用程序(使用 iAP)

WWDC2013 会议 308:使用收据保护您的数字销售 https://asciiwwdc.com/2013/sessions/308#t=602.326谈到了这个确切的场景,所以无论如何你所做的都是苹果推荐的。

Excerpt:

因此,对于今天在商店中拥有付费应用程序并且您想要的每个人 转变为具有应用内购买功能的免费应用程序, 以前这对你来说是一个很大的挑战,因为如果你 只需切换为具有应用内购买功能的免费应用程序,您的 客户将不得不再次购买所有这些应用内购买, 但他们已经为此付出了代价,他们不会喜欢这样的。

所以现在在收据本身中我们有日期,当用户第一次 购买了您的应用程序以及当时的版本。

所以你可以用它来做出真正明智的决定 关于授予该用户哪些功能和内容,因此如果您 应用程序查看收据并检查它,发现该用户购买了我的 在我通过应用内购买转为免费之前, 授予他们已支付的费用,但如果他们购买了您的应用程序 在您通过应用内购买过渡到免费后, 你知道,然后不要太解锁功能和内容,直到他们做出 购买,然后您使用收据本身验证该交易。

Ref: Using Receipts to Protect Your Digital Sales https://asciiwwdc.com/2013/sessions/308#t=602.326


Summary:

但您似乎已经在遵循这种方法。
唯一的问题是,在沙箱环境中,它总是1.0因为每次安装都被视为全新安装,没有结转信息。
因此,在投入生产之前你无法真正对其进行测试,这很可怕。

可行的解决方案:

那么如何测试以下场景呢?

  1. 用户在付款时安装的应用程序
  2. 用户在免费后安装了应用程序

嗯...我会用environment随着original_application_version...和 ​​2 个 TestFlight 版本:

案例 1:用户在免费后安装应用程序,但之前已付费

  • If environment shows Sandbox然后我会嘲笑original_application_version到旧的应用程序版本号并检查流程
  • Else environment shows Production我会采取original_application_version从收据
  • 提供 TestFlight 版本以及指示案例的发行说明

案例2:用户在免费后安装应用但未付费

  • If environment shows Sandbox然后我会嘲笑original_application_version到新的应用程序版本号并检查流程
  • Else environment shows Production我会采取original_application_version从收据
  • 提供 TestFlight 版本以及指示案例的发行说明

无论哪种情况,我当然都会得到正确的收据,并注意,如果 QA 通过,两个 TestFlight 版本都是可以发布的,只要我们的else条件保证工作:采取的部分original_application_version从收据。


PS:这是我目前能想到的最好的解决方案

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

iOS 中的收据验证在沙箱测试期间返回不正确的信息 的相关文章

  • 无法构建 Saurik 的 ldid 实用程序

    当我执行此命令 make sh 时 我遇到这些错误 构建用于越狱调整开发的 ldid 实用程序 Bilals Mac ldid billy make sh g arch i386 arch x86 64 arch ppc arch armv
  • 从 UIImagePickerController 相机视图推送 viewController

    我正在开发一款消息应用程序 类似于 WhatsApp 用户可以互相发送文本和图像消息 当用户想要发送图像时 他可以从相机胶卷中选择一张图像 也可以用相机拍摄一张图像 这就是我介绍的方式UIImagePickerController对于这两种
  • UIButton 导致无法识别的选择器发送到实例

    我正在尝试使用 for 循环创建多个按钮 但在使用 sender 函数时遇到问题 我有以下代码 func setUpButtons for i in 1 3 let btn UIButton UIButton frame CGRect x
  • 如何替换已弃用的方法dispatch_get_current_queue()? [复制]

    这个问题在这里已经有答案了 我正在 iOS 5 中使用 xmppframework 开发一个聊天应用程序 它工作得很好 但我将 Xcode 更新到 4 5 1 将 iOS 5 更新到 iOS 6 将 Mac OS 更新到 10 7 5 但由
  • 在没有预览窗口的情况下使用 AVCaptureVideoDataOutputSampleBufferDelegate

    我正在开发一个基于 Swift 的 macOS 应用程序 我需要捕获视频输入 但不将其显示在屏幕上 而不是显示视频 我想将缓冲的数据发送到其他地方进行处理 并最终显示它在 a 中的一个物体上SceneKit scene 我有一个Camera
  • 如何知道我的应用程序使用了多少 iCloud 空间?

    有没有办法查看我的应用程序正在备份到 iCloud 的内容以及它消耗了多少内存 Settings gt iCloud gt Storage Backup gt Manage Storage将显示正在备份的总计内容 iOS 会备份位于应用程序
  • 如何在 iOS 9 上可靠地检测是否连接了外部键盘?

    在 iOS 9 之前 确定是否连接外部键盘的最可靠方法是监听UIKeyboardWillShowNotification并使文本字段成为第一响应者 如中所述这个问题 https stackoverflow com questions 289
  • 使用完成处理程序在 Swift 中调用连续动画

    我正在制作一个可以显示化学反应动画的应用程序 每个原子都是一个 SCNSphere 并通过 SCNActions 进行动画处理 我尝试使用 runAction 中的完成处理程序在当前操作完成后调用下一个动画 因为每个原子必须做出很多不同的运
  • 导入 RNCryptor 后架构 armv7 的未定义符号

    我导入了 RNCryptor 可以在这里找到 https github com rnapier RNCryptor https github com rnapier RNCryptor进入我的应用程序 但是 我在日志中收到了三个错误 Und
  • UIButton的高亮状态由什么控制事件开始和结束

    我正在创建类似钢琴的视图UIButton作为钢琴键 什么UIControlEvents当按钮获得和失去突出显示状态时 我应该监听以获得回调吗 我试图创建子类UIButton并添加属性观察者highlighted并且运行良好 然而 有时我需要
  • 覆盖层不与 UITableView 一起滚动 - iOS

    我有一个 UITableView 类 它使用以下方法在转到下一个屏幕时调用加载覆盖 问题是这个加载屏幕不随列表滚动 所以如果你滚动一点并单击某些东西 加载屏幕不会显示 因为它位于顶部 如何让加载屏幕始终保持在 UITableView 的顶部
  • 将 SSLSetEnabledCiphers 与 AFNetworking 结合使用来禁用弱密码

    我正在尝试禁用一些密码 弱 例如单个 DES 单个 DES 40 位等 我尝试过使用这段代码在 Cocoa 中使用 CFSocket CFStream 时如何设置 SSL 密码 https stackoverflow com questio
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • Firebase 身份验证问题 - 通过电子邮件地址检查用户是否存在

    我在 Firebase 上创建了一个帐户 它有效 但现在我想阻止人们使用已存在的电子邮件地址创建帐户 这是代码 DatabaseManager shared userExists with email completion weak sel
  • 推送动画,没有阴影和停电

    我有一个简单的iOS NavigationController基于应用程序 二UICollectionViews 相继 如果元素打开 第一个合集 被点击时 第二集 将被打开 非常简单 重要的提示 Both UICollectionViews
  • Apple Watch 预构建操作可更改故事板 customModule 引用

    我目前有一个项目 其中包含同一应用程序的 3 个不同版本 不同的品牌等 该项目运行得很好 从那时起 我添加了 3 个新的 Apple Watch 目标 每个应用程序 版本 1 个 其中 2 个引用 主 Apple Watch 目标中的文件
  • 如何让按钮闪烁?

    我试图在扫描正确时将按钮的颜色 只是闪烁 闪烁 更改为绿色 在出现问题时将按钮的颜色更改为红色 我可以用这样的视图来做到这一点 func flashBG UIView animateWithDuration 0 7 animations s
  • 水平 UICollectionView 单行布局

    我正在尝试使用以下命令设置简单的水平布局UICollectionView 兜圈子却没有达到预期的结果 所以任何指针或例子将不胜感激 我粘贴经常更改的代码但没有成功可能没什么意义 该图像显示两行 第一行是单个项目 尺寸正确并且在中心正确对齐
  • PFQueryTableViewController 错误

    我正在遵循在线教程 使用 Parse 作为后端创建照片共享应用程序 我已经运行了两次教程 两次都从头开始创建应用程序 但在同一位置仍然出现相同的错误 我到处寻找解决方案 但仍然没有运气 我正在使用 PFQueryTableViewContr
  • UIView晃动动画

    我试图在按下按钮时使 UIView 摇动 我正在调整我找到的代码http www cimgf com 2008 02 27 core animation tutorial window shake effect http www cimgf

随机推荐