GCM、华为推送


Google 推送集成

必备条件

  • GCM 使用针对于国外用户;
  • GCM 要求设备安装有 Google Play 服务和 Google Play 商店。

设置环信 Android 推送证书

第 1 步:登录Google 开发平台,Create a project…,创建你的应用名称,应用 ID(ID系统会随机为你分配一个唯一的值,也可以手动填写)。

创建应用

第 2 步:创建成功得到一个对应的 project number。

获得project number

第 3 步:点击左侧 Credentials —create service key,得到 API key。

获得API key

在环信管理后台配置证书

登录环信管理后台,选择你的应用—选择推送证书—新增证书,证书的名称要求填写从 Google 后台创建项目生成的 project number,证书秘钥为创建 server key 生成的 API key。

在环信管理后台配置证书

Android 客户端代码配置

在 AndroidManifest.xml 配置。

注意:把 Demo 的包名 com.hyphenate.chatuidemo 替换成你自己项目的。

<manifest>
	...
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <permission 
        android:name="com.hyphenate.chatuidemo.permission.C2D_MESSAGE"
        android:protectionLevel="signature"
        />
    <uses-permission android:name="com.hyphenate.chatuidemo.permission.C2D_MESSAGE" />
	
	<application>
		...
		<receiver
            android:name="com.hyphenate.chat.EMGCMBroadcastReceiver"
            android:exported="true"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.hyphenate.chatuidemo" />
            </intent-filter>
        </receiver>

        <service android:name="com.hyphenate.chat.EMGCMListenerService"
            android:exported="false" >
        </service>
        
        <receiver 
            android:name="com.hyphenate.chatuidemo.receiver.GCMPushBroadCast"
            android:exported="false">
            <intent-filter >
                <action android:name="com.hyphenate.sdk.push"/>
                <category android:name="com.hyphenate.chatuidemo"/>
            </intent-filter>
        </receiver>
		...
	</application>
</mainfest>

代码设置

  • project number(Google 开发平台创建项目生成的)在初始化 SDK 前设置到 options 里options.setGCMNumber(projectNumber);
  • 使用 GCM 时需要在退出登录时解绑设备 token,调用EMClient.getInstance().logout(true)或者EMClient.getInstance().logout(true,callback)方法,如果是被踢的情况下,则要求设置为 false。

华为推送集成

注意:华为EMUI4.0 需要把app 自动启动权限打开才能收到推送。

需求

为了在华为设备上当app被kill后还能继续收到消息

设置华为推送证书

进入[http://developer.huawei.com/cn/consumer/devunion/openPlatform/html/memberCenter.html#appManage#|华为开发者后台]],创建一个应用,完成后配置push权益。创建完成后,会自动生成的APP ID及APP SECRET,进入环信管理后台,选择你的应用—>选择推送证书—>Huawei—>新增证书。

证书名称为刚从华为后台拿到的 APP ID,证书密钥为 APP SECRET,点击上传即可。

客户端配置

华为推送所需要的jar包已经放到easeui的libs目录下:HwPush_SDK_V2705_nomap.jar,因为demo用到了百度地图,和华为push的地图模块冲突(两者都是用的百度地图),这里的push jar包移除了map模块,需要的开发者可以去华为后台自行下载

在 AndroidManifest.xml 中配置权限及相应 service 声明等。

注意:把 Demo 的包名 com.hyphenate.chatuidemo 替换成你自己项目的。

<manifest>
     ...     
	<application>
	...
<receiver android:name="com.hyphenate.chat.EMHuaweiPushReceiver" >
            <intent-filter>
                必须,用于接收token
                <action android:name="com.huawei.android.push.intent.REGISTRATION" />
                必须,用于接收消息
                <action android:name="com.huawei.android.push.intent.RECEIVE" />
            </intent-filter>
            />
            <meta-data android:name="CS_cloud_ablitity" android:value="successRateAnalytics"/>
        </receiver>

     	PushSDK:PushSDK接收外部请求事件入口
        <receiver
            android:name="com.huawei.android.pushagent.PushEventReceiver"
            android:process=":pushservice" >
            <intent-filter>
                <action android:name="com.huawei.android.push.intent.REFRESH_PUSH_CHANNEL" />
                <action android:name="com.huawei.intent.action.PUSH" />
                <action android:name="com.huawei.intent.action.PUSH_ON" />
                <action android:name="com.huawei.android.push.PLUGIN" />
            </intent-filter>
        </receiver>
         <!-- PushSDK:Push服务 -->
        <service
            android:name="com.huawei.android.pushagent.PushService"
            android:process=":pushservice" >
        </service>
	...
	</application>
</mainfest>

代码设置

在初始化 SDK 前设置到 options 里options.setHuaweiPushAppId(appId)

Logout 时调用EMClient.getInstance().logout(true,callback)

推送的配置选项

用户可以在消息扩展中增加特定的字段来实现消息的推送配置。

发送静默消息(不推送)

(Android 发消息)

EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT);
EMTextMessageBody txtBody = new EMTextMessageBody("test");
message.setTo("6006");
// 设置自定义扩展字段
message.setAttribute("em_ignore_notification", true);
// 设置消息回调
message.setMessageStatusCallback(new EMCallBack() {...});
// 发送消息
EMClient.getInstance().chatManager().sendMessage(message);

强制推送

(Android 发消息)

EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT);
EMTextMessageBody txtBody = new EMTextMessageBody("test");
message.setTo("6006");
// 设置自定义扩展字段
message.setAttribute("em_force_notification", true);
// 设置消息回调
message.setMessageStatusCallback(new EMCallBack() {...});
// 发送消息
EMClient.getInstance().chatManager().sendMessage(message);

自定义推送提示

(Android 发消息)

// 这里只是一 TXT 消息为例,IMAGE FILE 等类型的消息设置方法相同
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT);
EMTextMessageBody txtBody = new EMTextMessageBody("消息内容");
message.setTo("6006");
// 设置自定义推送提示
JSONObject extObject = new JSONObject();
try {
    extObject.put("em_push_title", "消息推送标题");
    extObject.put("em_push_description", "推送内容,一般这里直接写上消息详情,或者消息摘要");
} catch (JSONException e) {
    e.printStackTrace();
}
// 将推送扩展设置到消息中
message.setAttribute("em_apns_ext", extObject);
// 设置消息回调
message.setMessageStatusCallback(new EMCallBack() {...});
// 发送消息
EMClient.getInstance().chatManager().sendMessage(message);

另外,GCM 推送可以在 “em_apns_ext” 中传入 “collapseKey”、“timeToLive”来控制推送的相关属性,详见 GCM 文档