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

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

1.1 基本说明

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

1.2 iOS 排查

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

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

  • 是否图标设计不符合 iOS 的要求;
  • 或者与桌面背景有关;
  • 某个手机的 bug,换一个手机测试。
  • 若修改过一次图标,请卸载重装后测试。

    1.3 Android 排查

  1. 若没有 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,按照上述要求配置好后, 重启手机,再测试
  2. 部分手机系统可能会默认使用 App 的 icon 当图标(即便有上述资源文件),可定制一下通知栏样式 ,手动设置图标,默认的方法如果不行,则可以使用 CustomPushNotificationBuilder 高级定制。
  3. 特别注意
    • 推送的时候要指定 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 -点开可选参数-填写通知栏编号

null

null

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

2.1 iOS 设备

  1. 版本要求:从 JPush iOS SDK v2.1.9,iOS 10 开始支持。
  2. 通过 iOS 10 的 Service Extension 提供支持,需要先客户端实现该功能,具体参考下我们官方的 demo。
  3. REST API 在 Notification - iOS 中提供字段 mutable-content 支持该功能
    • 推送的时候携带 ”mutable-content":true 说明是支持 iOS10 的 UNNotificationServiceExtension
    • 其他所需要的自定义的信息(如图片的 URL)在 extra 中传
  4. 得到的效果如:

null

  1. 相关资料:

2.2 Android 设备

  1. 版本要求:从 JPush Android SDK v3.1.7 开始支持
  2. REST API 在 Notification - Android 新增字段 large_icon 支持该功能
  3. large_icon 传网络图片时,不能超过 30k;传本地资源路径时,只需要填文件名称,不需要任何前缀后缀
  4. Android 的大图标大部分情况下显示在通知栏消息右侧,有可能在左侧显示,这与设备系统有关
  5. 效果如图:

null

null

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

3.1 新版本支持推送时直接设置跳转页面

  1. Android SDK v3.1.7 开始直接支持点击跳转到指定页面
  2. 需要在 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 进程退出,收到了推送,点击通知消息,无法打开

  1. 如果是在 debug 状态下正常,打包后异常,可能需要检查下防混淆的设置,接收消息的 BroadcastReceiver 和跳转的页面均加上防止混淆的代码,参考用户
  2. vivo 部分手机有后台弹出界面的权限,将该权限打开。有的是需要在 oppo vivo 的手机管家打开应用的自启动或者悬浮窗
  3. 一般来说,出现这个问题源自 Android 系统对 App 不同状态下,启动的限制

四、消息如何换行展示

4.1 Android 通过大文本实现

  1. 版本要求:Android SDK 3.0.0 以上版本支持,支持 api 16 以上的rom
  2. 设置说明:服务端推送在 notification → Android 中设置相关字段

null

  1. 该功能属于原生 ROM 功能,部分深度定制 ROM 可能不支持。
    • 小米和魅族使用大文本查看正文需双指下拉。

      4.2 iOS 支持直接换行

  2. iOS 通知本身即支持自动换行展示
  3. iOS 主动换行添加 \n 即可,PHP 字符串如果用单引号 " 会导致换行失败,变成 \n,换成双引号即可。
  4. 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 值将取代通知栏上的应用名称:

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<String, String>(), "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; }
}

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

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

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