要求:
在我的应用程序中,我希望允许用户从应用程序首次运行之日起一个月内免费使用所有功能。为此,我在应用程序数据库中存储了第一个运行日期,并在每次启动应用程序时将第一个运行日期与当前日期进行比较。
实现:
为了获得当前日期,我们有几个函数,如Calendar.getInstance();
Date date=new Date();
,这些函数将返回标准“wall”时钟的日期\日期时间(时间和日期)。根据{{3}} Which can be set by the user or the phone network.
问题:
如果用户从Setting
更改日期并将其设置为过去日期,那么每件事情似乎都可以正常工作。例如,用户在2013年6月7日首次运行应用程序,因此在2013年7月6日之后,应用程序必须显示他必须购买订阅,但如果用户将设备的日期更改回6月30日等,则该限制将不起作用。
那么为什么要正确实现它呢?
有没有为什么要获得用户无法编辑的设备的实际时间?
修改:
应用程序可以脱机工作,因此用户可以关闭互联网连接。
答案 0 :(得分:1)
如何存储两个日期 - 应用首次使用的日期和上次使用的日期。 30减去两个日期之间的差异将给出剩余天数,如果当前日期早于上次使用日期,则表示他们已更改日期。
只是一个想法 - 没有尝试过,但理论上应该有效。
答案 1 :(得分:1)
存储使用它的第一天和使用它的最后一天,并听取ACTION_TIME_CHANGED意图。另外,尝试使用AlarmManager。
如果您有网络,请将其存储在手机上的数据库中。
但你可能需要问自己,是否有人真的会改变手机的日期才能使用你的应用程序。它会严重搞乱他们的许多事情:警报,日历,同步到其他服务等等。我认为这不是现实中的问题。
答案 2 :(得分:1)
如果有可能,您可以使用一次性GPS请求来获取时间值。用户无法更改收到的GPS时间。如果你不需要它,那么添加权限会很痛苦,但是这可以防止用户因日期/时间错误而导致的不良行为。
答案 3 :(得分:0)
Event(APP_INSTALL) -> storeOnServer(INSTALL_TIME_KEY,getTimeFromServer());
Event(APP_LAUNCH) -> IF(getTimeFromServer -getStoredTime(INSTALL_TIME_KEY) >30)
-> showTrialPeriodEndedAlert()
-> quitApp();