极光消息推送如何实现图标设置?

进入 Images.xcassets-AppIcon,设置 iPhone Notification 的图标,大小分别为 40 x 40px、60 x 60px

极光消息推送如何实现图标设置?

本文旨在指导用户如何设置通知栏小图标、右侧图标以及大图片。
极光消息推送如何实现图标设置?

iOS

小图标

进入 Images.xcassets-AppIcon,设置 iPhone Notification 的图标,大小分别为 40 x 40px、60 x 60px。

iOS 不支持服务端动态下发消息设置小图标。

极光消息推送如何实现图标设置?

右侧图标 / 大图片

App 在前台时收到推送弹窗,下拉消息可以查看大图片,其他情况无大图片展示。

支持版本

从 JPush iOS SDK v2.1.9,iOS 10 开始支持。

客户端设置

  • 创建一个 Service Extension 服务,详情参考 iOS 10 Service Extension
  • 将 jpush-extension-ios-xxx.a 和 JPushNotificationExtensionService.h 两个文件引入到您的 Service Extentsion 工程中。
  • 添加 Framework:libz.tbd 和 libresolv.tbd。
  • 调用 [jpushSetAppkey:] 方法设置您的 appkey,请注意这里的 appkey 应该和您极光应用的 appkey 相同。
  • 在 [didReceiveNotificationRequest:] 回调方法中获取图片链接,详情参考 SDK 的 demo ,示例如下:
          - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
  self.contentHandler = contentHandler;
  self.bestAttemptContent = [request.content mutableCopy];
  self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [NotificationService]", self.bestAttemptContent.title];
  
  NSString * attachmentPath = self.bestAttemptContent.userInfo[@"my-attachment"];
  //if exist
  if (attachmentPath) {
    //download
    NSURL *fileURL = [NSURL URLWithString:attachmentPath];
    [self downloadAndSave:fileURL handler:^(NSString *localPath) {if (localPath) {UNNotificationAttachment * attachment = [UNNotificationAttachment attachmentWithIdentifier:@"myAttachment" URL:[NSURL fileURLWithPath:localPath] options:nil error:nil];
        self.bestAttemptContent.attachments = @[attachment];
      }
      [self apnsDeliverWith:request];
    }];
  }else{[self apnsDeliverWith:request];
  }
}

- (void)downloadAndSave:(NSURL *)fileURL handler:(void (^)(NSString *))handler {NSURLSession * session = [NSURLSession sharedSession];
  NSURLSessionDownloadTask *task = [session downloadTaskWithURL:fileURL completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    NSString *localPath = nil;
    if (!error) {NSString * localURL = [NSString stringWithFormat:@"%@/%@", NSTemporaryDirectory(),fileURL.lastPathComponent];
      if ([[NSFileManager defaultManager] moveItemAtPath:location.path toPath:localURL error:nil]) {localPath = localURL;}
    }
    handler(localPath);
  }];
  [task resume];
  
}

        

服务端设置

图片展示需要在 ios 下配置 mutable-content 和 extras 字段。

关键字类型选项父项目含义说明
mutable-contentboolean可选notification.ios通知扩展推送的时候携带 ”mutable-content”:true 说明是支持 iOS 10 的 UNNotificationServiceExtension,如果不携带此字段则是普通的 Remote Notification,详情参考:UNNotificationServiceExtension
extrasJSON Object可选notification.ios附加字段这里自定义 key / value 信息,这个 key(my-attachment)值,需要与客户端的值对应,客户端工程拿到 key 值对应的 url 图标加载出来。
          "notification": {
    "ios": {
        "alert": {
            "title": "title",
            "subtitle": "subtitle"
        },
        "mutable-content": true,
        "extras": {
            // 这个 key(my-attachment)值,需要与客户端的值对应,客户端工程拿到 key 值对应的 url 图标加载出来。
            "my-attachment": "https://raw.githubusercontent.com/Tikon/imgRepo/master/ic_launcher.png"
        }
    }
}  

        

控制台下发

极光消息推送如何实现图标设置?

Android

支持版本

极光通道从 JPush Android SDK v3.1.7 开始支持,厂商通道图标从 JPush SDK 3.9.0 开始支持。

通道支持情况

通道动态设置小图标右侧图标大图片
极光支持支持(魅族手机本身不支持)支持
小米支持支持支持
华为支持支持(仅服务与资讯消息支持)不支持
oppo不支持支持支持
FCM不支持支持支持
魅族不支持不支持不支持
vivo不支持不支持不支持

