Iphone 通过应用内购买将现有付费应用转换为免费版本

Iphone 通过应用内购买将现有付费应用转换为免费版本,iphone,in-app-purchase,Iphone,In App Purchase,我在应用商店中有付费应用的现有用户。我想将应用程序转换为具有解锁功能的免费应用程序。有没有办法将我现有的用户加入到这个新的免费版本中,允许付费“升级”,这样现有用户就被视为已经付费升级了?或者,正如我所料,随着应用程序开发的推进,我们必须保持两个独立的代码库,而不是通过强迫现有客户再次购买来激怒他们吗 我知道,最初这个问题不会有太多权威的答案,因为苹果直到今天才开始允许从免费应用程序中支持应用程序内购买…你不应该需要两个独立的代码库-使用和构建两个目标。一个可能的解决方案可能是将代码放在付费应用

我在应用商店中有付费应用的现有用户。我想将应用程序转换为具有解锁功能的免费应用程序。有没有办法将我现有的用户加入到这个新的免费版本中,允许付费“升级”,这样现有用户就被视为已经付费升级了?或者,正如我所料,随着应用程序开发的推进,我们必须保持两个独立的代码库,而不是通过强迫现有客户再次购买来激怒他们吗


我知道,最初这个问题不会有太多权威的答案,因为苹果直到今天才开始允许从免费应用程序中支持应用程序内购买…

你不应该需要两个独立的代码库-使用和构建两个目标。

一个可能的解决方案可能是将代码放在付费应用程序的新更新中该应用程序将翻转您用来识别付费客户的任何开关(无论是以财产清单还是其他形式)。如果您给现有付费客户足够的时间升级,则应将其标记为已付费。然后,将您的付费版本设置为免费/付费升级版本,并从应用商店中删除您现有的“Lite”版本。新客户将不得不使用应用内购买解锁完整版本,但现有客户将被确认为已付款


这样做的一个问题是,如何让所有现有客户升级到中间版本,及时翻转“付费”开关,将应用程序迁移到免费/付费升级模式

有什么方法可以判断你的应用程序以前是否运行过?(如退出时写入的设置、创建的数据文件、首次运行的日期戳?)

如果是这样,您可以在升级中添加代码,如:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (nil == [defaults objectForKey:@"app_v2_has_been_run"]) {
    if (nil == [defaults objectForKey:@"some_key_v1_makes"] {
         // they never had v1 of your app
    } else {
         // they had v1 of your app, so unlock some stuff for them
    }
    [defaults setObject:[NSDate date] forKey:@"app_v2_has_been_run"]; // or whatever
}

对我来说,维护两个独立的代码库并不是一个好的解决方案,因为你需要维护两个应用内购买(更糟糕的是使用服务器进行应用内购买),可能是两个游戏中心,并分离你的下载(因此不太可见),因为可能有新用户会直接购买付费应用

但要将付费应用程序改为免费应用程序,我没有好办法,主要原因是如果你升级了你的设备,并清理了它,你就没有什么东西不让免费应用程序给第一个付费的用户,也没有真正愤怒的用户

最好的方法是让苹果数据库知道用户何时购买应用程序或类似的东西。
如果有人知道这样做的诀窍,我会喜欢他分享;)

最可靠的解决方案是进行收据验证。如果你没有与你的应用程序通信的服务器,你可以借助OpenSSL在设备上进行通信。(有关详细信息,请查看WWDC收据验证视频。)
关键是收据有一个属性,告诉你用户最初购买应用程序的版本。根据此信息,您可以解锁现有客户的功能。

目前没有,就像没有定期升级一样。我很想得到一个答案。@Meltemi:那么,最后,您对上述问题实施了什么。我也在同一阶段为我的一个应用程序。请让我们知道。我们是否可以通过代码访问应用程序的购买历史记录,并根据日期戳做出决定?我不得不说这有点令人沮丧。我一直希望让我的beta测试人员可以免费访问IAP的产品发布应用程序。听起来我必须给他们iTunes礼券:(.我想补充一点,让它成为一个营销机会-使用一个代码库和两个输出,但为直接购买该应用程序的人提供一些甚至没有从免费版本解锁的闪亮或特殊功能。这会让已经购买的人感觉特别,而不是突然成为不想要的一步我想了想,但意识到如果有人删除了你的应用并重新安装,他们会恢复到“lite”版本。可能这种情况很少发生,但如果发生在我身上,我会很恼火。是的,我想你可能也希望有一个服务器端组件。这样,以前付费的客户的服务器会记录某种唯一的ID,如果本地副本没有标记为付费。但是,你不希望只使用设备ID作为唯一标识符,因为你希望付费版本转换到用户将来可能升级到的新设备。这是一个棘手的问题。听起来是个不错的选择,很惊讶你没有赞成或反对的评论。请+1注意,如果用户rei无论出于何种原因,如果卸载或添加新设备,它们都不会有此默认设置。将此默认设置存储在iCloud中可能可以解决此问题,但这是您所能做的最好的方法。