IM 即时通讯
Android
新手接入指南
产品介绍
简介
主要功能
产品优势
海外数据中心
接口及业务限制
功能介绍
帐号集成与登录
群组功能
聊天室功能
聊天室标签功能
圈组功能
多端登录与互踢策略
质量数据监控台
更新日志
IM UIKit 更新日志
NIM SDK 开发版更新日志
NIM SDK 稳定版更新日志
体验 Demo
下载 SDK 与 Demo 源码
快速开始
跑通 IM Demo 源码
实现单聊消息收发(不含 UI)
实现圈组消息收发(不含 UI)
含 UI 集成
什么是 IM UIKit
IM UIKit 功能列表
快速集成 IM UIKit
组件导入
初始化
界面跳转
自定义用户信息
全局配置
IM UIKit API 概览
会话列表相关
集成会话列表界面
会话列表事件监听
自定义会话列表界面 UI
会话列表 API 概览
会话消息相关
集成会话界面
会话界面事件监听
实现自定义消息发送(含 UI)
自定义会话界面 UI
会话消息 API 概览
通讯录相关
集成通讯录界面
自定义通讯录界面 UI
通讯录界面事件监听
通讯录 API 概览
不含 UI 集成
使用说明
集成与初始化
登录管理
消息相关
消息概述
消息收发
自定义消息收发
消息配置选项
多媒体资源存储场景
广播消息收发
消息已读回执
消息撤回
消息重发与转发
消息更新
消息过滤
语音消息处理
插入本地消息
历史消息
最近会话
服务端会话服务
用户资料
用户关系
在线状态订阅
系统通知
离线推送与消息提醒
群组功能
群组概述
群组管理
群成员管理
群消息管理
超大群功能
聊天室
圈组功能
登录管理
服务器相关
服务器概述
服务器管理
服务器成员管理
服务器未读数管理
频道相关
频道概述
频道管理
频道黑白名单
频道未读数管理
实时互动频道
频道分组
频道分组黑白名单
搜索服务器和频道
身份组相关
身份组概述
身份组应用场景
服务器身份组
频道身份组
用户定制权限
频道分组身份组
自定义权限
成员权限查询与判定
身份组相关查询
圈组订阅机制
消息相关
图解圈组消息流转
圈组消息收发
圈组消息撤回
圈组消息更新
圈组消息删除
会话消息回复(Thread)
圈组快捷评论
消息正在输入
获取频道最后一条消息
查询历史消息
圈组消息缓存
圈组消息搜索
系统通知
圈组离线推送
圈组内容审核
圈组相关抄送
圈组第三方回调
反垃圾
聊天扩展
其他
最佳实践
IM 应用隐私合规
聊天室重要消息投递
API 参考
Android API 参考
Android 端状态码
IM 控制台指南
创建应用
注册 IM 账号
升级服务
开通聊天室功能
常见问题
FAQ
错题集
Android 端推送问题排查
服务协议

离线推送与消息提醒

更新时间: 2022/11/21 14:19:09

推送

为了提高消息送达率,云信在 Android 进程保活上做了很多努力,但是在国内 Android 系统的大环境下,厂家的深度定制 ROM 对系统做了越来越严格的限制,想要在所有机型上做到永久保活是不可能实现的,并且保活也会使额外功耗增加。

因此,云信引入手机系统厂商推送,当用户清理掉应用进程、网络不稳定等导致客户端SDK无法与云信服务器保持正常连接时,将使用手机厂商系统级推送来提醒用户有消息需要接收。

手机系统级别的厂商推送(如小米、华为、VIVO、OPPO、魅族等)的优势于其拥有稳定的系统级长连接,可以做到随时接受推送。测试推送时,可以编译apk安装到支持该系统级推送的手机上,登陆成功后杀掉进程,使用其他账号对其发送消息,查看推送接收情况。

在 Android 和 iOS 平台中,推送证书名长度不超过 32 个字符,否则登录时会报错 500。

推送渠道的选择

如果SDKOptions.mixPushConfig.autoSelectPushType为false(默认),则SDK直接选择服务端推荐的推送渠道

如果配置SDKOptions.mixPushConfig.autoSelectPushType为true则SDK根据实际上的token的获取情况确定推送渠道,此时服务端推荐的推送渠道为最高优先级。需要确定推送渠道时,先进行本地支持性判断,然后将向所有可能支持的推送厂商申请token,并在成功拿到的token中选择优先级更高的渠道。

小米推送

准备工作

  • 集成推送辅助包,参见SDK集成push的说明。

  • 前往小米消息推送服务注册账号并通过认证,创建应用并获取推送的AppID、AppKey、AppSecret。

  • 前往云信控制台添加小米推送证书。具体配置步骤如下:


    单击展开查看具体步骤
    1. 选择应用,进入应用详情界面。
    2. 在应用详情界面的右上角选择更多 > 证书管理 > Android 推送证书 > 添加证书,弹出如下对话框。

    3. 根据界面提示,在该对话框内配置证书类型和证书名称等信息。
    4. 其中的“证书名称”即为初始化 SDK 时需传入的推送证书信息中的xmCertificateName
  • 将小米推送的 SDK 导入到工程中,当前兼容的版本为 MiPush_SDK_Client_5_1_0

接入配置

  • AndroidManifest.xml 配置

有两处需要改成开发者自己的 APP 包名,已经配置过的条目则无须添加。

<!--配置权限,已经配置过的条目则无须添加-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.VIBRATE"/>

<!--以下两处 {你的包名} 改开发者App的包名-->
<permission android:name="{你的包名}.permission.MIPUSH_RECEIVE"
            android:protectionLevel="signature" />
<uses-permission android:name="{你的包名}.permission.MIPUSH_RECEIVE" />

下面这些配置直接拷贝到 AndroidManifest.xml ,不需要做任何改动。

<!--配置的service和receiver-->
<service
    android:name="com.xiaomi.push.service.XMPushService"
    android:enabled="true"
    android:process=":pushservice"/>
<service
    android:name="com.xiaomi.push.service.XMJobService"
    android:enabled="true"
    android:exported="false"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:process=":pushservice" />
    <!--注:此service必须在3.0.1版本以后(包括3.0.1版本)加入-->
<service
    android:enabled="true"
    android:exported="true"
    android:name="com.xiaomi.mipush.sdk.PushMessageHandler" />

<service android:enabled="true"
    android:name="com.xiaomi.mipush.sdk.MessageHandleService" />
<!--注:此service必须在2.2.5版本以后(包括2.2.5版本)加入-->
<receiver
    android:exported="true"
    android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver" >
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>
<receiver
    android:exported="false"
    android:process=":pushservice"
    android:name="com.xiaomi.push.service.receivers.PingReceiver" >
    <intent-filter>
        <action android:name="com.xiaomi.push.PING_TIMER" />
    </intent-filter>
</receiver>
<receiver
    android:name="com.netease.nimlib.mixpush.mi.MiPushReceiver"
    android:exported="true">
    <intent-filter android:priority="0x7fffffff">
        <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE"/>
        <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED"/>
        <action android:name="com.xiaomi.mipush.ERROR"/>
    </intent-filter>
</receiver>
  • 证书信息配置

在SDK初始化时,需要将推送相关证书信息配置到 SDKOptions.mixPushConfig 中。

示例:

MixPushConfig config = new MixPushConfig();
// 传入从小米推送平台获取到的AppId与AppKey
config.xmAppId = "xxxx";
config.xmAppKey = "xxxx";
// 传入云信控制台上小米推送对应的证书名
config.xmCertificateName = "xxxx";
...
options.mixPushConfig = config;