说明:

  • 华为服务与资讯消息类申请参考 消息分类(Channel ID)
  • OPPO 单点推送不支持右侧图标和大图片,若 OPPO 推送目标小于 20 个,极光后台调用 OPPO 的单点推送接口下发消息,详情参考 OPPO 说明文档
  • OPPO 推送目标大于 20 个且 ColorOS 版本 >5.0 ,在连接 wifi 的状态下通知栏第一条消息展示大图,非第一条消息不显示大图。

小图标

客户端设置

  • 如果项目中有 res/drawable-xxxx/jpush_notification_icon 资源,则默认使用 jpush_notification_icon 作为通知小图标。
  • 如无 jpush_notification_icon 资源,则默认使用应用图标。
  • FCM 通道设置默认小图标:
          <!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
     See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/jpush_notification_icon" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
     notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />

        

服务端设置

若需要动态设置通知栏小图标,可在 android 下配置 small_icon_uri 字段,厂商通道可在 options.third_party_channel 下配置对应厂商的 small_icon_uri 字段,优先使用厂商字段, 厂商字段没有填充,则使用 android 下的 small_icon_uri 字段。

注意:若使用小米通道,small_icon_uri 必须使用极光图片上传接口得到的图片路径(建议使用 media_id 值),详情参考 图片 API

关键字类型选项父项目含义说明
small_icon_uristring可选notification.
android
通知栏小图标图标大小不超过 30 k (注:从 JPush Android SDK v4.0.0 版本开始,图片大小限制提升至 300 k)。可以是以 http 或 https 开头的网络图片。可以是通过极光图片上传接口得到的 media_id 值,详情参考 图片 API(推荐使用)。此字段值,若是 media_id, 则对其它厂商通道生效,若非 media_id,则对走华硕通道和极光通道下发的消息生效,不影响请求走其它厂商通道。
small_icon_uristring可选options.
third_party_channel. 厂商
厂商消息小图标样式目前支持小米 / 华为两个厂商。优先使用厂商字段, 厂商字段没有填充,则使用 android 里面定义 small_icon_uri 字段。小米支持极光的 media_id 及小米厂商的小图标 id,华为支持极光的 media_id 及华为厂商本地路径。(小米官方后续不再支持自定义小图标,建议开发者不要继续使用小米 small Icon 相关特性功能)。
small_icon_colorstring可选options.
third_party_channel.
xiaomi
小米厂商小图标样式颜色为了适配小米厂商的消息小图标样式颜色,不填充默认是灰色。

示例如下:

          "notification": {
    "android": {
        "alert": "Hi, JPush!",
        "title": "Send to Android",
        // 此字段值,若是极光 media_id, 则对其它厂商通道也会使用这个 media_id 下发,若非 media_id,则对走华硕通道下发和极光自有通道下发生效,不影响请求走其它厂商通道。
        "small_icon_uri": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699"
    }
},
"options": {
    "time_to_live": 60,
    "third_party_channel": {
        "xiaomi": {
            "distribution": "ospush",
            // 通知样式需切换到原生样式传值才生效,但是原生样式默认是灰白,需要传值 small_icon_color 染色
            "small_icon_uri": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
            "small_icon_color": "#00FF00" // 染绿色
        },
        "huawei": {
            "distribution": "ospush",
            "small_icon_uri": "/raw/icon_hw" // 后台指定的路径,在客户端工程需要有这个图片, 放置目录为 res/raw/xxx.png               
        }
    }
}

        

右侧图标 / 大图片

通过服务端下发指定参数即可实现右侧图标和大图片展示。

注意:若使用小米通道, large_icon/big_pic_path 必须使用极光图片上传接口得到的图片路径(建议使用 media_id 值),详情参考 图片 API

服务端设置

