更新记录

1.2.6(2026-10-08)

  • 优化1.2.5版本安卓无效字符串判定方法错误
  • 优化sn获取方法异常捕获

1.2.5(2026-09-24)

  • 【破坏性变更】getUniqueDeviceId 改为异步回调方法,安卓端 OAID 改为异步获取(getOAID);调用方需改为 getUniqueDeviceId((id)=>{ ... }) 写法

1.2.4(2026-06-26)

  • 优化荣耀手机OAID获取逻辑
查看更多

平台兼容性

uni-app(4.21)

Vue2 Vue2插件版本 Vue3 Vue3插件版本 Chrome Safari app-vue app-vue插件版本 app-nvue app-nvue插件版本 Android Android插件版本 iOS iOS插件版本 鸿蒙 鸿蒙插件版本
√ 1.0.0 √ 1.0.0 × × √ 1.0.0 √ 1.0.0 5.0 1.0.0 12 1.0.0 √ 1.2.1
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(4.21)

Chrome Safari Android Android插件版本 iOS iOS插件版本 鸿蒙 鸿蒙插件版本 微信小程序
× × 5.0 1.0.0 12 1.0.0 √ 1.0.0 ×

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
√ √ √ √

设备唯一ID获取 支持安卓/iOS/鸿蒙(uni-device-id)UTS插件

介绍

  1. 获取设备唯一ID、设备唯一标识,支持安卓(AndroidId/OAID/IMEI/MEID/MacAddress/Serial/UUID/设备基础信息),iOS(IDFA/IDFV/UUID),鸿蒙(OAID/ODID/UUID)。
  2. iOS使用keychain持久存储UUID,应用卸载后UUID不变。
  3. 鸿蒙使用AssetMap存储UUID,应用卸载后UUID不变。
  4. 为方便大家使用,插件已经封装好了getUniqueDeviceId(),如果该API不满足您的需求,可以参考下方的参数说明自定义API

API说明

方法名称 参数 返回参数 说明
initSDK 无 无 1.2.0新增,仅安卓有效
getUniqueDeviceId 回调 无(通过回调返回string) 1.2.5改为异步回调。安卓调用顺序OAID->AndroidId->MacAddress->Serial->UUID。 iOS上使用UUID,keychain存储。鸿蒙上使用UUID,AssetMap存储
getDeviceId 无 string 安卓返回AndroidId。 iOS返回IDFV。鸿蒙返回ODID
getOAID 回调 无 安卓返回OAID。 鸿蒙返回OAID需授权。iOS返回IDFA iOS14及以上可用需授权
getImeiOrMeid boolean string 仅支持安卓,安卓根据参数true返回IMEI否则MEID,安卓10以下可获取,不包括10,安卓6以上申请用户权限
getMacAddress 无 string 仅支持安卓,安卓11以下可用
getSerial 无 string 仅支持安卓,安卓10以下可用;安卓10及以上系统限制普通应用读取,返回空字符串
generateUUID 无 string 无限制

插件试用

APK下载

uvue代码调用示例

<template>
    <view style="flex-direction: column;flex: 1;">
        <view style="height: 50px;justify-content: center;">
            <text style="text-align: center;font-weight: bold;font-size: 18px;">{{ title }}</text>
        </view>
        <scroll-view>
            <view>
                <view class="uni-padding-wrap uni-common-mt">
                    <button @tap="testInitSDK">初始化(1.2.0新增)</button>
                </view>
                <view class="uni-padding-wrap uni-common-mt">
                    <button @tap="testGetUniqueDeviceId">获取设备唯一标识</button>
                </view>
                <view class="uni-padding-wrap uni-common-mt">
                    <button @tap="testGetDeviceId">获取 DeviceId</button>
                </view>
                <view class="uni-padding-wrap uni-common-mt">
                    <button @tap="testGetOAID">获取 OAID</button>
                </view>
                <view class="uni-padding-wrap uni-common-mt">
                    <button @tap="testGetImeiOrMeid">获取Imei/Meid</button>
                </view>
                <view class="uni-padding-wrap uni-common-mt">
                    <button @tap="testGetSerial">获取Serial</button>
                </view>
                <view class="uni-padding-wrap uni-common-mt">
                    <button @tap="testGetMacAddress">获取MacAddress</button>
                </view>
                <view class="uni-padding-wrap uni-common-mt">
                    <button @tap="testGenerateUUID">随机生成UUID</button>
                </view>
                <view class="uni-padding-wrap uni-common-mt">
                    <button @tap="testGetDeviceInfo">获取设备信息</button>
                </view>
            </view> 
        </scroll-view>  
    </view>

</template>

<!-- 鸿蒙「蒸汽模式」仅支持 <script setup>,不支持 <script> 选项式写法,故示例统一采用 <script setup> -->
<script setup lang="uts">

  import * as module from  "@/uni_modules/CZ-DeviceId";

    const title = ref("DeviceId 示例")

    function testInitSDK(){
        ///必须先调用初始化方法,否则安卓的唯一id获取值可能会为空,或者变化
        module.initSDK((res) => {
            showToast(`初始化SDK ${res}`)
        });
    }
    function testGetUniqueDeviceId(){
        module.getUniqueDeviceId((id : string)=> showToast(id));
    }
    function testGetDeviceId(){
        let id = module.getDeviceId();
        showToast(id);
    }
    function testGetOAID(){
        module.getOAID((value)=> showToast(value));
    }
    function testGetImeiOrMeid(){
        module.getImeiOrMeid(true, (v1) => {
            module.getImeiOrMeid(false, (v2) => showToast(`Imei=${v1},Meid=${v2}`));
        });
    }
    function testGetSerial(){
        let sn = module.getSerial();
        showToast(sn);
    }
    function testGetMacAddress(){
        let mac = module.getMacAddress();
        showToast(mac);
    }
    function testGenerateUUID(){
        let uuid = module.generateUUID();
        showToast(uuid);
    }
    function testGetDeviceInfo(){
        let json = module.getDeviceInfo();
        showToast(json);
    }
    function showToast(msg:string){
        if(msg == ''){
            uni.showToast({
                icon:'none',
                title:'未获取到相关信息'
            })
        }else {
            uni.showToast({
                icon:'none',
                title: msg
            })
        }
    }

