推送与消息提醒

推送

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

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

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

推送渠道的选择

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

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

小米推送

准备工作

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

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

  • 前往云信控制台 - 证书管理 - Android推送证书,添加推送证书。

  • 将小米推送的 SDK 导入到工程中,当前兼容的版本为 MiPush_SDK_Client_3_8_5

接入配置

  • AndroidManifest.xml 配置

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

xml<!--配置权限,已经配置过的条目则无须添加-->
<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 ,不需要做任何改动。

xml<!--配置的service和receiver-->
<service
    android:name="com.xiaomi.push.service.XMPushService"
    android:enabled="true"
    android:process=":mixpush"/>
<service
    android:name="com.xiaomi.push.service.XMJobService"
    android:enabled="true"
    android:exported="false"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:process=":mixpush" />
    <!--注:此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=":mixpush"
    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 中。

示例:

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

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

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

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

推送兼容性

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

  • 对于小米推送,为了接收推送消息,小米SDK 要求开发者自定义一个继承自 PushMessageReceiverBroadcastReceiver ,并注册到 AndroidManifest.xml。由于小米的特殊处理,同时注册多个继承自 PushMessageReceiverBroadcastReceiver 会存在收不到消息的情况,要保证开发者自身业务体系的小米推送与云信消息的小米推送兼容,开发者需要新建广播接收器,从继承 PushMessageReceiver 改为继承 MiPushMessageReceiverMiPushMessageReceiver 为云信提供,推送消息首先被 MiPushReceiver 接收,如果是开发者自身体系的推送消息,MiPushReceiver 会将消息传递给 MiPushMessageReceiver
