推送

为了提高消息送达率,网易云通信在 Android 进程保活上做了很多努力,但是在国内 Android 系统的大环境下,厂家的深度定制 ROM 对系统做了越来越严格的限制,想要在所有机型上做到永久保活是不可能实现的,并且保活也会使额外功耗增加。因此,网易云通信 SDK 3.2.0 引进第三方消息推送来,当用户杀掉进程或者云信服务器无法连接到客户端时,使用手机厂商系统级推送提醒用户消息达到。

系统级别的推送(小米、华为等)的相比其他推送(个推、极光)的优势在于,系统推送在相应的厂商系统上拥有稳定的系统级长连接,可以做到随时接受推送消息,因此云信会根据当前机型来决定启用何种推送服务,如果是小米手机,并且完成了小米推送集成配置,那么会在登录成功之后,启动小米推送。云信支持系统推送如下:

厂商推送 条件说明 推送SDK版本
小米 支持全系列内地版 MIUI MiPush_SDK_Client_3_6_2.jar
华为 EMUI4.1及以上并同时满足华为移动服务版本 20401300 及以上 push:2.6.0.301
魅族 支持全系列 Flyme push-internal:3.6.3
FCM 安装谷歌移动服务,并且可用 firebase-messaging:11.6.0

从SDK 5.1.0 开始,推送模块从 basesdk 包中分离,开发者如果需要使用推送服务,需要额外集成 nim-push-5.1.0.jar (5.1.0为可变版本号),详情可见“集成方式”这章。 如果不使用推送服务,则不需要集成。

此外,遵循按需使用的原则,nim-push 并不包含第三方推送SDK,开发者按照自己需求自行导入推送SDK,集成一个系统级推送的步骤可以简要归纳如下:

完成上述过程,编译Apk安装到支持该系统级推送的手机上,登陆成功并且杀掉进程,使用其他账号对其发送消息,查看通知栏推送。

下面详细介绍每个推送平台的配置。

小米推送

集成小米推送需要以下几个步骤:

1. 准备工作

在Android推送证书一栏选择添加证书,随后在如下图所示的弹出框中填写对应的信息,其中应用包名填写开发者 Android 应用的包名,AppSecret 填写第一步在小米官网创建应用所获取的 AppSecret,请开发者谨记证书名,这个会在 SDK初始化推送的时候使用。

2. 接入流程

快速接入只需要2步,详细可参考小米推送Android SDK使用指南

1. AndroidManifest.xml 配置

首先,在权限配置里面,有2处需要改成开发者自己的 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.GET_TASKS" />
<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=":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>

2. 配置appIDappkey,证书

请在 App 启动逻辑中,在 NIMClient.init() 之前,调用如下方法在客户端配置小米推送的证书名称 certificate(在网易云通信后台管理系统中配置),appIDappkey。可参照网易云通信 Demo。

// 此处 certificate 请传入为开发者配置好的小米证书名称
NIMPushClient.registerMiPush(context, certificate, appID, appKey);

注意,由于经常有开发者将 NIMPushClient 与小米推送SDK 的MIPushClient混淆,从SDK4.6.0开始,上述逻辑已经废弃,新的配置入口在 SDKOptions#mixPushConfig,在 SDK 初始化时传入。

MixPushConfig config = new MixPushConfig();
config.xmAppId = "xxxx";
config.xmAppKey = "xxxx";
config.xmCertificateName = "xxxx";

将config 设置到SDKOption

options.mixPushConfig = config;

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

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

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

3. 小米推送兼容性

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

