uni-app Android 第一次安装 获取clientid 为null
uni-app Android 第一次安装 获取clientid 为null
示例代码:
// #ifdef APP-PLUS
// 获取客户端标识信息
var info = plus.push.getClientInfo();
console.log("个推信息 " + JSON.stringify(info))
plus.push.getClientInfoAsync(function(info) {
let clientid = info.clientid
console.log("异步获取 " + clientid)
}, function(err) {
console.log(JSON.stringify(err))
})
操作步骤:
- 卸载之前的APP 重新安装
预期结果:
- clientid 有值
实际结果:
- clientid 为null
bug描述:
第一次安装APP获取clientId 同步异步延时获取到的都是null (非必现 ,大概率) 异步获取失败 返回{code: -1,message: failed,check appkey or appid } ,杀掉APP重新打开 正常获取

| 信息类别 | 详细信息 |
|----------------|-----------------|
| 产品分类 | uniapp/App |
| PC开发环境操作系统 | Windows |
| PC开发环境操作系统版本号 | win 10 |
| HBuilderX类型 | 正式 |
| HBuilderX版本号 | 3.2.9 |
| 手机系统 | Android |
| 手机系统版本号 | Android 10 |
| 手机厂商 | 华为 |
| 手机机型 | YAL-AL10(荣耀20Pro) |
| 页面类型 | vue |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
更多关于uni-app Android 第一次安装 获取clientid 为null的实战教程也可以访问 https://www.itying.com/category-93-b0.html
1 回复
更多关于uni-app Android 第一次安装 获取clientid 为null的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这是一个典型的推送初始化时机问题。在uni-app中,plus.push模块的初始化需要时间,特别是在首次安装时。
问题原因:
- 首次安装延迟:Android系统首次安装应用时,推送服务(如个推)需要完成设备注册和初始化,这个过程需要一定时间
- 同步获取过早:
plus.push.getClientInfo()是同步方法,在推送服务未完成初始化时调用会返回null - 异步回调时机:即使使用异步方法,如果调用时机过早,也可能获取失败
解决方案:
- 延迟获取策略(推荐):
// 在应用启动时设置延迟获取
setTimeout(() => {
plus.push.getClientInfoAsync(function(info) {
if(info && info.clientid) {
console.log("获取到clientid:", info.clientid);
// 存储到本地或发送到服务器
uni.setStorageSync('clientid', info.clientid);
} else {
// 如果仍未获取到,可以再次延迟尝试
setTimeout(() => {
plus.push.getClientInfoAsync(callback);
}, 2000);
}
}, function(err) {
console.log("获取失败:", err);
});
}, 3000); // 延迟3秒获取
- 监听推送服务就绪事件:
// 监听推送服务初始化完成
document.addEventListener('plusready', function() {
// 可以在这里添加额外的延迟
setTimeout(getClientId, 1000);
});
function getClientId() {
plus.push.getClientInfoAsync(function(info) {
console.log("异步获取clientid:", info.clientid);
});
}
- 应用生命周期中处理:
在
App.vue的onLaunch中处理,但需要确保足够的延迟:
onLaunch: function() {
// #ifdef APP-PLUS
// 首次启动延迟更长时间
let isFirst = !uni.getStorageSync('app_launched');
if(isFirst) {
setTimeout(this.initPush, 5000);
uni.setStorageSync('app_launched', true);
} else {
setTimeout(this.initPush, 2000);
}
// #endif
}

