Flutter中如何获取应用已安装时长?规避系统日期篡改问题
可靠计算应用已安装时长的方案
针对系统日期被篡改导致常规安装时间不可靠的问题,以下分Android和iOS平台给出相对可行的解决方案:
Android 平台
方案:结合网络时间与设备开机时长
- 首次启动初始化
- 应用首次启动时,通过NTP协议请求真实网络时间(比如调用公共NTP服务器),得到
T_real_install(首次启动时的真实时间)。 - 同时记录当前设备的开机时长:
long E_install = SystemClock.elapsedRealtime();—— 这个值是设备上次启动后累计运行的毫秒数,不受系统日期修改影响。 - 将
T_real_install和E_install加密存储到EncryptedSharedPreferences中,防止用户手动篡改本地数据。
- 应用首次启动时,通过NTP协议请求真实网络时间(比如调用公共NTP服务器),得到
- 计算安装时长
- 有网络时:再次请求当前真实网络时间
T_real_now,安装时长 =T_real_now - T_real_install。 - 无网络时:获取当前开机时长
long E_now = SystemClock.elapsedRealtime();,安装时长估算为E_now - E_install(此值为首次启动到当前的时长,无法覆盖安装后未启动的时间段)。
- 有网络时:再次请求当前真实网络时间
局限性说明
- 无法计算应用安装完成到首次启动之间的时长,因为这段时间应用未运行,无法记录任何可靠数据。
- 首次启动时若无网络,只能以首次启动时刻作为计时起点,此时的“安装时长”实际是首次启动到当前的时长。
iOS 平台
方案:结合网络时间与系统运行时长
- 首次启动初始化
- 应用首次启动时,通过NTP协议获取真实网络时间
T_real_install。 - 记录当前系统运行时长:
let E_install = ProcessInfo.processInfo.systemUptime—— 该值是设备开机后累计运行的秒数,不受系统日期篡改影响。 - 将两个值加密存储到Keychain中(Keychain数据在应用卸载后会被清除,符合安装时长的统计逻辑,且用户难以手动修改)。
- 应用首次启动时,通过NTP协议获取真实网络时间
- 计算安装时长
- 有网络时:获取当前真实网络时间
T_real_now,安装时长 =T_real_now - T_real_install。 - 无网络时:获取当前系统运行时长
let E_now = ProcessInfo.processInfo.systemUptime,安装时长估算为E_now - E_install(同样无法覆盖安装后未启动的时间段)。
- 有网络时:获取当前真实网络时间
补充提示
- 若你的应用依赖Google Play(Android)或App Store(iOS)生态,也可以考虑通过平台后台API获取用户的安装时间,但该方案需要用户授权且依赖平台服务,通用性较低。
内容的提问来源于stack exchange,提问作者majd alshalabi
相关产品推荐
相关产品推荐

