更新记录
1.0.0(2026-10-27) 下载此版本
更新日志
本文档记录项目各版本的变更历史,格式基于 Keep a Changelog,版本号遵循 语义化版本 规范。
[v1.0.0] - 2026-10-27
新增
平台兼容性
uni-app(5.33)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| - | √ | - | - | √ | - | √ | √ | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | √ | √ | × |
uni-push 2.0 消息推送接入指南
基于 uni-app + Vue3 + uni-push 2.0 官方内置模块,实现 Android / iOS App 端消息推送。
目录
项目结构
Push-notification/
├── pages/
│ └── index/
│ └── index.vue # 推送演示页面(clientId 展示、日志面板)
├── static/
│ └── logo.png
├── App.vue # 应用入口 + uni-push 核心逻辑
├── main.js # Vue3 createSSRApp 入口
├── manifest.json # uni-app 全局配置(含 Push 模块声明)
├── pages.json # 页面路由配置
├── uni.scss # 全局 SCSS 变量
├── index.html
├── uni.promisify.adaptor.js
├── CHANGELOG.md # 更新日志
└── README.md # 本文档
各文件职责
| 文件 | 推送相关职责 |
|---|---|
manifest.json |
声明 modules.Push 模块、配置 Android 推送权限 |
App.vue |
onLaunch 初始化推送、注册全局消息监听、获取 clientId |
pages/index/index.vue |
演示页面:clientId 展示、本地通知、消息日志 |
环境要求
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| HBuilderX | 3.8+ | 推荐最新版本,Vue3 模式完整支持 |
| uni-app | Vue3 模式 | manifest.json 中 "vueVersion": "3" |
| 运行基座 | 自定义调试基座 / 云打包 | 标准基座不包含推送模块,无法测试 |
| uniCloud | 需关联服务空间 | uni-push 2.0 依赖 uniCloud(阿里云 / 腾讯云均可) |
| DCloud 开发者中心 | 需开通 uni-push 2.0 | https://dev.dcloud.net.cn |
快速开始
第一步:manifest.json 启用 Push 模块
// manifest.json → app-plus → modules
"modules": {
"Push": {}
}
第二步:App.vue 初始化推送
<script setup> 中调用 initUniPush(),完整代码见 App.vue。
第三步:关联 uniCloud 服务空间
HBuilderX 中右键项目 → 关联云服务空间或云函数项目 → 选择/创建服务空间。
第四步:DCloud 开发者中心开通 uni-push 2.0
- 登录 DCloud 开发者中心
- 找到你的应用(AppID:
__UNI__9D8838B) - 左侧菜单 uniPush → 开通 uni-push 2.0
- 配置厂商推送通道(Android 厂商 / iOS APNs 证书)
第五步:打自定义基座测试
HBuilderX → 运行 → 运行到手机或模拟器 → 制作自定义调试基座 → 使用自定义基座运行。
manifest.json 配置说明
完整推送相关配置
{
"app-plus": {
"modules": {
"Push": {} // 启用官方内置推送模块
},
"distribute": {
"android": {
"permissions": [
// 原有权限保持不变 ...
// 以下为 uni-push 新增权限
"<uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\"/>",
"<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\"/>",
"<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>"
]
}
}
}
}
Android 权限说明
| 权限 | 作用 |
|---|---|
POST_NOTIFICATIONS |
Android 13 (API 33) 及以上必需,允许应用发送通知 |
FOREGROUND_SERVICE |
推送服务前台保活,防止系统杀死推送进程 |
RECEIVE_BOOT_COMPLETED |
开机自启动推送服务,保持推送连接 |
核心 API 参考
uni-push 2.0 暴露 4 个核心 API,所有 API 仅在 APP-PLUS 平台可用。
1. uni.getPushClientId()
获取设备唯一推送标识(clientId),向指定设备推送消息时需要此 ID。
uni.getPushClientId().then((res) => {
console.log(res.clientId) // 设备唯一标识,字符串格式
}).catch((err) => {
console.error(err)
})
返回值:
| 字段 | 类型 | 说明 |
|---|---|---|
clientId |
string |
设备推送标识,形如 __UNI__9D8838B_xxxxxxxxxxxx |
注意事项:
- 首次调用可能返回空字符串,待推送服务连接成功后重新获取即可
- App 从后台切回前台时建议重新调用,防止连接断开
- 必须将 clientId 上报到你的后端服务器,服务端才能向指定设备推送
2. uni.onPushMessage(callback)
注册推送消息监听器,统一接收在线透传和通知栏点击。
const handler = (res) => {
if (res.type === 'receive') {
// 应用在线时收到透传消息
console.log('透传消息:', res.data)
} else if (res.type === 'click') {
// 用户点击通知栏消息时触发
console.log('通知点击:', res.data)
}
}
uni.onPushMessage(handler)
回调参数:
| 字段 | 类型 | 说明 |
|---|---|---|
res.type |
'receive' \| 'click' |
receive = 在线透传;click = 通知点击 |
res.data |
object \| string |
推送消息内容,由服务端 payload 决定 |
3. uni.offPushMessage(callback)
取消已注册的推送消息监听。在页面销毁 / 组件卸载时调用,避免内存泄漏。
uni.offPushMessage(handler)
4. uni.createPushMessage(options)
创建本地通知(仅在当前设备显示,不走服务端),用于测试通知栏渲染效果。
uni.createPushMessage({
title: '通知标题',
content: '通知内容',
payload: { type: 'local', from: 'test' },
success: () => { console.log('本地通知已发送') },
fail: (err) => { console.error(err) }
})
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
title |
string |
✅ | 通知标题 |
content |
string |
✅ | 通知内容正文 |
payload |
object |
❌ | 附加数据,通知点击后回调中可获取 |
success |
function |
❌ | 成功回调 |
fail |
function |
❌ | 失败回调 |
代码结构说明
App.vue 初始化流程
App 启动
└─ onLaunch()
└─ initUniPush()
├─ [Android] requestAndroidNotificationPermission()
│ └─ Android 13+ 动态申请 POST_NOTIFICATIONS
├─ registerPushListener()
│ └─ uni.onPushMessage(handler)
│ ├─ res.type === 'receive' → handleTransparentMessage()
│ └─ res.type === 'click' → handleNotificationClick()
└─ getPushClientId()
└─ uni.getPushClientId() → 上报后端服务器
App 从后台回前台
└─ onShow()
└─ getPushClientId() // 刷新 clientId
pages/index/index.vue 页面功能
| 区域 | 功能 | 实现 |
|---|---|---|
| 客户端信息 | 展示 clientId + 当前平台 | ref(clientId) + computed(platform) |
| 刷新 ClientID | 点击按钮重新获取设备标识 | uni.getPushClientId() |
| 创建本地通知 | 测试通知栏渲染效果 | uni.createPushMessage() |
| 请求通知权限 | Android 13+ 动态申请 | plus.android.requestPermissions() |
| 消息日志面板 | 实时展示收到的推送 | 页面级别 onPushMessage 监听 + 日志队列 |
条件编译策略
所有推送 API 调用均使用 uni-app 条件编译包裹:
// 仅在 App 端执行
// #ifdef APP-PLUS
uni.onPushMessage(handler)
// #endif
// 仅在 Android 端执行
// #ifdef APP-PLUS-ANDROID
requestAndroidNotificationPermission()
// #endif
为什么需要条件编译?
- 标准基座不包含 Push 模块,H5 / 小程序运行时调用会报
uni.xxx is not a function - Android 特有 API(如
plus.android.requestPermissions)在 iOS 上不存在
后端 / 开发者中心配置
Android 厂商推送通道
为了 App 被杀后仍能收到推送,需接入厂商通道。在 DCloud 开发者中心 uniPush → Android 配置:
| 厂商 | 需要的参数 | 申请地址 |
|---|---|---|
| 华为 | AppId / AppKey / AppSecret | 华为开发者联盟 |
| 小米 | AppId / AppKey / AppSecret | 小米开放平台 |
| OPPO | AppKey / AppSecret | OPPO 开放平台 |
| vivo | AppId / AppKey / AppSecret | vivo 开放平台 |
| 荣耀 | AppId / AppKey / AppSecret | 荣耀开发者 |
iOS APNs 推送证书
在 DCloud 开发者中心 uniPush → iOS 配置:
- Apple 开发者账号创建推送证书(Development + Production 各一份)
- 导出
.p12文件并设置密码 - 上传
.p12文件 + 证书密码 + Bundle ID
服务端发送推送
uni-push 2.0 提供两种服务端方案:
方案一:uniCloud 云函数(推荐)
// uniCloud 云函数中
const uniPush = uniCloud.getPushManager({ appId: '__UNI__9D8838B' })
uniPush.sendMessage({
push_clientid: '设备clientId',
title: '推送标题',
content: '推送内容',
payload: { url: '/pages/detail/index?id=123' }
})
方案二:DCloud 推送 REST API
POST https://api-push.dcloud.net.cn/push/message
Authorization: Basic base64(appkey:appsecret)
Content-Type: application/json
{
"appid": "__UNI__9D8838B",
"push_clientid": "设备clientId",
"title": "推送标题",
"content": "推送内容"
}
测试流程
1. HBuilderX 打开项目
│
2. 右键 → 关联 uniCloud 服务空间
│
3. 制作自定义调试基座
│ HBuilderX → 运行 → 运行到手机 → 制作自定义调试基座
│ (勾选 Android / iOS 平台,等待云打包完成)
│
4. 真机运行(使用自定义基座)
│ 首页打开 → 看到 ClientID
│ 点击「复制」保存 clientId
│
5. DCloud 开发者中心测试推送
│ uniPush → 在线推送 → 粘贴 clientId → 发送
│
6. 验证结果 ✅
├─ App 在线 → 首页日志面板显示「透传消息」
├─ App 后台 → 通知栏弹出通知
└─ App 被杀 → 点击通知后首页日志显示「通知点击」
平台差异处理
| 差异点 | Android | iOS |
|---|---|---|
| 通知权限 | Android 13+ 需动态申请 POST_NOTIFICATIONS |
用户首次推送时系统自动弹窗 |
| 厂商通道 | 必须配置(华为/小米/OPPO/vivo/荣耀) | 使用 APNs 统一通道 |
| 推送证书 | 无需证书 | 需要 .p12 APNs 推送证书 |
| 后台保活 | FOREGROUND_SERVICE + 厂商通道 |
系统自动管理 |
| 条件编译 | // #ifdef APP-PLUS-ANDROID |
// #ifdef APP-PLUS-IOS |
FAQ 常见问题
Q1:标准基座收不到推送?
原因:标准基座是 DCloud 预编译的通用包,不包含 Push 模块。
解决:必须制作自定义调试基座(HBuilderX → 运行 → 制作自定义调试基座),或直接云打包。
Q2:uni.getPushClientId() 返回空?
可能原因:
- 未使用自定义基座,Push 模块未加载
- 网络不通,推送服务尚未连接
- uniCloud 服务空间未关联
排查步骤:
- 确认运行的是自定义基座(启动时会显示「自定义基座」标识)
- 等待 3-5 秒后再次调用,或检查
onShow生命周期中是否重新获取 - HBuilderX 中右键项目 → 确认已关联 uniCloud 服务空间
- 查看控制台是否有
[uni-push] 推送监听器注册完成日志
Q3:通知栏收不到推送?
Android 排查:
- 确认
POST_NOTIFICATIONS权限已授予(系统设置 → 应用管理 → 通知 → 允许) - 确认厂商通道已在 DCloud 开发者中心正确配置
- 部分国产 ROM 需要在系统设置中手动开启「自启动」和「后台弹出界面」
iOS 排查:
- 确认
.p12证书上传正确(Bundle ID 匹配当前 App) - 确认通知权限已开启(系统设置 → 通知 → 允许通知)
Q4:App 被杀后收不到推送?
这是最常见问题:
| 场景 | 解决 |
|---|---|
| Android | 必须配置厂商推送通道(华为/小米/OPPO/vivo/荣耀),厂商通道走系统级推送,App 被杀也能到达 |
| iOS | 使用 APNs 系统推送,不受 App 进程状态影响,但需要正确的推送证书 |
| 仅使用 unipush 自有通道 | App 在线时可以收,App 被杀后无法到达。必须配置厂商 / APNs 通道作为补充 |
Q5:uni.onPushMessage 没有触发?
- 确认监听代码在
onLaunch或onMounted中执行(而非条件不满足的分支) - 确认使用的是自定义基座
- 确认推送消息已经到达设备(通知栏有没有显示)
- 透传消息只有 App 在前台在线时才会回调;通知点击需要用户实际点击通知栏
Q6:H5 / 小程序端为什么调 uni.getPushClientId() 报错?
原因:uni-push 2.0 仅支持 App 端。
解决:用条件编译包裹所有推送 API 调用:
// #ifdef APP-PLUS
uni.getPushClientId().then(...)
// #endif
Q7:如何跳转到指定页面?
在服务端推送的 payload 中携带页面路径,通知点击后根据 payload 跳转:
// App.vue 中 handleNotificationClick
function handleNotificationClick(data) {
const payload = data.payload || {}
if (payload.url) {
uni.navigateTo({ url: payload.url })
}
}
服务端推送时:
{
"payload": {
"url": "/pages/detail/index?id=123"
}
}
相关链接
| 资源 | 地址 |
|---|---|
| uni-push 2.0 官方文档 | https://uniapp.dcloud.net.cn/unipush-v2.html |
| DCloud 开发者中心 | https://dev.dcloud.net.cn |
| uniCloud 官方文档 | https://uniapp.dcloud.net.cn/uniCloud/ |
| uni-app API 参考 | https://uniapp.dcloud.net.cn/api/ |
License
本项目基于 uni-app 官方内置 Push 模块,遵循 uni-app 开源协议。

收藏人数:
下载插件并导入HBuilderX
下载插件ZIP
赞赏(0)
下载 0
赞赏 0
下载 12719373
赞赏 1958
赞赏
京公网安备:11010802035340号