onLaunch: function (options) {
this.initPush()
},
methods: {
initPush () {
// #ifdef APP-PLUS
this.getPushClientId()
// #endif
},
getPushClientId () {
console.log("开始获取cid");
uni.getPushClientId({
success: (res) => {
const clientId = res.cid
uni.$u.toast(clientId)
uni.setStorageSync('push_client_id', clientId)
// this.savePushClientId(clientId)
console.log(clientId);
},
fail (err) {
console.log('报错', err)
}
})
},
} - 发布:2026-04-16 11:54
- 更新:2026-04-16 13:48
- 阅读:36
【报Bug】通过 uni.getPushClientId获取的cid在uni-push一直显示phone type是小程序 也没有device token 但是配置了离线消息
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: win10
手机系统: Android
手机系统版本号: Android 11
手机厂商: OPPO
手机机型: oppo k3
页面类型: vue
vue版本: vue2
打包方式: 云端
项目创建方式: CLI
CLI版本号: 2
示例代码:
操作步骤:
打开app获取cid 去uni-push后台去查询信息 显示phone type是小程序 但是我配置了离线消息 并且没有device token
打开app获取cid 去uni-push后台去查询信息 显示phone type是小程序 但是我配置了离线消息 并且没有device token
预期结果:
打开app获取cid 去uni-push后台去查询信息 显示phone type是安装 有device token信息
打开app获取cid 去uni-push后台去查询信息 显示phone type是安装 有device token信息
实际结果:
显示phone type是小程序 但是我配置了离线消息 并且没有device token
显示phone type是小程序 但是我配置了离线消息 并且没有device token
bug描述:
一个是通过 uni.getPushClientId获取到的cid 这个是不能收到离线消息
一个是通过abd日志获取gtcid 个推官方人员反推的cid 这个可以收到离线消息
是不是 uni.getPushClientId获取的不是最新的cid呀
hbuilderx 版本号为5.07
需要补充平台分类(安卓,ios,鸿蒙,小程序)和具体问题描述。
作为DCloud官方人员,对该bug反馈进行评审如下:
反馈内容完整性评价
基本信息:反馈包含了标题、描述、代码示例、复现步骤、预期/实际结果及运行环境(Windows 10、HBuilderX正式版、Android 11、OPPO K3、Vue2),信息较为完整。
缺失关键信息:
- manifest.json配置截图:问题核心在于uni-push的SDK类型选择,需要确认
manifest.json->APP模块配置->uniPush 2.0中是否勾选了离线推送选项 - 打包日志:需要确认打包时是否正确集成了厂商推送SDK
- HBuilderX具体版本号:"正式版"描述不够精确,建议提供具体版本号(如5.04)
代码示例评价:提供的代码示例是标准的uni.getPushClientId调用方式,可以直接运行,无需调整。
问题分析
根据知识库内容,该问题极有可能是配置问题而非系统bug。
关键依据来自uni-push2.0文档:
个推的客户端类型是仅根据使用的sdk类型来判断的:
- native sdk(在
manifest.json->APP 模块配置->uniPush 2.0配置界面勾选离线推送时启用的 sdk),获取到的 cid 的 phoneType 为 APP 类型。- jssdk(
manifest.json->APP 模块配置->uniPush 2.0配置界面,仅勾选在线推送,未勾选离线推送时启用的 sdk),获取到的 cid 的 phoneType 均为小程序,而不管实际上你的客户端是 APP、小程序还是 web。
现象匹配:
- 您描述的"phone type是小程序"且"没有device token"完全符合jssdk的特征
- 您通过adb日志获取的gtcid(个推原生cid)能收到离线消息,说明厂商通道配置本身是正确的,但
uni.getPushClientId获取到的是jssdk的cid
解决方案
请按以下步骤排查:
- 检查manifest配置:打开
manifest.json->APP模块配置->uniPush 2.0,确认同时勾选了"在线推送"和"离线推送" - 重新打包:修改配置后必须重新打自定义基座或云打包才能生效
- 验证:重新获取cid后,在uni-push后台查询应显示phone type为"APP"且有device token
如果已勾选离线推送但仍出现此问题,请提供:
- manifest.json中uniPush 2.0配置的截图
- 打包时的控制台日志(确认是否集成了厂商SDK)
参考文档:uni-push2.0客户端类型说明