如果构建 APP 时有使用代码混淆,需要在 proguard.cfg 中加入

-dontwarn com.xiaomi.push.**
-keep class com.xiaomi.** {*;}

至此,小米推送接入完成,现在可以在小米设备上进行消息推送的测试。

推送兼容性

若开发者自身业务体系中,也需要接入小米推送,则需要考虑开发者自身业务体系的小米推送与云信消息的小米推送兼容 需要做好以下2点,其余配置、逻辑都不需要修改。

  • 对于小米推送,为了接收推送消息,小米SDK 要求开发者自定义一个继承自 PushMessageReceiverBroadcastReceiver ,并注册到 AndroidManifest.xml。由于小米的特殊处理,同时注册多个继承自 PushMessageReceiverBroadcastReceiver 会存在收不到消息的情况,要保证开发者自身业务体系的小米推送与云信消息的小米推送兼容,开发者需要新建广播接收器,从继承 PushMessageReceiver 改为继承 MiPushMessageReceiverMiPushMessageReceiver 为云信提供,推送消息首先被 MiPushReceiver 接收,如果是开发者自身体系的推送消息,MiPushReceiver 会将消息传递给 MiPushMessageReceiver
/**
 * 以下这些方法运行在非 UI 线程中, 与小米SDK PushMessageReceiver 方法一一对应。
 * 开发者如果自身也需要接入小米推送,则应将继承 PushMessageReceiver 改为继承 MiPushMessageReceiver
 */

public class MiPushMessageReceiver extends BroadcastReceiver{

    @Override
    public final void onReceive(Context context, Intent intent) {
    }

    public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
    }

    public void onNotificationMessageClicked(Context context, MiPushMessage message) {
    }

    public void onNotificationMessageArrived(Context context, MiPushMessage message) {
    }

    public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
    }

    public void onCommandResult(Context context, MiPushCommandMessage message) {
    }

    public void onRequirePermissions(Context context, String[] strings) {
    }
}
  • 在将广播接收器改为继承 MiPushMessageReceiver 之后,将该广播在 AndroidManifest 中配置如下,开发者只需将广播名称 MiPushMessageReceiver 替换成自身的广播名。此外,请不要为此 Receiver 配置 priority
<receiver android:name="xxx.MiPushMessageReceiver">
    <intent-filter>
        <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE"/>
        <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED"/>
        <action android:name="com.xiaomi.mipush.ERROR"/>
    </intent-filter>
</receiver>

华为推送

华为推送从新版 HMS 包开始采用了和小米推送相似的系统级连接方案,但是依赖于 EMUI 版本和 华为移动服务 版本,经过大量测试表明,EMUI4.1及以上并同时满足华为移动服务版本5.3.0.304以上时比较稳定能收到推送。

准备工作

集成推送辅助包,参见SDK集成push的说明。

参考华为开发准备文档进行如下工作:

  • 前往华为推送服务注册账号并通过认证,创建应用并获取APP IDAPP SECRET

  • 前往云信控制台添加华为推送证书。具体步骤如下:


    单击展开查看具体步骤
    1. 选择应用,进入应用详情界面。
    2. 在应用详情界面的右上角选择更多 > 证书管理 > Android 推送证书 > 添加证书,弹出如下对话框。

    3. 根据界面提示,在该对话框内配置证书类型和证书名称等信息。其中的“证书名称”即为初始化 SDK 时需传入的推送信息中的hwCertificateName
  • agconnect-services.json 文件拷贝到应用级根目录下,配置HMSSDKmaven仓库地址,并添加编译依赖。

  • 将华为推送的 SDK 导入到工程中,当前兼容的版本为 com.huawei.hms:push: 6.5.0.300

接入配置

首先,Application#onCreate中,主进程下进行如下操作:

public class NimApplication extends Application {
    ...
    @Override
    public void onCreate() {
        ...
        if (NIMUtil.isMainProcess(this)) {
            ...
            // 在此处添加以下代码
            com.huawei.hms.support.common.ActivityMgr.INST.init(this);
            ...
        }
    }
}
  • AndroidManifest.xml 配置
<service
      android:name="com.netease.nimlib.mixpush.hw.HWPushService"
      android:exported="false">
      <intent-filter>
            <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
      </intent-filter>
</service>
  • 证书信息配置

在SDK初始化时,需要将推送相关证书信息配置到 SDKOptions.mixPushConfig 中。

MixPushConfig config = new MixPushConfig();
// 传入华为推送的APP ID
config.hwAppId = "xxxx";
// 传入云信控制台上华为推送证书名
config.hwCertificateName = "xxxx";
...
options.mixPushConfig = config;

如果构建 APP 时有使用代码混淆,需要在 proguard.cfg 中加入排除 HMS SDK 的混淆配置:

-ignorewarning 
-keepattributes *Annotation* 
-keepattributes Exceptions 
-keepattributes InnerClasses 
-keepattributes Signature 
-keepattributes SourceFile,LineNumberTable 
-keep class com.hianalytics.android.**{*;} 
-keep class com.huawei.updatesdk.**{*;} 
-keep class com.huawei.hms.**{*;}

如果开发者使用了AndResGuard,需要在混淆配置文件中加入AndResGuard白名单:

"R.string.hms*",
"R.string.connect_server_fail_prompt_toast",
"R.string.getting_message_fail_prompt_toast",
"R.string.no_available_network_prompt_toast",
"R.string.third_app_*",
"R.string.upsdk_*",
"R.layout.hms*",
"R.layout.upsdk_*",
"R.drawable.upsdk*",
"R.color.upsdk*",
"R.dimen.upsdk*",
"R.style.upsdk*",
"R.string.agc*"

至此,华为推送接入完成,现在可以在满足条件的华为设备上进行消息推送测试。

消息推送类型配置

华为的消息推送类型根据importance字段的配置(详见华为推送服务开发者文档的《应用适配开发》章节),分为资讯营销类服务与通讯类。其中资讯营销类的提醒方式为静默通知。

因此,为了确保推送能正常提醒用户(锁屏、铃声或震动),需将importance字段设置为NORMAL。该字段的配置点为云信消息体的pushPayload,在其中添加以hwField为key的 Map 或者JSONObject 数据即可,数据格式请参照华为推送AndroidNotification

示例代码如下:

    String classification = cbHwClassification.isChecked() ? "NORMAL" : "LOW";
    Map<String, Object> pushPayload = msg.getPushPayload();
    pushPayload = pushPayload == null ? new HashMap<>() : pushPayload;

    //hwField
    Map<String, Object> hwField = new HashMap<>();
    hwField.put("importance", classification);
    pushPayload.put("hwField", hwField);

推送兼容性

若开发者自身业务体系中,也需要接入华为推送,则需要考虑开发者自身业务体系的华为推送与云信消息的华为推送兼容需要做好以下2点,其余配置、逻辑都不需要修改。

  • 对于华为推送,为了接收推送消息,华为 SDK 要求开发者自定义一个继承自HmsMessageService类的 Service ,并注册到 AndroidManifest.xml。开发者需要将自身的华为推送服务,从继承 HmsMessageService 改为继承HWPushMessageService。开发者自行处理自身体系的推送消息,云信不做处理。
/**
 * 以下这些方法运行在非 UI 线程中, 与HuaWei的PHmsMessageService 方法一一对应。
 * 当开发者自身也接入HuaWei推送,则应将继承 HmsMessageService 改为继承 HWPushMessageService,其他不变
 */
