Android 8.0+ 必须显式创建通知渠道,否则 plus.push.createMessage 消息静默丢弃;需在 onLaunch 用原生 API 创建 channel 并设置 importance(如4),ID 必须小写字母+下划线且与 options.channelId 严格一致。

Android 8.0+ 通知渠道必须显式创建
uni-app 的 plus.push.createMessage 在 Android 8.0+(API 26)之后不会自动创建通知渠道,如果没提前注册,消息会静默丢弃,且控制台不报错——这是最常被忽略的「黑盒失败」原因。
你需要在应用启动时(如 onLaunch)手动调用原生 API 创建渠道:
-
plus.android.importClass('android.app.NotificationChannel')导入类 - 用
plus.android.invoke(notificationManager, 'createNotificationChannel', channel)注册 - 渠道 ID 必须与后续
plus.push.createMessage的options.channelId完全一致 - 渠道名称(
name)会显示在系统设置 > 通知里,建议用中文且避免动态生成
uni-app 中无法直接配置渠道重要性(importance)
uni-app 的 JS 层 API 不暴露 importance 参数,但 Android 系统强制要求:未设置 importance 的渠道会被视为 IMPORTANCE_NONE,导致通知不展示、无声音/震动。
必须通过原生层补足:
- 使用
plus.android.invoke(channel, 'setImportance', 4)(4 =IMPORTANCE_HIGH) - 若需支持用户关闭声音但保留横幅,改用
3(IMPORTANCE_DEFAULT) - 注意:该值必须在
createNotificationChannel之前设置,否则无效
小米/华为等厂商通道对渠道 ID 有硬性校验
小米推送后台要求「通知类别 ID」与客户端 channelId 完全一致,否则归类失败,甚至触发审核驳回。华为 HMS 的 NotificationChannelGroup 也依赖相同命名逻辑。
实操建议:
- 渠道 ID 仅用小写字母 + 下划线,如
message_alert、order_update,禁止数字开头或大写 - 避免使用
default、general等泛化 ID,厂商平台可能拒绝识别 - 每个业务场景单独建渠道(如订单、客服、营销),不要复用同一 ID
- 测试时用
adb shell cmd notification list查看设备上实际注册的渠道名和 ID 是否匹配
渠道删除后无法重建同名 ID,且无 JS 接口可查
Android 系统限制:一旦调用 deleteNotificationChannel,同名 ID 永久失效,再次创建会静默失败。uni-app 的 JS 层没有提供 getNotificationChannel 或 channelExists 接口。
安全做法是加一层存在性判断:
- 用
plus.android.invoke(notificationManager, 'getNotificationChannel', channelId)获取已存渠道对象 - 若返回
null,再执行创建流程;否则跳过 - 首次安装或升级时,渠道 ID 变更需主动清理旧渠道(仅限调试阶段,线上慎用)
多厂商适配中最容易卡在渠道 ID 命名和 importance 设置上,这两处出问题,通知就根本不会出现在状态栏——不是代码没跑,而是系统从源头拦截了。