</script>

<style>
    .uni-padding-wrap{
        margin: 10px 15px 10px 15px;
    }
    .uni-common-mt{

    }
</style>

设备唯一标识说明:

AndroidId:
  1. Android ID 是 Android 设备的唯一标识符,用于标识设备。
  2. 基本设备都能正常获取到,少部分设备无法获取;每个应用获取的AndroidID都不一致;单个应用卸载重装后AndroidID不变。
  3. 在Android 8.0 中针对Android ID有一个比较大的变化,8.0开始不同签名的App 会产生不同的Android ID,这对于使用AndroidID来追踪设备的用户来说影响比较大。
  4. 仅支持安卓。
OAID:
  1. OAID 是系统提供的用于广告追踪的匿名标识符。
  2. 支持安卓/iOS/鸿蒙。
IMEI/MEID:
  1. IMEI/MEID国际移动设备身份码,用于唯一标识 GSM 和 UMTS 移动电话设备。
  2. 安卓10以前需要权限才能获取到,安卓10以后不支持,不包括安卓10。
MacAddress:
  1. MacAddress是设备的网络接口卡上的物理地址,也就是用于唯一标识网络设备的地址。
  2. 安卓11以前可以获取到。安卓11以后不支持,包括安卓11。
Serial:
  1. Serial是硬件厂商为每个设备分配的一个独特的标识符。
  2. 安卓10以前获取到,安卓10以后不支持,不包括安卓10。
  3. 安卓8~9(API 26~28)需要 READ_PHONE_STATE 权限,无权限时返回空字符串;安卓10及以上(API 29+)系统仅对系统级应用开放,普通应用调用将安全返回空字符串,不会抛出 SecurityException 导致崩溃。
UUID:
  1. 随机生成的设备ID。
  2. 每次获取都会重新生成。
  3. 支持安卓、iOS、鸿蒙。
IDFA:
  1. 广告标示符,适用于对外:例如广告推广,换量等跨应用的用户追踪等。IDFA 是苹果iOS 6开始新增的广告标识符,英文全称是 Identifier for Advertising ,用于给开发者跟踪广告效果用的,可以简单理解为 iPhone 的设备临时身份证,说是临时身份证是因为它允许用户更换,IDFA 存储在用户 iOS 系统上,同一设备上的应用获取到的 IDFA 是相同的。
  2. iOS仅14.0及以上版本支持,如果返回空说明未开启允许APP请求跟踪,可在设置-隐私与安全性-跟踪打开后重试
IDFV:
  1. IDFV是由苹果系统生成的唯一标识符,用于标识同一供应商(即同一开发者账户下的应用)在同一设备上运行。
  2. 仅支持iOS。
AAID:
  1. 鸿蒙应用匿名标识符,标识运行在移动智能终端设备上的应用实例,只有该应用实例才能访问该标识符,它只存在于应用的安装期,总长度32位。与无法重置的设备级硬件ID相比,AAID具有更好的隐私权属性。
  2. AAID和已有的任何标识符都不关联,并且每个应用只能访问自己的AAID。
  3. 同一个设备上,同一个开发者的多个应用,AAID取值不同。
  4. 同一个设备上,不同开发者的应用,AAID取值不同。
  5. 不同设备上,同一个开发者的应用,AAID取值不同。
  6. 不同设备上,不同开发者的应用,AAID取值不同。
  7. 仅支持鸿蒙。
ODID:
  1. 开发者匿名设备标识符,它主要用于开放给开发者的设备标识,同一设备上运行的同一个开发者的应用,ODID相同。帮助开发者更好地理解用户在不同应用间的行为,从而提供更个性化的服务和推荐。
  2. 同一设备上运行的同一个开发者的应用,ODID相同。
  3. 同一个设备上不同开发者的应用,ODID不同。
  4. 不同设备上同一个开发者的应用,ODID不同。
  5. 不同设备上不同开发者的应用,ODID不同。
  6. 仅支持鸿蒙。

用到的权限

安卓
<!-- 读取手机信息 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!-- 读取WIFI信息 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
iOS

    <key>NSUserTrackingUsageDescription</key >
    <string></string>
鸿蒙

      "requestPermissions": [
    {
      "name": "ohos.permission.STORE_PERSISTENT_DATA",
      "reason": "$string:module_desc",
      "usedScene": {
        "abilities": [
          "EntryAbility"
        ],
        "when": "always"
      },
    },
    {
      "name": "ohos.permission.APP_TRACKING_CONSENT",
      "reason": "$string:module_desc",
      "usedScene": {
      "abilities": [
          "EntryAbility"
      ],
      "when": "always"
      },
    }
]

隐私、权限声明

1. 本插件需要申请的系统权限列表:

请看插件使用说明

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无