/**
 * 以下这些方法运行在非 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) {
    }
}
<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及以上并同时满足华为移动服务版本 20401300 以上时比较稳定能收到通知栏推送消息,和 MIUI 效果一致。因此网易云通信 Android SDK 在同时满足这两个条件的设备上才会启动华为推送服务。

集成华为推送流程和小米类似,,需要以下几个步骤:

1. 准备工作

在Android推送证书一栏选择添加证书,随后在弹出框中填写对应的信息,其中应用包名填写开发者 Android 应用的包名,AppSecret 填写第一步在华为官网创建应用所获取的 AppSecret,请开发者谨记证书名,这个会在 SDK初始化推送的时候使用。这个过程和小米类似。

2. 接入流程

与接入小米推送类似,快速接入华为推送只需要2步,详细可参考华为推送接入文档

1. AndroidManifest.xml 配置

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


<!-- 替换为自己的包名 -->
<provider
    android:name="com.huawei.hms.update.provider.UpdateProvider"
    android:authorities="{你的包名}.hms.update.provider"
    android:exported="false"
    android:grantUriPermissions="true"></provider>

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

<!-- 云信华为推送消息广播 -->
<receiver android:name="com.netease.nimlib.mixpush.hw.HWPushReceiver">
    <intent-filter android:priority="0x7fffffff">
        <action android:name="com.huawei.android.push.intent.REGISTRATION" />
        <action android:name="com.huawei.android.push.intent.RECEIVE" />
        <action android:name="com.huawei.android.push.intent.CLICK" />
        <action android:name="com.huawei.intent.action.PUSH_STATE" />
    </intent-filter>
    <meta-data
         android:name="CS_cloud_ablitity"
         android:value="successRateAnalytics" />
</receiver>

<!-- 兼容性广播 -->
<receiver android:name="com.huawei.hms.support.api.push.PushEventReceiver">
    <intent-filter>
        <!-- 接收通道发来的通知栏消息,兼容老版本Push -->
        <action android:name="com.huawei.intent.action.PUSH" />
    </intent-filter>
</receiver>

2. 配置华为推送appid,证书

同样在AndroidManifest.xml中,添加配置appid

<!-- 填入华为推送平台配置的应用appid -->
<meta-data
    android:name="com.huawei.hms.client.appid"
    android:value="{你的华为推送appid}" />

请在 App 启动逻辑中,在 NIMClient.init() 之前,调用如下方法在客户端配置华为推送的证书名称 certificate(在网易云通信后台管理系统中配置),可参照网易云通信 Demo。

// 此处 certificate 请传入开发者自身的华为证书名称
NIMPushClient.registerHWPush(context, certificate);

同样,从4.6.0 开始上述配置逻辑废弃,使用下面的配置方法:

MixPushConfig config = new MixPushConfig();
config.hwCertificateName = "xxxx";
//华为Appid 在manifest文件中配置

将config 设置到SDKOption

options.mixPushConfig = config;

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

-ignorewarning
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes Signature
# hmscore-support: remote transport
-keep class * extends com.huawei.hms.core.aidl.IMessageEntity { *; }
# hmscore-support: remote transport
-keepclasseswithmembers class * implements com.huawei.hms.support.api.transport.DatagramTransport {
<init>(...); }
# manifest: provider for updates
-keep public class com.huawei.hms.update.provider.UpdateProvider { public *; protected *; }

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

3. 华为推送兼容性

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

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

public class HWPushMessageReceiver extends BroadcastReceiver {

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

    public void onToken(Context context, String token, Bundle extras) {
    }

    public boolean onPushMsg(Context context, byte[] raw, Bundle bundle) {
        return false;
    }

    public void onEvent(Context context, PushReceiver.Event event, Bundle extras) {
    }

    public void onPushState(Context context, boolean pushState) {
    }
}
<receiver android:name="xxx.HWPushMessageReceiver">
    <intent-filter>
        <action android:name="com.huawei.android.push.intent.REGISTRATION" />
        <action android:name="com.huawei.android.push.intent.RECEIVE" />
        <action android:name="com.huawei.android.push.intent.CLICK" />
        <action android:name="com.huawei.intent.action.PUSH_STATE" />
    </intent-filter>
</receiver>

魅族推送

集成魅族推送需要以下几个步骤:

1. 准备工作

implementation 'com.meizu.flyme.internet:push-internal:3.4.2@aar'

2. 接入流程

1. AndroidManifest.xml 配置

首先,在权限配置里面,有2处需要改成开发者自己的 APP 包名,已经配置过的条目则无须添加。

<!-- 兼容flyme5.0以下版本,魅族内部集成pushSDK必填,不然无法收到消息,将{你的包名} 改开发者App的包名-->
<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.0配置权限-->
<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,替换你自己的包名。

<!--配置的service和receiver-->
<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="{你的包名}" />
    </intent-filter>
</receiver>

2. 配置appIDappkey,证书

在SDK 初始化时,加入

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

将config 设置到SDKOption

options.mixPushConfig = config;

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

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

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

3. 魅族推送兼容性

与小米推送兼容性类似


/**
 * 以下这些方法运行在非 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) {
    }
}
<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

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

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

集成 FCM 需要以下几个步骤:

1. 准备工作

implementation 'com.google.firebase:firebase-messaging:11.6.0'
implementation 'com.google.android.gms:play-services-base:11.6.0'

2. 接入流程

1. 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/改成你的通知字体颜色" />

2. 证书

在SDK 初始化时,加入

config.fcmCertificateName = "xxxx";

将config 设置到SDKOption

options.mixPushConfig = config;

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

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

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

3. FCM 通知 payload 解析问题

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

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

1. 判断是否是云信FCM 跳转的Intent:

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

1. 从 FCM Intent 中解析payload:

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

第三方推送自定义接口

对于普通的使用场景,上述接口和功能已经可以满足,为了部分特殊场景的扩展性,网易云通信第三方提供了一些扩展接口,开发者可以依靠这些接口实现一些自定义的推送服务。

扩展接口由 MixPushMessageHandler 提供

/**
 * 第三方推送消息回调接口,用户如果需要自行处理云信的第三方推送消息,则可实现该接口,并注册到{@link NIMPushClient}
 */

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);

    /**
     * 华为推送通知清除接口,利用该接口开发者可以自定义清除华为推送通知。
     * 因为华为推送 SDK 没有清除通知栏接口,对于华为推送消息,云信 SDK 默认调用了清除应用所有通知栏的接口。
     * 如果开发者需要自定义,可以使用这个接口做清除处理
     *
     * @return 返回true表示开发者处理了清除工作,云信 SDK 不再处理,返回false 则相反
     */
    boolean cleanHuaWeiNotifications();
}

