推送

网易云通信 Unity SDK 1.5.0 引入华为和小米推送,当用户杀掉进程或者云信服务器无法连接到客户端时,使用手机厂商系统级推送提醒用户消息到达。系统级别的推送(小米、华为等)的相比其他推送(个推、极光)的优势在于,系统推送在相应的厂商系统上拥有稳定的系统级长连接,可以做到随时接受推送消息。Unity SDK 只提供接收消息推送的通道,对推送通知的处理如应用内跳转等逻辑需要应用根据实际情况自己实现。

厂商推送 条件说明 推送SDK版本 云信SDK版本
小米 支持全系列 MIUI 3.6.0 1.5.0
华为 EMUI4.1及以上并同时满足华为移动服务版本 2.5.2 及以上 2.5.2.300 1.5.0

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

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

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

小米推送

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

准备工作

小米推送证书管理

在Android推送证书一栏选择添加证书,随后在如下图所示的弹出框中填写对应的信息,其中应用包名填写开发者 Android 应用的包名,AppSecret 填写第一步在小米官网创建应用所获取的 AppSecret。

添加小米推送证书

接入流程

快速接入只需要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. 上传token和证书

Unity Demo 提供了获取小米推送token的示例,参考demo 源码MiPush类实现。

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

华为推送

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

集成华为推送需要以下几个步骤:

准备工作

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

接入流程

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

AndroidManifest.xml 配置可参考 配置manifest文件

1. 配置华为推送appid

在AndroidManifest.xml中,Application节点添加配置appid

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

2. 在Application节点下增加2个receiver,用来接收广播信息

 <!-- 第三方相关 :接收Push消息(注册、Push消息、Push连接状态)广播 -->
<receiver android:name="com.netease.hwpushwrapper.PushBroadcastReceiver">
    <intent-filter>
        <!-- 必须,用于接收token -->
        <action android:name="com.huawei.android.push.intent.REGISTRATION"/>
        <!-- 必须,用于接收消息 -->
        <action android:name="com.huawei.android.push.intent.RECEIVE"/>
        <!-- 可选,用于点击通知栏或通知栏上的按钮后触发onEvent回调 -->
        <action android:name="com.huawei.android.push.intent.CLICK"/>
        <!-- 可选,查看push通道是否连接,不查看则不需要 -->
        <action android:name="com.huawei.intent.action.PUSH_STATE"/>
    </intent-filter>
</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>

3. 在Unity C# 代码中获取token

Unity Demo 提供了获取华为推送token的示例:

Utils类中提供了方法InitHuaweiPush用于连接华为移动服务并获取token,结果会通知到通过SetHuaweiPushReceiverObject接口设置的对象上,在该对象的MonoBehavior脚本中实现以下方法获取连接和推送token结果: (以下函数参数字符串都是JSON格式

函数 说明 参数
OnHuaweiPushConnected(string result) 推送服务连接成功 {"connection":bool}
OnHuaweiPushConnectionFailed(string result) 推送服务连接失败 {"connection":bool,"error":int}
OnHuaweiPushToken(string result) 获取华为推送token结果 {"token":string,"belongId":string}
OnHuaweiPushMsg(string result) 接收推送透传消息 {"message",string}
OnHuaweiPushState(string result) 推送状态 {"state",bool}

成功获取到推送token以后调用函数NIM.User.UserAPI.UpdatePushToken将在云信管理后台配置的证书和token提交到云信服务器。(注意:该函数需要在登录成功以后才能调用)

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

Unity Demo 使用java代码封装了推送SDK的一些接口,通过jar包的方式在unity中使用,java源码位于Demo Assets/Scripts/nim_push_java_src.rar 中,用户可以根据自己需要进行修改,重新生成jar包在程序中使用。

上传推送Token

完成推送配置获取到推送Token后需要将配置信息上传到网易云信服务器,服务器才能正确下发推送消息。

/// <summary>
/// 更新推送证书名和token
/// </summary>
/// <param name="certificateName">在云信管理后台配置的证书名</param>
/// <param name="token">推送token</param>
/// <param name="type">仅iOS需要 1 表示pushkit,0 表示apns</param>
public static void UpdatePushToken(string certificateName,string token,int type)