public class HWPushMessageService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    public void onNewToken(String token) {
        MixPushPlatforms.getPushPlatform(PushType.HUA_WEI).onToken(token);
    }

    /**
     * 透传消息, 需要用户自己弹出通知
     *
     * @param remoteMessage
     */
    public void onMessageReceived(RemoteMessage remoteMessage) {
    }

    public void onMessageSent(String s) {
    }

    public void onDeletedMessages() {
    }

    public void onSendError(String var1, Exception var2) {
    }
}
  • 在将服务改为继承 HWPushMessageService 之后,将该服务在 AndroidManifest 中配置如下,开发者只需将服务名称 HWPushMessageService 替换成自身的服务名。
<service 
    android:name="xxx.HWPushMessageService"
    android:exported="false">
    <intent-filter>
      	<action android:name="com.netease.nimlib.mixpush.hw.action.MESSAGING_EVENT" />
    </intent-filter>
</service>

VIVO 推送

准备工作

  • 集成推送辅助包,参见SDK集成push的说明。

  • 前往vivo消息推送服务注册账号并通过认证,创建应用并获取AppID、AppKey、AppSecret。

  • 前往云信控制台,添加 VIVO 推送证书。具体配置步骤如下:


    单击展开查看具体步骤
    1. 选择应用,进入应用详情界面。
    2. 在应用详情界面的右上角选择更多 > 证书管理 > Android 推送证书 > 添加证书,弹出如下对话框。

    3. 根据界面提示,在该对话框内配置证书类型和证书名称等信息。其中的“证书名称”即为初始化 SDK 时需传入的推送信息中的vivoCertificateName
  • 将VIVO推送的 SDK 导入到工程中,当前兼容的版本为 vivo_pushsdk_v3.0.0.4_484。

接入配置

  • AndroidManifest.xml 配置

下面这些配置直接拷贝到AndroidManifest.xml。

<!--配置的service, activity, receiver-->
<service
    android:name="com.vivo.push.sdk.service.CommandClientService"
    android:permission="com.push.permission.UPSTAGESERVICE"
    android:exported="true"/>
<activity
    android:name="com.vivo.push.sdk.LinkProxyClientActivity"
    android:exported="false"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"/>

<receiver android:name="com.netease.nimlib.mixpush.vivo.VivoPushReceiver">
    <intent-filter>
        <!-- 接收 push 消息 -->
        <action android:name="com.vivo.pushclient.action.RECEIVE"/>
    </intent-filter>
</receiver>
  • 证书信息配置

同样在AndroidManifest.xml中,添加配置app_id与api_key:

<meta-data
    android:name="com.vivo.push.api_key"
    android:value="{你的vivo推送app key}"/>
<meta-data
    android:name="com.vivo.push.app_id"
    android:value="{你的vivo推送的app id}"/>

在SDK初始化时,需要将推送相关证书信息配置到 SDKOptions.mixPushConfig 中。

// 传入云信控制台上配置的vivo推送证书名
config.vivoCertificateName = "DEMO_VIVO_PUSH"; 
...
options.mixPushConfig = config;

如果构建 APP 时有使用代码混淆,需要在proguard.cfg中加入:

-dontwarn com.vivo.push.**
-keep class com.vivo.push.**{*; } 
-keep class com.vivo.vms.**{*; }

至此,VIVO推送接入完成,现在可以在VIVO设备上进行消息推送的测试。

推送兼容性

  • 开发者需要新建广播接收器,从继承 OpenClientPushMessageReceiver 改为继承 VivoPushMessageReceiverVivoPushMessageReceiver 为云信提供。

/**
 * 以下这些方法运行在非 UI 线程中, 与VIVO SDK 的 OpenClientPushMessageReceiver 方法一一对应。
 * 当开发者自身也接入VIVO推送,则应将继承 OpenClientPushMessageReceiver 改为继承 VivoPushMessageReceiver,其他不变
 */

public class VivoPushMessageReceiver extends BroadcastReceiver {

    @Override
    public final void onReceive(Context context, Intent intent) {
    }

    public void onNotificationMessageClicked(Context context, UPSNotificationMessage upsNotificationMessage) {
    }

    public void onReceiveRegId(Context context, String s) {
    }
}
  • 在将广播接收器改为继承 VivoPushMessageReceiver 之后,将该广播在 AndroidManifest 中配置如下,开发者只需将广播名称 VivoPushMessageReceiver 替换成自身的广播名。此外,请不要为此 Receiver 配置 priority
<receiver android:name="xxx.VivoPushMessageReceiver">
    <intent-filter>
        <action android:name="com.vivo.pushclient.action.RECEIVE" />
    </intent-filter>
</receiver>

消息类型配置

VIVO的推送消息分为运营消息和系统消息,需要在推送时进行指定,否则按照运营消息处理。

该字段的配置点为消息体的pushPayload,在其中添加以vivoField为key的Map或者JsonObject数据即可,数据格式参照VIVO文档

  • 示例
int classification = vivoClassificationCheckBox.isChecked() ? 1 : 0;
Map<String, Object> pushPayload = msg.getPushPayload();
pushPayload = pushPayload == null ? new HashMap<>() : pushPayload;

//vivoField
Map<String, Object> vivoField = new HashMap<>();
vivoField.put("classification", classification);
pushPayload.put("vivoField", vivoField);

OPPO推送

准备工作

  • 集成推送辅助包,参见SDK集成push的说明。

  • 前往OPPO PUSH平台注册账号并通过认证,创建应用并获取AppId,AppKey,AppSecret,MasterSecret。注意区分 AppSercet 与 MasterSecret 。

  • 前往云信控制台添加 OPPO 推送证书,具体步骤如下。


    单击展开查看具体步骤
    1. 选择应用,进入应用详情界面。
    2. 在应用详情界面的右上角选择更多 > 证书管理 > Android 推送证书 > 添加证书,弹出如下对话框。

    3. 根据界面提示,在该对话框内配置证书类型和证书名称等信息。
      • 其中,MasterSecret 可在OPPO 开放平台配置管理 > 应用配置 中查看。相关文档请参见配置管理
      • 其中的“证书名称”即为初始化 SDK 时需传入的推送信息中的oppoCertificateName
  • 参考OPPO PUSH SDK接口文档将 OPPO 推送的 SDK 导入到工程中,当前兼容的版本为 com.heytap.msp-push-3.1.0.aar

接入配置

首先,Application#onCreate中,主进程下进行如下操作:

public class NimApplication extends Application {
    ...
    @Override
    public void onCreate() {
        ...
        if (NIMUtil.isMainProcess(this)) {
            ...
            // 在此处添加以下代码
            com.heytap.msp.push.HeytapPushManager.init(this, true);
            ...
        }
    }
}
  • AndroidManifest.xml 配置

先声明推送权限:

<!--  oppo推送配置权限-->
<uses-permission android:name="com.coloros.mcs.permission.RECIEVE_MCS_MESSAGE"/>
<uses-permission android:name="com.heytap.mcs.permission.RECIEVE_MCS_MESSAGE"/>


<!--Oppo推送配置项 需要配置以下两项-->
<service
    android:name="com.netease.nimlib.mixpush.oppo.OppoPushService"

    android:permission="com.coloros.mcs.permission.SEND_MCS_MESSAGE">
    <intent-filter>
        <action android:name="com.coloros.mcs.action.RECEIVE_MCS_MESSAGE"/>
    </intent-filter>
