You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何获取应用已安装时长?规避系统日期篡改问题

可靠计算应用已安装时长的方案

针对系统日期被篡改导致常规安装时间不可靠的问题,以下分Android和iOS平台给出相对可行的解决方案:

Android 平台

方案:结合网络时间与设备开机时长

  1. 首次启动初始化
    • 应用首次启动时,通过NTP协议请求真实网络时间(比如调用公共NTP服务器),得到T_real_install(首次启动时的真实时间)。
    • 同时记录当前设备的开机时长:long E_install = SystemClock.elapsedRealtime(); —— 这个值是设备上次启动后累计运行的毫秒数,不受系统日期修改影响。
    • 将T_real_install和E_install加密存储到EncryptedSharedPreferences中,防止用户手动篡改本地数据。
  2. 计算安装时长
    • 有网络时:再次请求当前真实网络时间T_real_now,安装时长 = T_real_now - T_real_install。
    • 无网络时:获取当前开机时长long E_now = SystemClock.elapsedRealtime();,安装时长估算为E_now - E_install(此值为首次启动到当前的时长,无法覆盖安装后未启动的时间段)。

局限性说明

  • 无法计算应用安装完成到首次启动之间的时长,因为这段时间应用未运行,无法记录任何可靠数据。
  • 首次启动时若无网络,只能以首次启动时刻作为计时起点,此时的“安装时长”实际是首次启动到当前的时长。

iOS 平台

方案:结合网络时间与系统运行时长

  1. 首次启动初始化
    • 应用首次启动时,通过NTP协议获取真实网络时间T_real_install。
    • 记录当前系统运行时长:let E_install = ProcessInfo.processInfo.systemUptime —— 该值是设备开机后累计运行的秒数,不受系统日期篡改影响。
    • 将两个值加密存储到Keychain中(Keychain数据在应用卸载后会被清除,符合安装时长的统计逻辑,且用户难以手动修改)。
  2. 计算安装时长
    • 有网络时:获取当前真实网络时间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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:31:06