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

一、通知栏图标显示不正常

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 -点开可选参数-填写通知栏编号

android推送 mqtt android推送图标_iOS

android推送 mqtt android推送图标_推送_02

二、通知栏右侧大图如何实现

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 中传

得到的效果如:

android推送 mqtt android推送图标_iOS_03

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

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

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

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

效果如图:

android推送 mqtt android推送图标_Android_04

android推送 mqtt android推送图标_iOS_05

三、如何实现点击跳转到具体页面

3.1 新版本支持推送时直接设置跳转页面Android SDK v3.1.7 开始直接支持点击跳转到指定页面

需要在 REST API 发消息的时候设置 Notification-Android-intent 字段

3.2 客户端自定义实现跳转点击通知跳转的具体逻辑,需要你自己写代码实现,极光需要涉及到的操作流程如下:

1、客户端配置

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

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

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

同样的设定在取到 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" >

四、消息如何换行展示

4.1 Android 通过大文本实现版本要求:Android SDK 3.0.0 以上版本支持,支持 api 16 以上的rom

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

该功能属于原生 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 和 subtitle

5.2.1 展示效果介绍

iOS 10 以下支持设置标题 title ,设置后 title 值将取代通知栏上的应用名称:

android推送 mqtt android推送图标_iOS_06

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

android推送 mqtt android推送图标_推送_07

5.2.2 官网推送传值介绍

选择推送通知 → 选择 iOS 目标平台 → 展开可选设置 → iOS 可选设置下有 title 和 subtitle 选择

android推送 mqtt android推送图标_android推送 mqtt_08

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 SDK

example 示例: 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# SDK
alert 实现为接收 Object 类型
pulic calss IOS
{
[JsonProperty("alert")]
public object Alert { get; set; }
[JsonProperty("sound", NullValueHandling = NullValueHandling.Ignore)]
public string Sound { get; set; }
}

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