关键字类型选项父项目含义说明
styleint可选notification.
android
通知栏样式类型默认为 0,还有 1,2,3 可选,用来指定选择哪种通知栏样式,其他值无效。有三种可选分别为 bigText=1,Inbox=2,bigPicture=3。
big_pic_pathstring可选notification.
android
大图片通知栏样式当 style = 3 时可用,目前支持 .jpg 和 .png 格式的图片。支持网络图片 url、本地图片的 path、极光 media_id。如果是 http/https 的 url,会自动下载;如果要指定开发者准备的本地图片就填 sdcard 的相对路径。
large_iconstring可选notification.
android
通知栏大图标图标大小不超过 30 k(注:从 JPush Android SDK v4.0.0 版本开始,图片大小限制提升至 300 k)。可以是以 http 或 https 开头的网络图片。可以是位于 drawable 资源文件夹的图标路径。可以是通过极光图片上传接口得到的 media_id 值。此字段值,若是 media_id, 则对其它厂商通道生效,若非 media_id,则对走华硕通道和极光通道下发的消息生效,不影响请求走其它厂商通道。
styleint可选options.
third_party_channel.
厂商
厂商消息大文本 /inbox/ 大图片样式为了适配厂商的消息大文本 /inbox/ 大图片样式,不填充默认是 0。对应关系 bigText=1,Inbox=2,bigPicture=3。
big_pic_pathstring可选options.
third_party_channel.
厂商
厂商大图片通知栏样式支持小米 /oppo 两个厂商。优先使用厂商字段, 厂商字段没有填充,则使用 android 里面定义 big_pic_path 字段。建议使用 极光 media_id,需配合各自厂商的 style 使用。
large_iconstring可选options.
third_party_channel.
厂商
厂商消息大图标样式支持小米 / 华为 /oppo 三个厂商。优先使用厂商字段, 厂商字段没有填充,则使用 android 里面定义 large_icon 字段 android 内的 large_icon。其中小米支持极光的 media_id(详见: 图片 API) 及小米厂商的大图标 id, 但必须配合小米 big_text 或者是 big_pic_path 使用,否则无效。华为支持极光的 media_id 及网络 https 路径。oppo 支持极光的 media_id 及 oppo 厂商的大图标 id。

示例如下:

          {
    "notification": {
        "android": {
            "alert": "Hi, JPush!",
            "title": "Send to Android",
            "large_icon": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
            "big_pic_path": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
            "style": 3
        }
    },
    "options": {
        "third_party_channel": {
            // 此处所传的 large_icon 和 big_pic_path,必须是调用极光图片 API 返回的路径,否则推送到厂商将会报错。
             "xiaomi": {
                "distribution": "ospush",
                "big_text": "testbigtext",
                // 必须配合小米 big_text 或者是 big_pic_path 使用
                "large_icon": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
                "big_pic_path": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
                "style": 3
            },
            // 华为只支持右侧图标,不支持大图片
            "huawei": {
                "distribution": "ospush",
                "large_icon": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
                "style": 1
            },
            //oppo 单推不支持大图片和右侧图标,极光内部目前如果推送的 OPPO 目标小于 20 都会用 oppo 的单推接口下发推送,因此推送目标小于 20 个大图片和右侧图标是不生效的
            "oppo": {
                "distribution": "ospush",
                "large_icon": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
                "big_pic_path": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
                "style": 3
            }
        }
    }
}

        

FAQ

小图标

1. 小图标显示为灰色

  • 谷歌原生 Android 5.0 以上的 ROM 都会对 target sdk 大于等于 21 的 App 的小图标进行处理,增加一层颜色,导致图标变灰。我们可以定义 没有阴影和渐变色、镂空背景 的 icon 同名替换项目中 res/drawable-xxxx/jpush_notification_icon 这个文件,该方式显示的小图标即可为灰色(但是图标有形状)。请严格按照要求制作图片,并将 res 文件夹下的 所有 icon 文件 都替换成自己的图标文件。
  • 由于部分系统(一加手机、google 手机 android10 系统等)对图标有限制,目前无法处理。
  • 小米手机的 launcher 可能有缓存,按照上述要求配置好后, 需 重启手机 后再测试。
  • 小米手机无论走极光通道还是小米通道,都需要切换到原生样式才可以生效。极光消息推送如何实现图标设置?

2. 客户端更换 icon 图标不生效

由于系统、厂商服务器会缓存图标,小米和魅族手机可能会出现此现象,建议卸载应用,重启手机后重新安装新包后测试。

右侧图标 / 大图片

推送的时候做了以上处理,右侧图标 / 大图片还是无法展示?

1.极光通道
如果走极光通道也不生效,请确认用户是否调用过 设置默认通知栏样式构建类 接口更改过极光默认样式。如果有调用,请删除此接口,卸载重装 App 后重试。
极光消息推送如何实现图标设置?

2.APNs 通道
iOS 的右侧图标和大图片是一图两用的情况,App 在前台时收到推送弹窗,下拉消息可以查看大图片,其他情况仅展示为右侧图标。
极光消息推送如何实现图标设置?极光消息推送如何实现图标设置?

3.FCM 通道
Firebase 官网的右侧图标和大图片是一图两用的情况,指定右侧图标和大图片推送,未展开消息时显示为右侧图标,展开消息后展示为大图片,详情如下图。
极光消息推送如何实现图标设置?

编辑:yimen,如若转载,请注明出处:https://www.yimenapp.com/kb-yimen/15863/

部分内容来自网络投稿,如有侵权联系立删

(0)
上一篇 2022年12月22日 下午3:21
下一篇 2022年12月22日 下午3:24

相关推荐