跨平台应用开发进阶(六十):uniapp 获取设备唯一标识信息

一、前言

应App个人信息保护与安全要求合规检查要求,需要实现当用户在不同移动终端上进行登录时应向用户进行信息提示或增大鉴别强度。那么,uniapp 如何获取手机唯一标识,即使软件卸载重装后也不会变呢?

目前实现方案是通过uni-app自带的设备信息获取方法uni.getSystemInfoSync()

javascript 复制代码
// 获取设备品牌、型号、设备 id 、系统名称、osVersion
const {deviceBrand, deviceModel, deviceId, osName, osVersion} = uni.getSystemInfoSync();

项目上线后,发现同一用户在升级APP并登录后,收到了登录不同设备的信息提示。通过排查发现是由于获取deviceId不同导致的。

经过查阅官方文档,给出的解释是:

deviceId 用于获取设备 id 。由 uni-app 框架根据自定义策略生成并存储,清空 Storage 会导致改变。

由此可知,uni.getSystemInfoSync()方法获取的deviceId并不能始终保持唯一性。

二、其他方案

2.1 调用原生

通过原生方式plus.device.imei; 或者 plus.device.getInfo 获取设备信息。

注意:plus.device.imei; 为属性方式获取, plus.device.getInfo为方法调用。属性方式获取,会要求用户赋权,但是提示信息内容可能不正确。

而且,plus.device.getInfo 获取的uuid 随着基座版本的变化,也会变化。

uuid获取的设备标识是根据设备imei等标识信息计算,可能会因为App的权限不同发生变化,当应用卸载重新安装时也可能发生变化,用于统计App日活信息是可以的,如果要跨App则不推荐使用。如果需要跨App获取设备标识,推荐使用plus.device.getOAID

2.2 插件调用

2.2.1 Ba-IdCode

通过uni-app 插件 Ba-IdCode 获取设备唯一标识(OAID、AAID、AndroidID、IMEI等)信息。

但是,不推荐使用!该插件只适配android,且某些机型不支持,根本无法上线使用!应用该方式上线后就是坑!

2.2.2 KeyChain

KeyChain用于保存UUID设备码、唯一标尺(ios)。

但是,不推荐使用!该插件只适配iOS,保存的信息不会因App被删除而丢失。但是有使用者反映云打包后不起作用。

三、实施方案

应用uni.getSystemInfoSync()方法获取到deviceId之后应用uni.setStorage缓存在手机本地,后面取缓存。此方案可解决同一设备不同版本登录后,设备id变更问题,后台逻辑需同步变更,去除同一版本号的限制。

注⚠️:

  • 该方案可解决同一设备/不同设备不同版本号,版本升级设备id变更问题,不支持APP卸载设备id保留。
  • 使用plus.cache.cleae清空缓存不包括使用uni.setStorage保存的缓存信息。plus.cache.clear实现清除应用的缓存数据,清理应用缓存数据仅包括程序中使用webview产生的数据,不包括业务逻辑中使用扩展api保存的数据。

四、拓展阅读

相关推荐
Setsuna_F_Seiei5 小时前
前端转型 Agent 开发 04 之 MCP 与 Skill(赋予 Agent 更广工作能力)
前端·agent
刘发财6 小时前
前端2秒生成500页矢量PDF,rust真的强到没朋友
前端·javascript·rust
郑州光合科技余经理7 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
梦想平凡7 小时前
百游棋牌源代码开发搭建教程(十):隔离部署、备份恢复与双端验收
java·前端·javascript·数据库·源代码管理
yume_sibai8 小时前
06-Rust Web 开发实战(Axum 框架 + 数据库 + JWT 认证 + 中间件 + 部署)
前端·数据库·rust
计算机魔术师10 小时前
特朗普上台打给黄仁勋:AI末日论是骗局,我们绝不让它发生
前端
troy12810 小时前
Python 基础语法(八):Web 后端开发、数据分析与可视化、网络爬虫、人工智能 / 大模型应用
前端·python·数据分析
计算机魔术师10 小时前
CEO说要慢下来,黑客说别做梦了——同一篇论文,两种命运
前端
kyriewen11 小时前
我花3天抓了一个幽灵bug,凶手藏在第4层
前端·javascript·程序员
IT_陈寒11 小时前
Java里用Stream.parallel()翻车实录,这性能还不如单线程
前端·人工智能·后端