通过应用内购买将现有iOS付费应用转换为免费增值模式

fri*_*ley 49 app-store in-app-purchase ios

我目前在商店里有一个付费应用程序.Apple还没有允许提交'lite'版本,因此我别无选择,只能将当前的付费版本更新为免费增值(在应用内购买)模式.我有一个问题,即第一次购买应用程序的v1用户不会失去功能.

有没有办法确定应用程序是否已从以前安装的版本更新,以便我可以解锁应用程序的付费部分?

两个相似的问题(几个月前):

使用In App Purchase将现有付费应用转换为免费版

iPhone +将应用程序商店中的现有付费应用程序升级为免费应用程序,并购买In App +已购买付费应用程序的客户

spi*_*her 24

现在有一种Apple批准的方法可以在iOS和macOS上执行此操作.可以使用信息密钥从收据中获取最初下载的应用版本Original Purchased Version.然后,如果该版本早于切换到IAP,则可以决定是否解锁功能.

例如,一旦您检索到收据信息:

NSArray *versionsSoldWithoutIAP = @[@"1.0", @"1.1", @"1.2", @"1.3"];
NSString *originalPurchasedVersion = [receiptInfoDict objectForKey:@"Original Purchased Version"];
for (NSString *version in versionsSoldWithoutIAP) {
    if ([version isEqualToString:originalPurchasedVersion]) {
        // user paid for the currently installed version
    }
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅WWDC 13视频使用收据保护您的数字销售.在5点40分,主持人评论道:"我认为今年收据中最令人兴奋的事情,特别是对于你们,如果你们在商店里有付费应用程序,我们已经在收据中包含了可以让你们的信息.通过应用内购买实现从付费应用转变为免费应用,而不会留下已经为您的应用付费的所有客户."


小智 20

使用iOS7,iOS应用程序可以验证应用商店收据,其中包含应用下载日期.通过使用此下载日期,您可以确定客户以前是否购买过

  • 为了扩展这一点,`NSBundle`有一个属性 - "appStoreReceiptURL",它可以(但不保证)返回应用程序的收据历史记录.虽然我认为它不包含应用程序本身的下载日期(根据收据字段文档,它是IAP收据上的字段,而不是应用程序收据),您可以获取最初购买的版本号并将其用于校验.随意纠正我,我还没有测试过. (4认同)

And*_*rew 11

首先,我只想说我个人认为免费增值模式很棒.对许多开发人员来说,它已经非常好用了.人们喜欢下载免费的应用程序,并且会随心所欲地做到这一点,但是在花费0.99美元之前更加关注应用程序(这是由于免费的影响 - 有关更多信息,请查看Dan Ariely的书Predictably Irrational)

有关免费增值的更多信息,请谷歌 - 有大量关于它成功的文章.


好的,回到实际问题:

有几种方法你可以像这样处理这种情况,虽然不幸的是这里没有一个是傻瓜证明.

  • 最好的解决方案可能是您的用户拥有帐户.在不知道您的应用程序细节的情况下,我无法确定用户帐户是否适合您的应用.存储在服务器上的用户帐户具有许多其他好处,包括用户管理和跟踪用户购买的内容.这将允许删除应用程序,然后重新安装或获取新设备的用户维护其购买的内容.更糟糕的是,无论何时使用应用程序内购买,您都应该在自己的服务器(或Apple)上验证购买,基于服务器的用户管理系统都可以这样做. 如果您完全专注于创建自己的用户管理服务器,请查看Parse.它很简单,可以创建一个惊人的后端服务器(基本上免费)
  • iCloud Key/Value类型的系统.我不太熟悉它是如何工作的 - 所以我会继续前进.
  • 另一个,不是几乎作为万无一失的解决方案(但更快/更容易实现)是使用NSUserDefaults.您可以在用户进行购买时存储对象,也可以使用用户安装应用程序的日期存储对象.然后,如果您发布将应用转换为免费增值的更新.然后在新的更新中,检查用户所做的购买或安装的日期,并做出相应的反应.有关如何使用的信息NSUserDefaults,请查看我关于实现该问题的另一个问题的答案:NSUserDefaults和应用程序版本.但是这个解决方案确实存在以下缺陷:

  • 如果用户删除了您的应用,NSUserDefaults则会永久丢失

  • 如果用户未安装更新设置NSUserDefault系统,但随后使用新的免费增值模型安装了更新,则应用程序会将其视为未购买内容.

总而言之,这是一个难题,没有很多简单/完美的选择.

无论如何,

希望有所帮助!

  • 此解决方案不能保护您免受原始付费用户删除然后重新安装该应用程序的影响.在这种情况下,用户默认值将被删除,然后在重新安装免费增值版本后,他/她将失去额外的功能.因此,通过将当前客户的UDID保存在服务器中,可以改进部分工作的解决方案,从而提供额外的保护.当然,您仍然无法保护用户删除应用并完全重置iPhone.但这是一个小案例. (3认同)
  • 如果可能的话,最好将它存储在iCloud Key/Value Store中,而不是用户默认值,因为当用户删除应用程序时它们会被删除! (3认同)