「JPush」通知栏相关问题

如果你遇到了通知栏图标显示为白色、机器人;如果你想让通知消息展示大图、能换行、有标题;还想点击消息跳转到具体的页面,那么本文你不可错过

一、通知栏图标显示不正常1.1 基本说明极光官网上的图标配置、应用名称都只是官网的类似于昵称的用处!修改官网的这两个设置,客户端显示的信息是不可能修改的,请去你的 App 工程里面配置新的应用图标和名称。

1.2 iOS 排查iOS 推送是由系统管理的,推送弹窗上面的图标是系统自动获取的 App 工程图标。

无法动态修改,无法控制。若有显示问题,请检查:

是否图标设计不符合 iOS 的要求;

或者与桌面背景有关;

某个手机的 bug,换一个手机测试。

若修改过一次图标,请卸载重装后测试。1.3 Android 排查

若没有 res/drawable-xxxx/jpush_notification_icon 这个资源,那么通知栏默认使用应用图标作为通知 icon

在 5.0 以上系统将应用图标作为 statusbar icon 可能显示不正常,我们可以定义 没有阴影和渐变色、镂空背景的 icon 同名替换 res/drawable-xxxx/jpush_notification_icon 这个文件,请让你们制作图标的同事严格按照 Android 5.0 系统的要求制作,可网上搜索一下相关说明

应该将 res 文件夹下的 所有 icon 文件都替换成自己的图标文件

小米手机的 launcher 缓存可能有 bug,按照上述要求配置好后, 重启手机,再测试

部分手机系统可能会默认使用 App 的 icon 当图标(即便有上述资源文件),可定制一下通知栏样式 ,手动设置图标,默认的方法如果不行,则可以使用 CustomPushNotificationBuilder 高级定制。

特别注意

推送的时候要指定 builder_id 为你自己定制的值,根据如下示例,在创建通知栏样式时,样式编码设置为 3 ,则推送消息的时候 builder_id 也应该设置为 3

以下一部分代码只是用来示例!请具体看文档 BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(this);

builder.statusBarDrawable = R.drawable.jpush_notification_icon;//图标文件

builder.notificationDefaults = Notification.DEFAULT_SOUND

JPushInterface.setPushNotificationBuilder(3, builder); //如果代码中定制为 2,则 builder_id 推送时应传 2

官网推送的设置

推送-通知-目标平台选择 Android -点开可选参数-填写通知栏编号

调 API 推送的代码设置 Notification-Android-builder_id

二、通知栏右侧大图如何实现2.1 iOS 设备

版本要求:从 JPush iOS SDK v2.1.9,iOS 10 开始支持。

通过 iOS 10 的 Service Extension 提供支持,需要先客户端实现该功能,具体参考下我们官方的 demo。

REST API 在 Notification - iOS 中提供字段 mutable-content 支持该功能

推送的时候携带 ”mutable-content":true 说明是支持 iOS10 的 UNNotificationServiceExtension

其他所需要的自定义的信息(如图片的 URL)在 extra 中传

得到的效果如:

相关资料:

极光介绍说明

iOS10 通知更新详解

玩转 iOS 10 推送 —— UserNotifications Framework(合集)

2.2 Android 设备

版本要求:从 JPush Android SDK v3.1.7 开始支持

REST API 在 Notification - Android 新增字段 large_icon 支持该功能

large_icon 传网络图片时,不能超过 30k;传本地资源路径时,只需要填文件名称,不需要任何前缀后缀

Android 的大图标大部分情况下显示在通知栏消息右侧,有可能在左侧显示,这与设备系统有关

效果如图:

三、如何实现点击跳转到具体页面3.1 新版本支持推送时直接设置跳转页面

Android SDK v3.1.7 开始直接支持点击跳转到指定页面

需要在 REST API 发消息的时候设置 Notification-Android-intent 字段 3.2 客户端自定义实现跳转点击通知跳转的具体逻辑,需要你自己写代码实现,极光需要涉及到的操作流程如下:

1、客户端配置

Android

在 AndroidManifest 里面配置自定义广播接收器

在自己写的 BroadcastReceiver 类里处理 openNotification 后的逻辑,设定根据取到的 extras 字段中的 key 和 value 信息跳转到某个 Activity ,文档示例点我阅读

iOS

iOS 一般在点击了通知栏的消息后才会走获取消息内容 的方法

同样的设定在取到 extras 的对应值时跳转到某页面

2、推送

推送时通过 extras 传递跳转信息,需客户端将设定的 extras 规则告知负责推送的人,某消息的 extra 是什么

extras 字段在 Notification 和 Message 中均有提供,官网推送时在可选设置 - 附加字段处传值,点击极光默认的通知栏进行跳转的 extra 需要在 Notification 里面传,详细说明

完整的推送示例说明 ,注意 Notification 的 extra 在 iOS 或 Android 的平台属性下才支持

3.3 点击消息后应用为什么被重新启动参考 极光推送默认唤起应用是否是开启了一个新的应用?

3.4 Android 7.0 开始,系统会自动将多条通知消息合并

如果点击合并的通知,只能跳转到首页,这是系统的规则,系统并未提供跳转具体页面的 API

需要展开合并的消息,再依次点击才可以实现跳转具体页面

规避方案:让通知栏的消息少于「系统会合并的条数」,让他不合并,设置文档

3.5 Android 进程退出,收到了推送,点击通知消息,无法打开

如果是在 debug 状态下正常,打包后异常,可能需要检查下防混淆的设置,接收消息的 BroadcastReceiver 和跳转的页面均加上防止混淆的代码,参考用户