</service> <!--兼容Q以下版本-->

<service
    android:name="com.netease.nimlib.mixpush.oppo.OppoAppPushService"

    android:permission="com.heytap.mcs.permission.SEND_PUSH_MESSAGE">

    <intent-filter>
        <action android:name="com.heytap.mcs.action.RECEIVE_MCS_MESSAGE"/>

        <action android:name="com.heytap.msp.push.RECEIVE_MCS_MESSAGE"/>
    </intent-filter>
</service> <!--兼容Q版本-->
  • 证书信息配置

在SDK初始化时,需要将推送相关证书信息配置到 SDKOptions.mixPushConfig 中。

config.oppoAppId = "xxxx";
config.oppoAppKey = "xxxxxx";
// 注意区分AppSercet与MasterSecret
config.oppoAppSercet = "xxxxxxx";
// 传入云信控制台上配置的oppo推送证书名
config.oppoCertificateName = "xxxx";
...
options.mixPushConfig = config;

如果构建 APP 时有使用代码混淆,需要在 proguard.cfg 中加入:

-keep public class * extends android.app.Service

目前OPPO推送不支持透传消息。

至此,OPPO推送接入完成,现在可以在OPPO设备上进行消息推送的测试。

推送兼容性

与小米推送兼容性类似

  • 开发者需要新建广播接收器,从继承 PushServiceAppPushService改为继承 OppoPushMessageServiceOppoAppPushMessageServiceOppoPushMessageServiceOppoAppPushMessageService为云信提供。
/**
 *  以下这些方法运行在非 UI 线程中, 与Oppo的PushService 方法一一对应。
 *  当开发者自身也接入Oppo推送,则应将继承 PushService 改为继承 OppoPushMessageService,其他不变
 */
public class OppoPushMessageService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    /**
     * 普通消息
     * @param context
     * @param appMessage
     */
    public void processMessage(Context context, AppMessage appMessage) {
    }

    /**
     * oppo 官方目前还不支持透传消息
     *
     * @param context
     * @param sptDataMessage
     */
    public void processMessage(Context context, SptDataMessage sptDataMessage) {
    }
}
/**
 *  以下这些方法运行在非 UI 线程中, 与Oppo的PushService 方法一一对应。
 *  当开发者自身也接入Oppo推送,则应将继承 AppPushService 改为继承 OppoAppPushMessageService,其他不变
 */
public class OppoAppPushMessageService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    /**
     * 普通消息
     * @param context
     * @param appMessage
     */
    public void processMessage(Context context, AppMessage appMessage) {
    }

    /**
     * oppo 官方目前还不支持透传消息
     *
     * @param context
     * @param sptDataMessage
     */
    public void processMessage(Context context, SptDataMessage sptDataMessage) {
    }
}
  • 在将服务改为继承 OppoPushMessageService OppoAppPushMessageService之后,将该服务在 AndroidManifest 中都按如下配置,开发者只需将服务名称 OppoService 替换成自身的服务名。
<service android:name="xxx.OppoService"
         android:permission="com.coloros.mcs.permission.SEND_MCS_MESSAGE">
    <intent-filter>
    		<action android:name="com.coloros.mcs.action.RECEIVE_MCS_MESSAGE"/>
    </intent-filter>
</service>

魅族推送

准备工作

  • 集成推送辅助包,参见SDK集成push的说明。

  • 前往魅族消息推送服务注册账号并通过认证,创建应用并获取AppID、AppKey、AppSecret。

获取方式:推送后台 - 选择你的应用(若无应用请新建应用) - 打开应用 - 配置管理 - 应用配置 - 渠道(若无渠道请添加多渠道) - App ID/App Key

  • 前往云信控制台添加推送证书,配置步骤如下:


    单击展开查看具体步骤
    1. 选择应用,进入应用详情界面。
    2. 在应用详情界面的右上角选择更多 > 证书管理 > Android 推送证书 > 添加证书,弹出如下对话框。

    3. 根据界面提示,在该对话框内配置证书类型和证书名称等信息。其中的“证书名称”即为初始化 SDK 时需传入的推送信息中的mzCertificateName
  • 将魅族推送的 SDK 导入到工程中,当前兼容的版本为 com.meizu.flyme.internet:push-internal:4.1.0

接入配置

  • AndroidManifest.xml 配置

有4处需要改成开发者自己的 APP 包名。

<!-- 兼容 Flyme5 以下版本,魅族内部接入 PushSDK 必填,不然无法收到消息-->
<uses-permission android:name="com.meizu.flyme.push.permission.RECEIVE"/>
<permission
    android:name="{你的包名}.push.permission.MESSAGE"
    android:protectionLevel="signature"/>
<uses-permission android:name="{你的包名}.push.permission.MESSAGE"/>
<!-- 兼容 Flyme3 配置权限-->
<uses-permission android:name="com.meizu.c2dm.permission.RECEIVE" />
<permission
    android:name="{你的包名}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>
<uses-permission android:name="{你的包名}.permission.C2D_MESSAGE"/>

下面这些配置直接拷贝到AndroidManifest.xml,并替换你自己的包名。

<!--魅族推送配置项-->
<receiver android:name="com.netease.nimlib.mixpush.mz.MZPushReceiver">
    <intent-filter android:priority="0x7fffffff">
        <!-- 接收 push 消息 -->
        <action android:name="com.meizu.flyme.push.intent.MESSAGE" />
        <!-- 接收 register 消息 -->
        <action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
        <!-- 接收 unregister 消息-->
        <action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK"/>
        <!-- 兼容低版本 Flyme3 推送服务配置 -->
        <action android:name="com.meizu.c2dm.intent.REGISTRATION" />
        <action android:name="com.meizu.c2dm.intent.RECEIVE" />

        <category android:name="com.netease.nim.demo"/>
    </intent-filter>
</receiver>
  • 证书信息配置

在SDK初始化时,需要将推送相关证书信息配置到 SDKOptions.mixPushConfig 中。

config.mzAppId = "xxx";
config.mzAppKey = "xxxx";
config.mzCertificateName = "xxxx";

如果构建 APP 时有使用代码混淆,需要在 proguard.cfg 中加入:

-dontwarn com.meizu.cloud.**
-keep class com.meizu.cloud.** {*;}

至此,魅族推送接入完成,现在可以在魅族设备上进行消息推送的测试。

推送兼容性

  • 开发者需要新建广播接收器,从继承 MzPushMessageReceiver 改为继承 MeiZuPushReceiverMeiZuPushReceiver 为云信提供。

/**
 * 以下这些方法运行在非 UI 线程中, 与魅族 SDK 的 MzPushMessageReceiver 方法一一对应。
 * 当开发者自身也接入魅族推送,则应将继承 MzPushMessageReceiver 改为继承 MeiZuPushReceiver,其他不变
 */

public class MeiZuPushReceiver extends BroadcastReceiver {

    @Override
    public final void onReceive(Context context, Intent intent) {
    }

    public void onRegister(Context context, String pushId) {
    }

    public void onUnRegister(Context context, boolean success) {
    }

    public void onPushStatus(Context context, PushSwitchStatus pushSwitchStatus) {
    }

    public void onRegisterStatus(Context context, RegisterStatus registerStatus) {
    }

    public void onUnRegisterStatus(Context context, UnRegisterStatus unRegisterStatus) {
    }

    public void onSubTagsStatus(Context context, SubTagsStatus subTagsStatus) {
    }

    public void onSubAliasStatus(Context context, SubAliasStatus subAliasStatus) {
    }

