Ionic + Capacitor项目iOS端获取设备UUID返回null如何解决
问题原因
iOS 11及以上系统出于用户隐私政策限制,禁止第三方应用获取设备真实UDID、IMEI等永久唯一硬件标识,这是@ionic-native/unique-device-id在iOS环境返回null的根本原因。
可行解决方案
方案1:使用Capacitor官方Device组件(推荐)
该组件在iOS端会返回IDFV(Vendor专属标识),同一开发者账号下的所有App在同一台设备上的IDFV一致,仅当设备上该开发者账号下的全部App都被卸载后才会变更,完全满足SNS设备注册的唯一标识需求。
安装步骤
npm install @capacitor/device npx cap sync
代码修改示例
原有代码需要调整为异步获取设备标识逻辑,修改后如下:
import { Device } from '@capacitor/device'; async registerTokenOnSNS(tokenString): Promise<any> { const tokenDTO: TokenDTO = { deviceToken: '', deviceUuid: '', // 注意和你定义的DTO字段对齐,原代码用了imei字段,可按需调整 osType: '', }; // 系统类型判断 if (this.platform.is('android')) { tokenDTO.osType = 'Android'; } else { tokenDTO.osType = 'iOS'; } tokenDTO.deviceToken = tokenString; // 获取设备唯一标识 const deviceInfo = await Device.getId(); tokenDTO.deviceUuid = deviceInfo.uuid; return this.http.post<Response>(this.apiBaseUrl + '/register-endpoint', JSON.stringify(tokenDTO)).pipe( map((result) => { console.log('BE Received Token'); return result.body; }) ); }
方案2:使用Cordova钥匙串存储自定义UUID(永久唯一)
如果你的项目仍在使用Cordova架构,可生成一个随机UUID存储到iOS钥匙串中,存储后的UUID即使App卸载重装也不会丢失,可作为永久设备标识:
- 安装
cordova-plugin-ios-keychain插件 - 首次启动App时判断钥匙串中是否存在自定义UUID,不存在则生成并写入
- 后续直接读取钥匙串中的UUID作为deviceUuid使用
内容的提问来源于stack exchange,提问作者maunacode_
相关产品推荐
相关产品推荐