vivo 部分手机有后台弹出界面的权限,将该权限打开。有的是需要在 oppo vivo 的手机管家打开应用的自启动或者悬浮窗

一般来说,出现这个问题源自 Android 系统对 App 不同状态下,启动的限制

可能的原因:

Android 应用退出后,可能长连接还存在,所以能收到消息,但是由于手机系统对 App 的限制,导致点击通知栏不能重启 App 成功。

一般出现在 点击要自定义跳转时,若只是极光默认的点击 打开 App 首页应该没有问题

解决办法:

打开手机系统的限制 :已被开发者验证该方法有效,反推则源头正确。

努比亚手机的注意事项 ,建议配置 PopWinActivity如下:

android:name="cn.jpush.android.ui.PopWinActivity"

android:theme="@style/MyDialogStyle"

android:exported="false" >

自定义跳转,设置在 App 未启动时先启动 App

开发者分享的方法点我查看

同一个思路,使用 react-native 插件的讨论

更多 react-native的讨论

react 插件跳转到指定的页面,GitHub 说明

四、消息如何换行展示4.1 Android 通过大文本实现

版本要求:Android SDK 3.0.0 以上版本支持,支持 api 16 以上的rom

设置说明:服务端推送在 notification → Android 中设置相关字段

null

该功能属于原生 ROM 功能,部分深度定制 ROM 可能不支持。

小米和魅族使用大文本查看正文需双指下拉。4.2 iOS 支持直接换行

iOS 通知本身即支持自动换行展示

iOS 主动换行添加 \n 即可,PHP 字符串如果用单引号 " 会导致换行失败,变成 \n,换成双引号即可。

iOS 还支持 title 和 subtitle ,与内容之间是分行展示的,会自动加粗,阅读设置方法

五、如何设置标题和副标题5.1 Android 设置标题 title直接为 title 字段赋值即可,阅读文档

{

"notification" : {

"android" : {

"alert" : "hello, JPush!",

"title" : "JPush test",

}

}

}5.2 iOS 如何设置 title 和 subtitle5.2.1 展示效果介绍iOS 10 以下支持设置标题 title ,设置后 title 值将取代通知栏上的应用名称:

iOS 10 及以上支持设置标题 title 和 subtitle,title 和 subtitle 自带加粗效果,无法取消,展示效果如下图:

5.2.2 官网推送传值介绍选择推送通知 → 选择 iOS 目标平台 → 展开可选设置 → iOS 可选设置下有 title 和 subtitle 选择

5.2.3 Push API 推送传值介绍iOS 的 alert 是支持 json 对象的,所以你可以传递一个固定格式的 json,比如:

{

"notification" : {

"ios" : {

"alert" : {

"title" : "JPush Title", //可选设置

"subtitle" : "JPush Subtitle" , //可选设置

"body" : "JPush Body" //必填,否则通知将不展示,在不设置 title 和 subtitle 时直接对 alert 传值即可,不需要特地写 body 字段

},

"sound" : "sound.caf",

"badge" : 1,

"extras" : {

"news_id" : 134,

"my_key" : "a value"

}

}

}

}5.2.4 服务端 SDK 传值介绍极光提供的各语言的服务端 SDK 均已支持传 title 和 subtitle,如果你所使用的 SDK 不支持,请更新到最新版本。

1、Java SDK (从 3.2.11 版本开始支持)example 示例: GitHub地址点我

public static void testSendIosAlert() {

JPushClient jpushClient = new JPushClient(MASTER_SECRET, APP_KEY);

IosAlert alert = IosAlert.newBuilder()

.setTitleAndBody("test alert", "subtitle", "test ios alert json")

.setActionLocKey("PLAY")

.build();

try {

PushResult result = jpushClient.sendIosNotificationWithAlias(alert, new HashMap(), "alias1");

LOG.info("Got result - " + result);

} catch (APIConnectionException e) {

LOG.error("Connection error. Should retry later. ", e);

} catch (APIRequestException e) {

LOG.error("Error response from JPush server. Should review and fix it. ", e);

LOG.info("HTTP Status: " + e.getStatus());

LOG.info("Error Code: " + e.getErrorCode());

LOG.info("Error Message: " + e.getErrorMessage());

}

}2、PHP SDKexample 示例: GitHub地址点我

try {

$response = $client->push()

->setPlatform(array('ios', 'android'))

->addRegistrationId($registration_id)

->setNotificationAlert('Hi, JPush')

->iosNotification(array(

'title' => 'title', //可选设置

'subtitle' => 'subtitle', //可选设置

'body' => 'body'//必填,否则通知栏不展示

),array(

'sound' => 'sound.caf',

'extras' => array(

'key' => 'value',

'jiguang'

),

))

->options(array(

// True 表示推送生产环境,False 表示要推送开发环境;如果不指定则默认为推送生产环境

'apns_production' => false,

))

->send();

print_r($response);

} catch (\JPush\Exceptions\APIConnectionException $e) {

// try something here

print $e;

} catch (\JPush\Exceptions\APIRequestException $e) {

// try something here

print $e;

}3、C# SDKalert 实现为接收 Object 类型

pulic calss IOS

{

[JsonProperty("alert")]

public object Alert { get; set; }

[JsonProperty("sound", NullValueHandling = NullValueHandling.Ignore)]

public string Sound { get; set; }

}

如果对你有帮助,点个赞呗 ლ(╹◡╹ლ)

不吹不黑,关注「常见问题」专栏可以解决你 90% 的问题 (ノ◕ω◕)ノଘ_ଘ

如果还有你想知道的问题没有总结方案,来评论区跟我交流交流吖