====== 第三方推送集成 ====== ---- ===== 华为HMS推送集成 ===== ==== 创建华为应用 ==== 首先就是去华为开发者后台创建应用,并开启 push 服务,并上传对应的证书指纹,具体可以看下华为官方介绍:[[http://developer.huawei.com/consumer/cn/service/hms/catalog/huaweipush.html?page=hmssdk_huaweipush_devprepare| 华为HMS消息推送服务集成]] ==== 上传推送证书 ==== 注册完整后,需要在[[http://console.easemob.com|环信开发者后台]]上传推送证书,选择你的应用—>推送证书—>Huawei—>新增证书,然后输入你在[[http://developer.huawei.com/consumer/cn/devunion/openPlatform/html/memberCenter.html#/appManager|华为开发者后台]]创建的应用的''APPID''和''APP SECRET''以及程序的''包名''; ==== SDK3.4.x 华为推送重大更新 ==== 为了方便用户自己升级华为推送相关sdk,环信 SDK 在''3.4.x''之后的版本中将华为推送的集成从''SDK''中''转移到应用层'',SDK提供上传华为推送token的接口供用户调用,方便华为推送升级时用户自行升级,以后的版本就需要开发者自己去集成华为推送相关功能,然后调用下边的方法将 token 发送到环信服务器: // 上传 token 方法 EMClient.getInstance().sendHMSPushTokenToServer("华为appId", "注册华为的 token"); ''PS:''需要注意,此方法必须是登录成功后才能调用,所以请求华为 token 需要放在登录成功之后,所以我们请求华为推送 token 一般放在 MainActivity 类中,环信 IM 的 Demo也已经集成了华为最新推送 SDK,开发者也可以参考 demo 进行集成 这是华为官方集成文档,开发者可以自己根据华为官方文档进行集成华为推送 ''[[http://developer.huawei.com/consumer/cn/service/hms/catalog/huaweipush_agent.html?page=hmssdk_huaweipush_sdkdownload_agent|华为消息推送服务集成官方文档]]'' Demo 中将华为的 HMSAgent 做成了一个 module 进行引用(''这里没有对华为 HMSAgent 进行任何封装和修改''),开发者可以直接进行使用,也可以直接下载华为官方最新的''HMSAgent''自己进行集成,如果使用 demo 中的 module 需要修改以下几个地方: ... Demo在集成华为推送时将调用华为推送的几个方法都放在了''HMSPushHelper''类中,开发者可以进行参考使用 配置完这些之后,在''满足条件的华为设备''上就可以使用华为推送接收离线推送通知了; 这里的满足条件是指:华为设备必须安装2.6.+以上的华为移动服务,以及开启当前 app 的''自启动权限''; ==== 故障排查 ==== 当开发者做完这些之后如果在华为设备上还是收不到推送,可以看下控制台的输出,或者环信 sdcard 上保存的日志,是否有一下日志输出: // 当设备的华为移动服务版本比较低的时候,无法启用华为推送,会有以下输出 huawei mobile services is not available. please upgrade // 当注册 token 时,华为开发者后台证书不对应,或者没有开通 Push 服务,当所有的都确认没问题后,如果还是有这样的问题,这个需要联系华为技术支持查看下是否生效 hms service connection suspended. error: 6xxx 或 9xxxxxxxx 后边的 error 为华为官方错误码,更多错误码请参考华为官方错误表:[[http://developer.huawei.com/consumer/cn/service/hms/catalog/huaweipush.html?page=hmssdk_huaweipush_devguide#表3-1 HMS 通用错误码及处理方式|表3-1 HMS 通用错误码及处理方式]] ===== 解绑 token ===== 使用第三方推送时需要在退出登录时解绑设备 token,调用''EMClient.getInstance().logout(true)''或者''EMClient.getInstance().logout(true,callback)''方法,如果是被踢的情况下,则要求设置为 false。 ----- ===== 推送的配置选项 ===== 用户可以在消息扩展中增加特定的字段来实现消息的推送配置。 ==== 发送静默消息(不推送)==== ([[start:200androidcleintintegration:50singlechat#发送消息|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); ====强制推送==== ([[start:200androidcleintintegration:50singlechat#发送消息|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); ====自定义推送提示==== ([[start:200androidcleintintegration:50singlechat#发送消息|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_name", "离线推送标题"); extObject.put("em_push_content", "离线推送内容部分"); } 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"来控制推送的相关属性,详见 [[https://developers.google.com/cloud-messaging/http-server-ref|GCM 文档]] ---- 上一页:[[im:200androidclientintegration:100iosnickname|设置当前登录用户的推送昵称]] 下一页:[[im:200androidclientintegration:125fcmupgrade|FCM推送升级]]