java/**
 * 以下这些方法运行在非 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) {
    }
}
  • 在将广播接收器改为继承 MiPushMessageReceiver 之后,将该广播在 AndroidManifest 中配置如下,开发者只需将广播名称 MiPushMessageReceiver 替换成自身的广播名。此外,请不要为此 Receiver 配置 priority
xml<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

  • 前往云信控制台 - 证书管理 - Android推送证书,添加推送证书。

  • agconnect-services.json 文件拷贝到应用级根目录下,配置HMSSDKmaven仓库地址,并添加编译依赖。

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

接入配置

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

javapublic class NimApplication extends Application {
    ...
    @Override
    public void onCreate() {
        ...
        if (NIMUtil.isMainProcess(this)) {
            ...
            // 在此处添加以下代码
            com.huawei.hms.support.common.ActivityMgr.INST.init(this);
            ...
        }
    }
}
  • AndroidManifest.xml 配置
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 中。

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

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

java-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白名单:

java"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*"

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

推送兼容性

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

  • 对于华为推送,为了接收推送消息,华为 SDK 要求开发者自定义一个继承自HmsMessageService类的 Service ,并注册到 AndroidManifest.xml。开发者需要将自身的华为推送服务,从继承 HmsMessageService 改为继承HWPushMessageService。开发者自行处理自身体系的推送消息,云信不做处理。
java/**
 * 以下这些方法运行在非 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 替换成自身的服务名。
xml<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。

  • 前往云信控制台 - 证书管理 - Android推送证书,添加推送证书。

  • 将VIVO推送的 SDK 导入到工程中,当前兼容的版本为 vivo_pushsdk_v3.0.0.0。

接入配置

  • AndroidManifest.xml 配置

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

xml<!--配置的service, activity, receiver-->
 <service
        android:name="com.vivo.push.sdk.service.CommandClientService"
        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:

xml<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 中。

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

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

java-dontwarn com.vivo.push.**
-keep class com.vivo.push.**{*; } 
-keep class com.vivo.vms.**{*; }
-keep class com.netease.nimlib.mixpush.vivo.VivoPush* {*;}
-keep class com.netease.nimlib.mixpush.vivo.VivoPushReceiver{*;}

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

推送兼容性

  • 开发者需要新建广播接收器,从继承 OpenClientPushMessageReceiver 改为继承 VivoPushMessageReceiverVivoPushMessageReceiver 为云信提供。
java
/**
 * 以下这些方法运行在非 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
xml<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文档

  • 示例
javaint 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 。

  • 前往云信控制台 - 证书管理 - Android推送证书,添加推送证书。注意:其中, MasterSecret 可在OPPO推送运营平台 > 配置管理 > 应用配置中查看。

  • 参考OPPO PUSH SDK接口文档将OPPO推送的 SDK 导入到工程中,当前兼容的版本为 com.heytap.msp-push-2.1.0.aar

接入配置

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

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

先声明推送权限:

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

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

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

java-keep public class * extends android.app.Service

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

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

推送兼容性

与小米推送兼容性类似

  • 开发者需要新建广播接收器,从继承 PushServiceAppPushService改为继承 OppoPushMessageServiceOppoAppPushMessageServiceOppoPushMessageServiceOppoAppPushMessageService为云信提供。
java/**
 *  以下这些方法运行在非 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) {
    }
}
java/**
 *  以下这些方法运行在非 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 替换成自身的服务名。
xml<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。

  • 前往云信控制台 - 证书管理 - Android推送证书,添加推送证书。

  • 将魅族推送的 SDK 导入到工程中,当前兼容的版本为 com.meizu.flyme.internet:push-internal:3.9.7` 。

接入配置

  • AndroidManifest.xml 配置

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

xml<!-- 兼容 Flyme5 以下版本,魅族内部接入 PushSDK 必填,不然无法收到消息-->
<uses-permission android:name="com.meizu.flyme.push.permission.RECEIVE"/>
<permission
    android:name="{你的包名}.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,并替换你自己的包名。

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

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

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

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

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

推送兼容性

  • 开发者需要新建广播接收器,从继承 MzPushMessageReceiver 改为继承 MeiZuPushReceiverMeiZuPushReceiver 为云信提供。
java
/**
 * 以下这些方法运行在非 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) {
    }
}
  • 在将广播接收器改为继承 MeiZuPushReceiver 之后,将该广播在 AndroidManifest 中配置如下,开发者只需将广播名称 MeiZuPushReceiver 替换成自身的广播名。此外,请不要为此 Receiver 配置 priority
xml<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,添加证书指纹。

  • 前往云信控制台 - 证书管理 - Android推送证书,添加推送证书。

  • 将 FCM 生成 google-services.json 拷贝到工程中。

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

javaimplementation 'com.google.firebase:firebase-messaging:20.1.0'
implementation 'com.google.android.gms:play-services-base:17.1.0'
implementation 'com.google.firebase:firebase-core:17.2.3'

接入配置

  • AndroidManifest.xml 配置

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

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 通知展示的图标和颜色

xml<!--设置收到 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 中。

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

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

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

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

自定义配置

在IMMessage的pushPayload字段可配置一个key为fcmField,值为map或者JSONObject的Entry,里面的值为

消息提醒

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

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

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

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

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

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

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

启用消息提醒

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

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

java// 进入聊天界面,建议放在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);

撤回通知消息提醒

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

消息提醒配置

  • API 原型
java/**
 * 更新状态栏通知提醒设置
 *
 * @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
  • 示例
java// 更新消息提醒配置 StatusBarNotificationConfig,以设置不响铃为例。
StatusBarNotificationConfig config = UserPreferences.getStatusConfig();
config.ring = false;
config.notificationExtraType = NotificationExtraTypeEnum.MESSAGE;
NIMClient.updateStatusBarNotificationConfig(config);

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

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

  • 枚举体原型
javapublic 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 接口下提供方法:

java/**
 * 为云信端内通知栏提供消息发送者显示名称(例如:如果是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 提供:

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

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

示例:

javaNIMClient.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提供的回调来监听该项的变更:

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

全局免打扰

关闭推送服务

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

关闭推送服务

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

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

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

调用示例:

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

关闭消息提醒

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

设置免打扰时段

推送免打扰时段

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

java/**
 * 设置推送免打扰时间,时间参数为北京时间的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() 方法获取推送免打扰时间。

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

消息提醒免打扰时段

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

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

示例:

javaconfig.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)方法来设置推送文案。如果不设置推送文案,将使用云信内置文案。

  • 自定义默认推送文案

如果开发者配置了「不显示推送详情」(配置方法见下),默认的推送文案是:“你收到一条新消息”。此时,开发者可以自定义推送文案(例如基于系统语言等场景)。注意:需要联系商务顾问申请开通才能使用。

登录云信控制台 - 选择应用 - 证书管理 - 自定义推送文案。可以配置最多 100 种自定义文案,每种自定义文案用一个自定义类型来标识。

当客户端配置为「不显示推送详情」时,自定义推送文案才会生效。

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

不显示推送详情情况下,根据配置的推送文案下发。对应的设置参数为SDKOptions.customPushContentType

消息提醒文案

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

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

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

  • Android SDK 提供 NimStrings 类,用于开发者定制默认的新消息通知栏提醒文案,以及对应的多语言支持。 具体使用方式,可以参考:即时通讯Demo > NIMInitManager.java > updateLocale方法 > 配置的NimStrings相关字段。 注意调用NIMClient.updateStrings(NimStrings strings)方法来更新文案配置。 具体的文案字符串定义在:res > values > strings > strings.xml中(Demo配置了中文和英文两种语言示例)。

群消息强制推送

用户在发消息的时候,可以通过配置 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
  • 示例
java// 该帐号为示例,请先注册
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下行消息

  • 示例
javaIntent 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开放平台:通知栏消息

java// 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:

java/**
 * 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 提供:

javapublic 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示例:

javaif (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推送
  • 准备工作
  • 接入配置
  • 推送兼容性
  • 魅族推送
  • 准备工作
  • 接入配置
  • 推送兼容性
  • 谷歌推送
  • 准备工作
  • 接入配置
  • 自定义配置
  • 消息提醒
  • 启用消息提醒
  • 撤回通知消息提醒
  • 消息提醒配置
  • 点击在线通知的通知栏传递的extra类型
  • 定制头像与名称
  • 多端提醒策略配置
  • 全局免打扰
  • 关闭推送服务
  • 关闭推送服务
  • 关闭消息提醒
  • 设置免打扰时段
  • 推送免打扰时段
  • 消息提醒免打扰时段
  • 消息配置
  • 是否推送与消息提醒
  • 设置推送文案前缀
  • 推送标题设置
  • 通知栏文案
  • 推送文案
  • 消息提醒文案
  • 群消息强制推送
  • 点击通知栏跳转
  • 推送通知栏跳转
  • 华为推送
  • OPPO推送
  • 谷歌推送
  • 其他推送
  • 消息提醒通知栏跳转