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重新打开 正常获取

Image


| 信息类别       | 详细信息        |
|----------------|-----------------|
| 产品分类       | 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模块的初始化需要时间,特别是在首次安装时。

问题原因:

  1. 首次安装延迟:Android系统首次安装应用时,推送服务(如个推)需要完成设备注册和初始化,这个过程需要一定时间
  2. 同步获取过早plus.push.getClientInfo()是同步方法,在推送服务未完成初始化时调用会返回null
  3. 异步回调时机:即使使用异步方法,如果调用时机过早,也可能获取失败

解决方案:

  1. 延迟获取策略(推荐):
// 在应用启动时设置延迟获取
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秒获取
  1. 监听推送服务就绪事件
// 监听推送服务初始化完成
document.addEventListener('plusready', function() {
    // 可以在这里添加额外的延迟
    setTimeout(getClientId, 1000);
});

function getClientId() {
    plus.push.getClientInfoAsync(function(info) {
        console.log("异步获取clientid:", info.clientid);
    });
}
  1. 应用生命周期中处理: 在App.vueonLaunch中处理,但需要确保足够的延迟:
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
}
回到顶部