您在沙盒环境中获得的内容与以下一致文档 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
因为每次安装都被视为全新安装,没有结转信息。
因此,在投入生产之前你无法真正对其进行测试,这很可怕。
可行的解决方案:
那么如何测试以下场景呢?
- 用户在付款时安装的应用程序
- 用户在免费后安装了应用程序
嗯...我会用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:这是我目前能想到的最好的解决方案