开发者需要实现 MixPushMessageHandler,并在 NIMPushClient.registerMiPush() 之后调用下面方法注册该接口。

NIMPushClient.registerMixPushMessageHandler(mixPushMessageHandler);

下面分别讲述具体接口的功能以及示例。

当消息通过第三方推送到用户,用户点击通知栏之后便回调 onNotificationClicked 方法(对于华为推送,该方法偶尔会失效,点击通知栏之后不能保证一定回调此方法)。网易云通信消息 IMMessage 提供了消息提醒定制(可查看消息收发这一节),这个功能在第三方推送中也同样支持,自定义的消息提醒包含消息推送文案以及自定义字段。自定义的消息推送文案优先级高于默认的推送文案,而自定义的字段 payload 也会跟随第三方推送消息携带过来。依靠此回调方法用户可以处理推送传递下来的payload字段。

因为华为推送 SDK 没有清除通知栏接口,对于华为推送消息,云信 SDK 默认调用了清除应用所有通知栏的接口。如果开发者有些通知栏不希望被清除,可以使用这个接口自定义处理,例如可以先将这些通知缓存,在调用清除所有通知接口之后,再将缓存的通知弹出。

注意,由于消息的自定义推送文案以及字段由消息发送端设置,若开发者要使用该功能,请保证各端(IOS, Android, PC, Mac, Web)在发送消息时做到统一。

此外,对于小米推送,payload 内容会通过小米推送消息 extra 字段传输,而 extra 字段可以实现一些自定义的功能,如自定义通知栏铃声的URI、通知栏的点击行为等等(小米推送 extra 字段选项请参照小米推送Android 以及服务端文档)。 因此使用 payload 能间接达到设置这些自定义推送选项。由于小米SDK extra 字段限制,请各端消息发送 payload 字段 key-value 组合不要超过 8 对(若超出可使用嵌套 Map),不要使用 "nim" 作为key,整体 payload 长度不超过1000。

对于华为推送,因为点击通知栏不一定会有方法回调,所以可能导致点击推送通知栏启动应用无法收到 payload 的情况。

推送设置

1. 网易云通信消息开启、关闭推送

使用 MixPushService 提供的 enable 方法可以实现。

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

调用示例

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

在关闭、开启消息提醒的时候,可以调用该接口关闭推送。

2. 设置推送免打扰时间

使用 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 提供的 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);

3. 设置匿名推送

推送不显示详情,不会立即更新到 SDK 内置推送。需要手动调用 NIMClient#updateStatusBarNotificationConfig 来更新。

/**
 * 设置推送是否不展示详情
 *
 * @param showNoDetail 是否不展示详情
 * @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) {
            StatusBarNotificationConfig config = UserPreferences.getStatusConfig();
            config.hideContent = showNoDetail;
            UserPreferences.setStatusConfig(config);
            NIMClient.updateStatusBarNotificationConfig(config);
        } else {
        }
    }
});

其他注意事项

1. 开发者避免调用注销推送方法,例如 MiPushClient.unregisterPush(),如果需要设置关闭推送,请使用 MixPushService#enable 接口。

2. 云信只会在支持的机型上启用相应的推送服务,例如在小米手机上启用小米推送,其他不支持的机型例如 oppo 将不会启用任何推送。

常见问题

1. 开发者接入小米推送之后,网易云通信只支持对小米设备进行消息推送,其它设备默认不进行推送;对于华为推送,需同时满足设备 EMUI4.1(包括)以上以及华为移动服务 20401300(包括)以上版本会进行消息推送,其他设备默认不进行推送。

2. 网易云通信在使用小米、华为推送时,使用通知栏而不是透传提醒模式,因为透传模式要求应用在后台存活,这样消息到达率很低。

3. 第三方推送通知栏展示效果与端内推送展示效果、点击跳转效果存在一些差异,这个问题网易云通信端内推送做了统一,开发者可以在初始化的时候选择启用展开、折叠样式的通知栏。

4. 第三方推送不支持通知栏自定义:铃声、通知栏样式以及提醒模式,旧版设置只对端内推送生效。

5. 若用户不需要接入小米、华为推送,则不做任何配置,将不受影响。

6. 在满足第三方推送的设备上,若网络畅通、账号登陆成功、消息收发正常条件下,若开发者若收不到推送,可从以下几个方面进行排查, 首先检查 AndroidManifest 配置是否正确,包括权限、Service、BroadcastReceiver,网易云通信SDK对 AndroidManifest 做了检查,并有日志记录;其次检查是否关闭了消息提醒以及设置了免打扰等, 如果仍然不能解决,可以求助网易云通信技术支持。

其他已知问题

1. targetSdkVersion >=26 时,对于华为推送,EMUI 8.0.0 版本收不到通知栏推送,EMUI 8.1.0 可以收到。对于小米推送,点击推送通知栏无法启动应用。