极光推送在uni-app中需服务端指定通道标识并配合客户端预配置才能实现消息分类管理。android须在manifest.json注册notificationchannel并声明权限,ios需在控制台配置unnotificationcategory并在客户端注册,否则无法实现独立开关和正确展示。

极光推送在uni-app中默认走统一通道,但实际业务中必须区分“运营消息”“系统通知”“客服消息”等类型——否则用户会因消息泛滥关闭通知权限。分类通道不是靠前端代码控制的,而是由服务端调用极光API时指定android_channel_id或iOS的category,再配合客户端预注册通道配置才能生效。没配通道ID或没在manifest里声明,推送过来就是普通通知,系统无法归类、也无法设置独立开关。
Android端必须提前在manifest.json里注册通知渠道
Android 8.0+强制要求每个通知必须归属一个NotificationChannel,否则静默失败。uni-app不自动创建,得手动填。
-
manifest.json的"permissions"节点下,确保已添加"android.permission.POST_NOTIFICATIONS"(Android 13+必需) - 在
"nativePlugins">"JG-JPush">"android"里,加"JPUSH_ANDROID_CHANNEL_ID"字段,值为自定义渠道ID(如"channel_system") - 同时必须在
"android"对象内补充"JPUSH_ANDROID_CHANNEL_NAME"和"JPUSH_ANDROID_CHANNEL_DESCRIPTION",否则部分厂商(如小米)会拒绝创建渠道 - 渠道ID一旦上线就不能改名,否则旧设备上会残留废弃渠道,新消息可能进错入口
iOS端需在极光控制台配置category并同步到客户端
iOS没有“渠道”概念,但有UNNotificationCategory,它决定通知上的按钮、是否允许横滑、是否触发后台唤醒等行为。这个category必须和服务端推送时传的category字段严格一致,否则按钮不显示。
- 登录极光控制台 → 应用设置 → iOS高级设置 → 添加
Notification Category,比如填"order_alert" - 在
manifest.json的"ios"配置块中,加入"JPUSH_IOS_CATEGORY",值与控制台一致(如"order_alert") - App首次启动时,需调用
jpushModule.requestNotificationAuthorization并传入categories参数,否则系统不识别该category - 注意:iOS 15+对category数量有限制(最多25个),别为每个子类型都建一个
服务端推送时必须显式指定通道标识
前端只负责注册和监听,真正分流靠服务端发请求时带参数。漏掉任何一项,分类就失效。
- Android:HTTP API中必须带
android_channel_id字段,值要和manifest.json里写的JPUSH_ANDROID_CHANNEL_ID完全一致(大小写敏感) - iOS:API中必须带
ios_category字段,值要和极光控制台创建的category名称一致 - 如果用极光控制台手动推送测试,务必在“高级设置”里展开填写对应字段,网页版默认不显示这些选项
- 别依赖
extras字段做分类判断——系统级通道控制发生在通知展示前,extras只影响点击后逻辑
用户通知权限开关是按通道独立管理的
这是分类通道最核心的价值:用户可以单独关闭“营销消息”,但保留“订单提醒”。但这个能力只有在通道真实生效后才起作用。
- Android用户长按通知 → “设置” → 能看到每个
channel_name对应的开关,名字来自JPUSH_ANDROID_CHANNEL_NAME - iOS用户进入「设置」→「你的App」→「通知」→ 每个category会显示为独立条目(前提是category已正确注册且推送时指定了)
- 测试时务必用真机,模拟器无法触发完整通知链路;华为/小米手机还要额外检查“省电管理”里是否禁用了该通道的自启动
- 用户关闭某通道后,
jpushModule.isNotificationEnabled返回的仍是全局状态,无法感知单个通道,得靠服务端记录用户偏好来规避推送
通道ID和category名称一旦上线就锁死,改名等于新建通道,老用户不会自动迁移。别图省事全用同一个ID,也别在测试环境用生产ID——不同环境的极光AppKey对应不同通道命名空间,混用会导致渠道创建失败或通知乱入。