    public void onNotificationClicked(Context context, String title, String content, String selfDefineContentString) {
    }

    public void onNotificationArrived(Context context, String title, String content, String selfDefineContentString) {
    }

    public void onNotifyMessageArrived(Context context, String message) {
    }

    public void onNotificationDeleted(Context context, String title, String content, String selfDefineContentString) {
    }

    public void onUpdateNotificationBuilder(PushNotificationBuilder pushNotificationBuilder) {
    }

    public void onMessage(Context context, String s) {
    }

    public void onMessage(Context context, Intent intent) {
    }

    public void onMessage(Context context, String s, String s1) {
    }
}
  • 在将广播接收器改为继承 MeiZuPushReceiver 之后,将该广播在 AndroidManifest 中配置如下,开发者只需将广播名称 MeiZuPushReceiver 替换成自身的广播名。此外,请不要为此 Receiver 配置 priority
<receiver android:name="xxx.MeiZuPushReceiver">
    <intent-filter>
        <action android:name="com.meizu.flyme.push.intent.MESSAGE" />
        <action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
        <action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK" />
    </intent-filter>
</receiver>

谷歌推送

谷歌推送FCM 是 GCM 的升级版,适用于海外用户,FCM 成功推送需要两个条件:

  • 手机安装并成功运行谷歌移动框架
  • 手机连接海外网络,不被墙掉。

需要说明的是,在某些国产手机上,虽然满足以上两个条件,FCM 推送成功了,但是仍然是没能看到推送通知栏的。如果应用面向国内用户,则不需要集成FCM。

准备工作

  • 集成推送辅助包,参见SDK集成push的说明。

  • 前往FCM官网注册账号并通过认证,创建应用并获取AppID、AppKey、AppSecret,添加证书指纹。

    获取方法:

    1. 前往Firebase控制台/Console ,单击你的项目/Project ,进入项目界面。

    2. 单击界面左上角的项目概览右侧的,并单击项目设置,进入项目设置界面。

    3. 如果您的项目设置界面上显示 Cloud Messaging API (旧版)已停用,则需要先启用 Cloud Messaging。

      1. 单击,并单击在Google Cloud Console 中管理 API

        FireBaseProjectSettingsPage.png

      2. 填写信息,并启用 Cloud Messaging。

        启用CloudMessaging.png

    4. 单击云消息传递,显示的服务器密钥即为所需的 AppSecret。

      FireBase服务器秘钥.png

  • 前往云信控制台添加 FCM 推送证书,配置步骤如下:


    单击展开查看具体步骤
    1. 选择应用,进入应用详情界面。
    2. 在应用详情界面的右上角选择更多 > 证书管理 > Android 推送证书 > 添加证书,弹出如下对话框。

    3. 根据界面提示,在该对话框内配置证书类型和证书名称等信息。其中的“证书名称”即为初始化 SDK 时需传入的推送信息中的fcmCertificateName
  • 将 FCM 生成 google-services.json 拷贝到工程中。

  • 将谷歌推送的 SDK 导入到工程中,当前兼容的版本如下:

implementation 'com.google.firebase:firebase-messaging:23.0.0'
implementation 'com.google.firebase:firebase-analytics:20.0.0'

接入配置

  • AndroidManifest.xml 配置

下面这些配置直接拷贝到AndroidManifest.xml。

<!-- fcm -->
<service android:name="com.netease.nimlib.mixpush.fcm.FCMTokenService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
    </intent-filter>
</service>

设置收到 FCM 通知展示的图标和颜色

<!--设置收到 fcm 通知展示的图标和颜色-->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/改成你的通知图标" />
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/改成你的通知字体颜色" />
  • 证书信息配置

在SDK初始化时,需要将推送相关证书信息配置到 SDKOptions.mixPushConfig 中。

config.fcmCertificateName = "xxxx";
...
options.mixPushConfig = config;

如果构建 APP 时有使用代码混淆,需要在 proguard.cfg 中加入:

-dontwarn com.google.**
-keep class com.google.** {*;}

至此,FCM 推送接入完成,现在可以进行消息推送的测试。

自定义配置

在IMMessage的pushPayload字段可配置一个key为fcmField,值为map或者JSONObject的Entry,里面的值参考谷歌官方文档

token回调

获取厂商回调的方式由两种

  1. 通过推送兼容性中的回调获取(支持大部分云信支持的推送厂商)
  2. 通过MixPushServiceObserveobserveMixPushToken注册token回调通知(支持所有云信支持的推送厂商)
  • 接口原型
/**
 * 得到推送token的回调
 *
 * @param observer 观察者, 参数为token内容
 */
void observeMixPushToken(Observer<MixPushToken> observer, boolean register);

消息提醒

云信 SDK 提供内置的消息提醒功能,其作用的场景与推送不同,一般对即时通讯的场景来说,主要作用在:

  • APP 处于后台,且 SDK 进程未被清理时

  • 在前台与 A 聊天但收到非 A 的发来的消息时

  • 在非聊天界面且非最近会话列表界面时。

以下场景一般不需要消息提醒:

  • 如果用户正处于聊天界面,且收到当前会话的消息。

  • 如果用户停留在最近联系人列表界面,收到消息也不应该有消息提醒(但会有未读数变更通知)。

启用消息提醒

/**
 * 通知栏消息提醒开关控制。只有StatusBarNotificationConfig配置不为空时才有效
 *
 * @param on 开关
 */
public static void toggleNotification(boolean on);
  • 示例
// 开启通知栏消息提醒
NIMClient.toggleNotification(true);

启用后,需要依据当前页面环境动态调整是否需要消息提醒。此处,需要结合未读数相关接口进行处理:

// 进入聊天界面,建议放在onResume中。表示来自account的消息无需进行消息提醒。
NIMClient.getService(MsgService.class).setChattingAccount(account, sessionType);

// 进入最近联系人列表界面,建议放在onResume中。表示所有消息无需进行消息提醒。
NIMClient.getService(MsgService.class).setChattingAccount(MsgService.MSG_CHATTING_ACCOUNT_ALL, SessionTypeEnum.None);

// 退出聊天界面或离开最近联系人列表界面,建议放在onPause中。表示所有消息都可以进行消息提醒。
NIMClient.getService(MsgService.class).setChattingAccount(MsgService.MSG_CHATTING_ACCOUNT_NONE, SessionTypeEnum.None);

撤回通知消息提醒

/**
 * 设置收到撤回通知时,是否需要产生消息提醒。只有StatusBarNotificationConfig配置不为空并且通知栏提醒开关是打开的才有效。默认打开。
 *
 * @param on 开关
 */
public static void toggleRevokeMessageNotification(boolean on);

消息提醒配置

  • API 原型
/**
 * 更新状态栏通知提醒设置
 *
 * @param config 设置
 */
public static void updateStatusBarNotificationConfig(StatusBarNotificationConfig config);
  • StatusBarNotificationConfig 参数说明
