GCM、华为推送
Google GCM集成
必备条件
- GCM 使用针对于国外用户;
- GCM 要求设备安装有 Google Play 服务和 Google Play 商店。
设置环信 Android 推送证书
第 1 步:登录 Google 开发平台,Create a project…,创建你的应用名称,应用 ID(ID 系统会随机为你分配一个唯一的值,也可以手动填写)。
第 2 步:创建成功得到一个对应的project number。
第 3 步:点击左侧 Credentials — create service key,得到 API key。
在环信管理后台配置证书
登录环信管理后台,选择你的应用,选择推送证书 → 新增证书,证书的名称要求填写从 Google 后台创建项目生成的 project number,证书秘钥为创建 server key 生成的 API key。
Android 客户端代码配置
AndroidManifest.xml 配置
<manifest>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!-- yourpackage 为你的项目包名,要记得更改 -->
<permission android:name="yourpackage.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="yourpackage.permission.C2D_MESSAGE" />
<application>
<receiver
android:name="com.easemob.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="yourpackage" />
</intent-filter>
</receiver>
<service android:name="com.easemob.chat.EMGCMListenerService"
android:exported="false" >
</service>
<!-- app自定义广播用来接收gcm推送 -->
<receiver
android:name="com.easemob.chatuidemo.receiver.GCMPushBroadCast"
android:exported="false">
<intent-filter >
<action android:name="com.easemob.sdk.push"/>
<category android:name="yourpackage"/>
</intent-filter>
</receiver>
</application>
</manifest>
代码设置
- project number(Google 开发平台创建项目生成的)需要在登录之前设置
EMChatManager.getInstance().setGCMProjectNumber(projectNumber);
。 - 使用 GCM 则需要使用新的 logout API,logout 里面参数默认为 true 是需要清除 GCM token,而且要求退出时清除。
EMChatManager.getInstance().logout(true);
EMChatManager.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.easemob.chatuidemo
替换成你自己项目的。
<manifest>
...
<application>
...
<receiver android:name="com.easemob.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 时调用EMChatManager.getInstance().setHuaweiPushAppId(huaweiPushAppid,)
。
以及 logout 时调用EMChatManager.getInstance().logout(true,callback)
。
推送的配置选项
用户可以在消息扩展中增加特定的字段来实现消息的推送配置。
发送静默消息(不推送)
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT);
TextMessageBody txtBody = new TextMessageBody("test");
message.setReceipt("6006");
// 设置自定义扩展字段
message.setAttribute("em_ignore_notification", true);
// 发送消息
EMChatManager.getInstance().sendMessage(message, new EMCallBack(){...});
强制推送
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT);
TextMessageBody txtBody = new TextMessageBody("test");
message.setReceipt("6006");
// 设置自定义扩展字段
message.setAttribute("em_force_notification", true);
// 发送消息
EMChatManager.getInstance().sendMessage(message, new EMCallBack(){...});
自定义推送提示
EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT);
TextMessageBody txtBody = new TextMessageBody("test");
message.setReceipt("6006");
// 设置自定义扩展字段
try{
JSONObject extJson = new JSONObject();
extJson.put("em_push_name", "自定义标题");
extJson.put("em_push_content", "自定义信息");
message.setAttribute("em_apns_ext",extJson);
} catch (JSONException e){
e.printStackTrace();
}
// 发送消息
EMChatManager.getInstance().sendMessage(message, new EMCallBack(){...});
另外,GCM 推送可以在 “em_apns_ext” 中传入 “collapseKey”、“timeToLive”来控制推送的相关属性,详见 GCM 文档
下一页:环信UI Demo
收不到离线推送?
您可以登录环信管理后台,在应用列表中选中相应的APP,再点击“IM用户”,在用户列表中搜索收不到推送的用户,找到相应的用户后,点击右侧的“操作”下拉菜单,再点击“测试离线推送”,系统会推送一条测试消息给这个用户,如果出现了问题会做出对应的错误原因提示来协助您排查问题,可能的错误提示有:
- 用户不存在
- 用户没有绑定Device Token
- 用户没有绑定证书
- 证书不存在或被禁