GCM、华为推送


必备条件

  • 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 配置

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

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

发送静默消息(不推送)

(Android 发消息)

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(){...});

强制推送

(Android 发消息)

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(){...});

自定义推送提示

(Android 发消息)

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 文档


您可以登录环信管理后台,在应用列表中选中相应的APP,再点击“IM用户”,在用户列表中搜索收不到推送的用户,找到相应的用户后,点击右侧的“操作”下拉菜单,再点击“测试离线推送”,系统会推送一条测试消息给这个用户,如果出现了问题会做出对应的错误原因提示来协助您排查问题,可能的错误提示有:

  • 用户不存在
  • 用户没有绑定Device Token
  • 用户没有绑定证书
  • 证书不存在或被禁