StatusBarNotificationConfig 参数 说明
notificationSmallIconId 状态栏提醒的小图标的资源ID。
如果不提供,使用 app 的 icon
ring 是否需要响铃提醒。
默认为 true
notificationSound 响铃提醒的声音资源,如果不提供,使用系统默认提示音
vibrate 是否需要振动提醒。
默认为 true
ledARGB 呼吸灯的颜色。
建议尽量使用绿色、蓝色、红色等基本颜色,不要去用混合色
ledOnMs 呼吸灯亮时的持续时间(毫秒)
ledOffMs 呼吸灯熄灭时的持续时间(毫秒)
hideContent 不显示消息详情开关。
默认为 false
downTimeToggle 免打扰设置开关。默认为关闭
downTimeBegin 免打扰的开始时间, 格式为HH:mm(24小时制)。
downTimeEnd 免打扰的结束时间, 格式为HH:mm(24小时制)。
如果结束时间小于开始时间,免打扰时间为开始时间-24:00-结束时间。
notificationEntrance 通知栏提醒的响应intent的activity类型。
可以为null。如果未提供,将使用包的launcher的入口intent的activity。
titleOnlyShowAppName 通知栏提醒的标题是否只显示应用名。
默认是 false,当有一个会话发来消息时,显示会话名;
当有多个会话发来时,显示应用名。
修改为true,那么无论一个还是多个会话发来消息,标题均显示应用名。
应用名称请在 AndroidManifest 的 application 节点下设置 android:label
notificationColor 消息通知栏颜色,将应用到 NotificationCompat.Builder 的 setColor 方法。
对Android 5.0 以后机型会影响到smallIcon
downTimeEnableNotification 免打扰期间,是否显示通知,默认为显示
notificationFoldStyle 通知栏合并方式:
全部折叠:NotificationFoldStyle.ALL
全部不折叠:NotificationFoldStyle.EXPAND
按会话折叠:NotificationFoldStyle.CONTACT
notificationExtraType 点击在线通知的通知栏传递的extra类型
返回ArrayList<IMMessage>格式: NotificationExtraTypeEnum.MESSAGE,key为NimIntent#EXTRA_NOTIFY_CONTENT
返回String格式的JSONArray: NotificationExtraTypeEnum.JSON_ARR_STR,key为NimIntent#EXTRA_NOTIFY_SESSION_CONTENT
  • 示例
// 更新消息提醒配置 StatusBarNotificationConfig,以设置不响铃为例。
StatusBarNotificationConfig config = UserPreferences.getStatusConfig();
config.ring = false;
config.notificationExtraType = NotificationExtraTypeEnum.MESSAGE;
NIMClient.updateStatusBarNotificationConfig(config);

点击在线通知的通知栏传递的extra类型

点击在线通知的通知栏,会回调消息的信息,方便进行页面跳转等操作。

  • 枚举体原型
public enum NotificationExtraTypeEnum {
    /**
     * 回调消息体列表
     */
    MESSAGE(0),

    /**
     * 回调String格式的JSONArray,每个元素包含消息的uuid, sessionId, sessionType和time
     */
    JSON_ARR_STR(1),
        ;
    final private int value;
    NotificationExtraTypeEnum(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}
  • 配置效果
配置 Extra的key Extra的value格式
MESSAGE NimIntent#EXTRA_NOTIFY_CONTENT ArrayList
JSON_ARR_STR NimIntent#EXTRA_NOTIFY_SESSION_CONTENT String // JSONArray格式,每个JSONObject包含的key有"uuid", "sessionId", "sessionType"和"time

定制头像与名称

开发者可以实现UserInfoProvider接口来处理通知栏显示的头像和名称。该接口具有以下方法:

  • getAvatarForMessageNotifier方法:为通知栏提醒提供头像
  • getDisplayNameForMessageNotifier方法:为通知栏提醒提供消息发送者的显示名称

具体的接口说明请查看API文档,示例代码请下载即时通讯Demo源码,查看 NimUserInfoProvider.java文件。

云信支持定制通知栏显示的头像(用户头像、群头像),在 UserInfoProvider 接口下提供方法:

/**
 * 为云信端内通知栏提供消息发送者显示名称(例如:如果是P2P聊天,可以显示备注名、昵称、帐号等;如果是群聊天,可以显示群昵称,备注名,昵称、帐号等)
 *
 * @param account     消息发送者账号
 * @param sessionId   会话ID(如果是P2P聊天,那么会话ID即为发送者账号,如果是群聊天,那么会话ID就是群号)
 * @param sessionType 会话类型
 * @return 消息发送者对应的显示名称
 */
String getDisplayNameForMessageNotifier(String account, String sessionId, SessionTypeEnum sessionType);

/**
 * 为云信端内推送通知栏提醒提供头像(个人、群组)
 * 一般从本地图片缓存中获取,若未下载或本地不存在,请返回默认本地头像(可以返回默认头像资源ID对应的Bitmap)
 *
 * @param sessionType 会话类型(个人、群组)
 * @param sessionId   用户账号或者群ID
 * @return 头像位图
 */
Bitmap getAvatarForMessageNotifier(SessionTypeEnum sessionType, String sessionId);

实现上述需要的方法,在 SDKOptions 中配置 UserInfoProvider 实例,在 SDK 初始化时传入 SDKOptions 方可生效。

需要注意的是,上述返回头像 Bitmap 的函数,请尽可能从内存缓存里拿头像,如果读取本地头像可能导致 UI 进程阻塞,从而导致通知栏提醒延时弹出。

多端提醒策略配置

当桌面端在线时,SDK 支持设置同账号所在的手机端是否需要产生推送与消息提醒。

该功能由 SettingsService 提供:

/**
 * 设置桌面端(PC/WEB)在线时,移动端是否需要推送
 * @param isOpen: true 桌面端在线时移动端不需推送;false 桌面端在线时移动端需推送
 * @return NoDisturbConfig
 */
InvocationFuture<java.lang.Void> updateMultiportPushConfig(boolean isOpen);

/**
 * 获取桌面端(PC/WEB)在线时,移动端是否需要推送
 */
boolean isMultiportPushOpen();

示例:

NIMClient.getService(SettingsService.class).updateMultiportPushConfig(checkState)
                 .setCallback(new RequestCallback<Void>() {
                     @Override
                     public void onSuccess(Void param) {
                         ToastHelper.showToast(SettingsActivity.this, "设置成功");
                     }

                     @Override
                     public void onFailed(int code) {
                         ToastHelper.showToast(SettingsActivity.this, "设置失败,code:" + code);
                         adapter.notifyDataSetChanged();
                     }

                     @Override
                     public void onException(Throwable exception) {
                     }
});

此外,可以通过 SettingsServiceObserver提供的回调来监听该项的变更:

/**
 * 注册/注销桌面端(PC/WEB)在现时,移动端是否需要推送事件观察者
 */
void observeMultiportPushConfigNotify(Observer<java.lang.Boolean> observer,boolean register);

全局免打扰

关闭推送服务

当要直接关闭推送与消息提醒时,需要同时关闭推送服务与消息提醒。

关闭推送服务

使用 MixPushService 提供的 enable 方法可以实现。当设置为 false 时,该客户端将接收不到来自云信体系内的推送。

/**
 * 开启/关闭推送服务
 *
 * @param enable true 开启,SDK 需要与云信服务器做确认;false 关闭,SDK 也需要通知云信服务器。
 * @return InvocationFuture 可以设置回调函数。只有与服务器交互完成后才算成功,如果出错,会有具体的错误代码。
 */
public InvocationFuture<Void> enable(boolean enable);

/**
 *  是否开启了第三方推送服务
 */ 
boolean isEnable();

调用示例:

NIMClient.getService(MixPushService.class).enable(enable).setCallback(new RequestCallback<Void>(){ ... });

关闭消息提醒

/**
 * 通知栏消息提醒开关控制。只有StatusBarNotificationConfig配置不为空时才有效
 *
 * @param on 开关
 */
public static void toggleNotification(boolean on);

设置免打扰时段

推送免打扰时段

使用 MixPushService 提供的 setPushNoDisturbConfig 方法设置推送免打扰时间。

/**
 * 设置推送免打扰时间,时间参数为北京时间的24小时计数 HH:mm,该时间段将不再向用户推送消息
 * SDK 3.2.0 版本以前的用户,为了将用户设置的免打扰配置与push免打扰同步,应该在监听到登陆同步完成后,
 * 调用 setPushNoDisturbConfig 方法。如果开发者不使用新版第三方推送功能,只要不调用该方法,则旧的功能不受影响。
 * 此外,在免打扰设置界面也应该做到同时设置push免打扰
 * @param isOpen 是否开启
 * @param startTime 开始时间 格式 HH:mm
 * @param stopTime 结束时间 格式 HH:mm
 * @return InvocationFuture 可以设置回调函数。成功会返回成功信息,错误会返回相应的错误码。
 */
InvocationFuture<Void> setPushNoDisturbConfig(boolean isOpen, String startTime, String stopTime);

使用 MixPushService 提供的 getPushNoDisturbConfig() 方法获取推送免打扰时间。

/**
 * 获取推送免打扰设置
 * @return NoDisturbConfig
 */
NoDisturbConfig getPushNoDisturbConfig();

消息提醒免打扰时段

通过设置 StatusBarNotificationConfig 的免打扰属性来设置:

StatusBarNotificationConfig 参数 说明
downTimeToggle 免打扰设置开关。默认为关闭
downTimeBegin 免打扰的开始时间, 格式为HH:mm(24小时制)。
downTimeEnd 免打扰的结束时间, 格式为HH:mm(24小时制)。
如果结束时间小于开始时间,免打扰时间为开始时间-24:00-结束时间。

示例:

config.downTimeToggle = true;
config.downTimeBegin = startTime;
config.downTimeEnd = endTime;
config.downTimeEnableNotification = enableNotification;
NIMClient.updateStatusBarNotificationConfig(config);

消息配置

是否推送与消息提醒

当需要指定某条消息无需推送和消息提醒时,可以通过设置CustomMessageConfig.enablePush来设置,设置为false,则该条消息不会触发推送。具体参见消息属性设置

设置推送文案前缀

当需要指定某条消息推送时是否带有前缀,当前默认为消息发送者的昵称。可以通过设置CustomMessageConfig.enablePushNick来设置。具体参见消息属性设置

推送标题设置

  • 如果通过 IMMessage.setPushPayload(Map pushPayload) 配置了"pushTitle":"标题内容",则以此显示(优先级最高)。
  • 如果没有配置,则点对点消息推送标题为用户昵称,群消息推送标题为群名称。
  • 如果没有设置用户昵称,则点对点消息推送标题为新消息。

通知栏文案

推送文案

需显示详情的推送文案

可以通过IMMessage.setPushContent(String pushContent)方法来设置推送文案。如果不设置推送文案,将使用云信内置文案。

不显示详情的推送文案

  • 调用setPushShowNoDetail方法设置推送不展示详情,调用成功后,默认的推送文案为“你收到一条新消息”。

    • 方法原型

      /**
      * 设置推送是否不展示详情
      *
      * @param showNoDetail 是否不展示详情,true为不展示详情
      * @return InvocationFuture 可以设置回调函数。成功会返回成功信息,错误会返回相应的错误码。
      */
      InvocationFuture<Void> setPushShowNoDetail(boolean showNoDetail);
      
    • 示例代码

      NIMClient.getService(MixPushService.class).setPushShowNoDetail(showNoDetail).setCallback(new RequestCallbackWrapper<Void>() {
          @Override
          public void onResult(int code, Void result, Throwable exception) {
              if (code == ResponseCode.RES_SUCCESS) {
                  // 对config.hideContent 也进行设置,或直接在初始化时设置
                  StatusBarNotificationConfig config = UserPreferences.getStatusConfig();
                  config.hideContent = showNoDetail;
                  UserPreferences.setStatusConfig(config);
                  NIMClient.updateStatusBarNotificationConfig(config);
              } else {
                  ...
              }
          }
      });
      
  • 如需在不显示推送详情的情况下自定义推送文案(例如基于系统语言等场景),您可按如下步骤进行配置。

    1. 前往云信控制台,选择应用,并点击功能配置->添加推送文案添加自定义推送文案(见如下动图,可单击放大查看)。可配置最多 100 种自定义文案,每种自定义文案用一个自定义类型来标识。

      该自定义推送文案需满足如下条件才能生效:

      • 需要联系商务经理申请开通自定义推送文案功能后,不显示推送详情的自定义推送文案才能生效。如未开通,您可通过云信官网首页提供的联系方式咨询商务经理开通。
      • 已调用setPushShowNoDetail方法设置不显示推送详情。

      自定义推送文案配置入口.gif

      自定义推送文案配置与SDKOption.png

    2. 将自定义类型设置为初始化配置参数SDKOptions.customPushContentType的值,下发自定义推送文案至客户端。

      初始化相关说明,请参见初始化

消息提醒文案

Android SDK通知栏提醒文案显示的优先级如下:

  • 如果发送方发送消息时配置了消息的推送文案,那么消息提醒将显示该推送文案。

  • SDK会在收到消息时回调SDKOptions.messageNotifierCustomization接口,开发者可以在该回调中来定制提醒文案。

  • Android SDK 提供 NimStrings 类,用于开发者定制默认的新消息通知栏提醒文案,以及对应的多语言支持。

    注意调用updateStrings方法来更新文案配置。

群消息强制推送

用户在发消息的时候,可以通过配置 IMMessage.setMemberPushOption(MemberPushOption pushOption) 字段实现群消息强制推送。即接收者屏蔽了当前会话(如免打扰),仍能够推送当前这条推送。

  • 参数说明

MemberPushOption 接口说明

返回值 MemberPushOption接口 说明
List getForcePushList() 返回强制推送的账号列表
String getForcePushContent() 返回强制推送的文案
boolean isForcePush() 返回是否强制推送
void setForcePush(boolean forcePush) 设置是否强推。
针对 forcePushList 里的帐号,
false 为不强推,true 为强推,默认为 true。
对于 forcePushList 中的用户,推送文案为 forcePushContent;
对于不在 forcePushList 中的用户,推送文案为 pushContent;
针对在 forcePushList 中的账号:
isForcePush 为true 时,推送文案中不会包含发送者 nick,直接为 forcePushContent;
isForcePush 为 false 时,推送文案中目前包含了发送者 nick(暂定),即为 fromNick:forcePushContent
void setForcePushList(List forcePushList) 设置强推列表,
填 null 表示强推给该会话所有成员,
不为 null 时最大上限账号为100个
void setForcePushContent(String forcePushContent) 强推文案(可扩展为区别与普通推送的推送文案),长度目前限制为500
  • 示例
// 该帐号为示例,请先注册
String account = "testAccount";
// 群聊才有强推消息
SessionTypeEnum sessionType = SessionTypeEnum.Team;
String text = "指定推送消息";
// 创建一个文本消息
IMMessage textMessage = MessageBuilder.createTextMessage(account, sessionType, text);

// 配置指定成员推送
MemberPushOption memberPushOption = new MemberPushOption();
// 开启强制推送
memberPushOption.setForcePush(true);
// 设置强推文案
memberPushOption.setForcePushContent(textMessage.getContent());
List<String> pushList = new ArrayList<>();
pushList.add("account1");
pushList.add("account2");
// 设置指定推送列表
memberPushOption.setForcePushList(pushList);
textMessage.setMemberPushOption(memberPushOption);

// 发送给对方
NIMClient.getService(MsgService.class).sendMessage(textMessage, false);

点击通知栏跳转

当收到推送与通知栏提醒后,用户点击通知栏,希望进入指定的聊天界面时,需要跳转到对应的聊天界面。

推送通知栏跳转

华为推送

发送消息前,在云信消息体的 pushPayload 中传入 key 为 hwField 的Map或者JsonObject类型的数据,通常为 发送者的account/ 群聊id 与类型(单聊或群聊)等信息,这些信息将被透传到推送的接收方。数据的参数填写方法请参考华为开放平台:HTTPS下行消息

  • 示例
Intent hwIntent = new Intent(Intent.ACTION_VIEW);
String intentStr = String.format(
        "pushscheme://com.huawei.codelabpush/deeplink?sessionID=%s&sessionType=%s",
        sessionId,  // 发送者的account 或  群聊id
        sessionType // 类型(单聊或群聊)
);
hwIntent.setData(Uri.parse(intentStr));
hwIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
String intentUri = hwIntent.toUri(Intent.URI_INTENT_SCHEME);
//点击事件的内容
JSONObject clickAction = new JSONObject();
//通知的内容
JSONObject notification = new JSONObject();

try {
    clickAction.putOpt("type", 1)
            .putOpt("intent", intentUri);
    notification.putOpt("click_action", clickAction);
    pushPayload.put("hwField", notification);
} catch (JSONException e) {
    e.printStackTrace();
}

当接收方收到华为推送时,处理方式请参考华为开放平台:点击通知消息

OPPO推送

发送消息前,在云信消息体的 pushPayload 中传入 key 为 oppoField 的Map或者JsonObject类型的数据,通常为 发送者的account/ 群聊id 与类型(单聊或群聊)等信息,这些信息将被透传到推送的接收方。数据的参数请参考OPPO开放平台:通知栏消息

// oppoField
Map<String, Object> oppoField = new HashMap<>();
Editable oppoChannelId = oppoChannelIdET.getText();
oppoField.put("click_action_type", 1);
oppoField.put("click_action_activity", "com.oppo.codelabpush.intent.action.test");
// oppoField.put("click_action_type", 4);
// oppoField.put("click_action_activity", "com.netease.nim.demo.main.activity.MixPushActivity");
JSONObject obj = new JSONObject();
try {
    obj.putOpt("sessionID", sessionType == SessionTypeEnum.P2P ? TestCache.getAccount() : msg.getSessionId());
    obj.putOpt("sessionType", sessionType.getValue());
} catch (JSONException e) {
    e.printStackTrace();
}
oppoField.put("action_parameters", obj.toString());
pushPayload.put("oppoField", oppoField);

当接收方收到OPPO推送时,处理方式请参考OPPO开放平台:通知栏消息

谷歌推送

点击谷歌推送通知栏之后,直接启动应用入口Activity,通过Intent 携带数据,SDK 提供接口判断是否是云信侧集成的 FCM Intent。

MixPushService提供两个接口处理 FCM payload:

/**
 * Activity是否是由点击 fcm 通知启动
 *
 * @param intent activity intent
 * @return 判断结果
 */
boolean isFCMIntent(Intent intent);

/**
 * 从 FCM 中解出 payload 字符串
 *
 * @param intent activity intent
 * @return
 */
String parseFCMPayload(Intent intent);

即时通讯Demo中,在 WelcomeActivity.java 的 onIntent 中判断:if (NIMClient.getService(MixPushService.class).isFCMIntent(intent)),具体代码请参考Demo。

其他推送

对于推送,发送方在构造消息对象时,需要通过IMMessage.setPushPayload(Map pushPayload)插入表示会话标识的信息(如自身的账号、群id、会话类型等),便于接收端获取到 payload 时解析出来。

推送通知栏点击事件的回调由 MixPushMessageHandler 提供:

public interface MixPushMessageHandler {

    /**
     * 推送通知栏点击之后的回调方法
     *
     * @param context
     * @param payload IMessage 中的用户设置的自定义pushPayload {@link com.netease.nimlib.sdk.msg.model.IMMessage}
     * @return true 表示开发者自行处理第三方推送通知栏点击事件,SDK将不再处理; false 表示仍然使用SDK提供默认的点击后的跳转
     */
    boolean onNotificationClicked(Context context, Map<String, String> payload);
}

开发者需要在Application#oncreate中,主进程中进行MixPushMessageHandler的注册,如Demo示例:

if (NIMUtil.isMainProcess(this)) {
    // 注册自定义推送消息处理,这个是可选项
    NIMPushClient.registerMixPushMessageHandler(new DemoMixPushMessageHandler());
}

消息提醒通知栏跳转

可以通过StatusBarNotificationConfig.notificationEntrance参数来设置通知栏提醒的响应Intent的Activity,通过NIMClient.updateStatusBarNotificationConfig(StatusBarNotificationConfig config)来更新通知栏消息提醒设置。

对于即时通讯Demo来说,存在以下逻辑:

  • NimApplication.java中调用了NIMClient.init(..., ..., NimSDKOptionConfig.getSDKOptions(this))
  • NimSDKOptionConfig.javagetSDKOptions(Context context)中调用了initStatusBarNotificationConfig(options)
  • initStatusBarNotificationConfig(SDKOptions options)中配置了StatusBarNotificationConfig config = loadStatusBarNotificationConfig()
  • loadStatusBarNotificationConfig()中配置了config.notificationEntrance = WelcomeActivity.class
  • WelcomeActivity.javaonIntent中判断if (intent.hasExtra(NimIntent.EXTRA_NOTIFY_CONTENT))调用parseNotifyIntent(intent),具体代码请参考Demo。

[注意] 关于EXTRA_NOTIFY_CONTENT的含义请参考EXTRA_NOTIFY_CONTENT

此文档是否对你有帮助?
有帮助
我要吐槽
  • 推送
  • 推送渠道的选择
  • 小米推送
  • 准备工作
  • 接入配置
  • 推送兼容性
  • 华为推送
  • 准备工作
  • 接入配置
  • 消息推送类型配置
  • 推送兼容性
  • VIVO 推送
  • 准备工作
  • 接入配置
  • 推送兼容性
  • 消息类型配置
  • OPPO推送
  • 准备工作
  • 接入配置
  • 推送兼容性
  • 魅族推送
  • 准备工作
  • 接入配置
  • 推送兼容性
  • 谷歌推送
  • 准备工作
  • 接入配置
  • 自定义配置
  • token回调
  • 消息提醒
  • 启用消息提醒
  • 撤回通知消息提醒
  • 消息提醒配置
  • 点击在线通知的通知栏传递的extra类型
  • 定制头像与名称
  • 多端提醒策略配置
  • 全局免打扰
  • 关闭推送服务
  • 关闭推送服务
  • 关闭消息提醒
  • 设置免打扰时段
  • 推送免打扰时段
  • 消息提醒免打扰时段
  • 消息配置
  • 是否推送与消息提醒
  • 设置推送文案前缀
  • 推送标题设置
  • 通知栏文案
  • 推送文案
  • 需显示详情的推送文案
  • 不显示详情的推送文案
  • 消息提醒文案
  • 群消息强制推送
  • 点击通知栏跳转
  • 推送通知栏跳转
  • 华为推送
  • OPPO推送
  • 谷歌推送
  • 其他推送
  • 消息提醒通知栏跳转