差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
im:android:push:thirdpartypush [2019/03/14 12:28]
jk [接入流程]
im:android:push:thirdpartypush [2022/05/26 09:03] (当前版本)
huanxinfudh [设置推送模版]
行 3: 行 3:
 ====== 第三方推送集成 ====== ====== 第三方推送集成 ======
  
 +更新时间:2022-01-15
 +
 +新版文档见:[[ccim:​android:​push|Android 推送设置]]。
 ---- ----
  
 ===== 说明 ===== ===== 说明 =====
  
-app在后台运行时环信IM SDK默认通过一个后台服务保持一条连接环信服务器的长连接,但Android为了解决系统待机性能差的问题,随着Android版本的升级逐渐禁止了app级别的后台服务的运行。所以在一些版本比较高的Android系统上会有接收不到消息的情况。为了提高消息的到达率,我们SDK增加了对第三方推送服务的支持,包括小米推送,华为推送,OPPO推送,魅族推送,VIVO推送,Google FCM推送。+当 App 在后台运行时环信 IM SDK 默认通过一个后台服务保持一条连接环信服务器的长连接,但 Android 为了解决系统待机性能差的问题,随着 Android 版本的升级逐渐禁止了 ​App 级别的后台服务的运行。所以在一些版本比较高的 Android 系统上会有接收不到消息的情况。为了提高消息的到达率,我们 SDK 增加了对第三方推送服务的支持,包括小米推送,华为推送,OPPO 推送,魅族推送,VIVO 推送,Google FCM 推送。 
 + 
 +目前小米、魅族、OPPO、VIVO 推送的主要实现集成在了环信 IM SDK 中,尽量提供给开发者最简单的集成三方推送的形式。Google FCM 和华为推送的实现仍在 Demo 层,需要开发者自己集成,详情请参考环信的 Google FCM 和华为的推送集成文档
  
-目前小米、魅族、OPPO、VIVO推送的主要实现集成在了环信 IM SDK 中,尽量提供给开发者最简单的集成三方推送的形式。Google FCM 和华为推送的在 Demo 层需要开发者自己集成,详情请参考环信的 Google FCM 和华为推送集成文档+**注意:**''​SDK V3.5.4 及以上版本才支持第三方各平台推送,但 SDK V3.5.4 在华为注册推送的时候会出异常,该 Bug 在 V3.5.5 及之后的版本中已修复这里建议未集成的用户或者已是 V3.5.4 ​用户升级到更高的 SDK 版本''​
  
 == 各推送使用条件:== == 各推送使用条件:==
-  * Google FCM:需要Google Play Service和能连接Google服务器的网络 +  * Google FCM:需要 Google Play Service 和能连接 Google 服务器的网络 
-  * 小米推送:在小米系统上可用 +  * 小米推送:在小米系统上可用 
-  * 华为推送:在华为系统上可用 +  * 华为推送:在华为系统上可用 
-  * 魅族推送:在魅族系统上可用 +  * 魅族推送:在魅族系统上可用 
-  * OPPO推送:在OPPO系统上可用 +  * OPPO 推送:在 OPPO 系统上可用 
-  * VIVO推送:在VIVO系统上可用 +  * VIVO 推送:在 VIVO 系统上可用 
-  * SDK内部会按照这个顺序去检测设备的推送支持情况 +  * SDK 内部会按照这个顺序去检测设备的推送支持情况 
-  * 如果未设置第三方推送或者不满足使用第三方推送的条件,环信IM SDK会通过一些保活手段尽可能的保持与环信服务器的长连接,以确保消息的及时送达+  * 如果未设置第三方推送或者不满足使用第三方推送的条件,环信 IM SDK 会通过一些保活手段尽可能的保持与环信服务器的长连接,以确保消息的及时送达
  
-''​建议:如果你的App有海外使用场景,建议开启FCM推送;由于各推送使用条件不同,建议尽可能同时支持小米和华为推送。''​+''​建议:如果你的 App 有海外使用场景,建议开启 FCM 推送;由于各推送使用条件不同,建议尽可能同时支持小米和华为推送。''​
  
 === 消息推送流程: === === 消息推送流程: ===
行 27: 行 32:
 {{ :​im:​android:​push:​image010.png?​nolink |消息推送流程图}} {{ :​im:​android:​push:​image010.png?​nolink |消息推送流程图}}
  
-  - 判断设备支持哪种推送app配置了第三方推送并且满足该推送的使用条件) +  - 判断设备支持哪种推送(App 配置了第三方推送并且满足该推送的使用条件) 
-  - 根据集成第三方推送SDK获取推送token +  - 根据集成第三方推送 SDK 获取推送 token 
-  - 上传证书名称(环信服务器用来判断使用哪种推送通道)和推送token到环信服务器 +  - 上传证书名称(环信服务器用来判断使用哪种推送通道)和推送 token 到环信服务器 
-  - 向某设备发送消息时,环信服务器会先判断目标设备是否在线,如果目标设备不在线,则判断目标设备使用了哪种推送通道(根据目标设备上传的证书名称),使用该推送通道通过第三方推送服务器将消息推送至目标设备+  - 向某设备发送消息时,环信服务器会先判断目标设备是否在线,如果目标设备不在线,则判断目标设备使用了哪种推送通道(根据目标设备上传的证书名称),使用该推送通道通过第三方推送服务器将消息推送至目标设备
  
 == 环信服务器应具备的能力: == == 环信服务器应具备的能力: ==
  
-  * 拥有向你的app发送推送消息的能力 +  * 拥有向你的 ​App 发送推送消息的能力 
-     ​* 开发者通过环信后台配置App的推送证书,推送证书会要求填写证书名称(或者appKey),证书名称是环信服务器用来判断目标设备使用哪种推送通道的唯一条件,所以''​证书名称必须与Android终端设备上传的证书名称一致''​ +  * 开发者通过环信后台配置 App 的推送证书,推送证书会要求填写证书名称(或者 ​App Key),证书名称是环信服务器用来判断目标设备使用哪种推送通道的唯一条件,所以''​证书名称必须与 Android 终端设备上传的证书名称一致''​ 
-  * 跟终端Android设备一一对应的推送token +  * 跟终端 Android 设备一一对应的推送 token 
-     ​* 需Android设备上报 +  * 需 Android 设备上报 
-  * 推送token属于哪个推送通道 +  * 推送 token 属于哪个推送通道 
-     ​* 需Android设备上报+  * 需 Android 设备上报
  
-== Android设备需要做的事: ==+== Android 设备需要做的事: ==
  
-  * 判断当前设备支持哪种推送通道 +  * 判断当前设备支持哪种推送通道 
-  * 通过集成第三方推送SDK获取推送token +  * 通过集成第三方推送 SDK 获取推送 token 
-  * 上传证书名称(注意跟通过环信后台配置的证书名称保持一致)和推送token至环信服务器(该步骤必须在环信SDK登录成功后)+  * 上传证书名称(注意跟通过环信后台配置的证书名称保持一致)和推送 token 至环信服务器(该步骤必须在环信 SDK 登录成功后)
  
 ===== 配置推送接口 ===== ===== 配置推送接口 =====
行 52: 行 57:
 <​code>​ <​code>​
 EMPushConfig.Builder builder = new EMPushConfig.Builder(context);​ EMPushConfig.Builder builder = new EMPushConfig.Builder(context);​
-        builder.enableVivoPush() // 推送证书相关信息配置在AndroidManifest.xml中+        builder.enableVivoPush() // 推送证书相关信息配置在 AndroidManifest.xml 中
                 .enableMeiZuPush(String appId, String appKey)                 .enableMeiZuPush(String appId, String appKey)
                 .enableMiPush(String appId, String appKey)                 .enableMiPush(String appId, String appKey)
                 .enableOppoPush(String appKey, String appSecret)                 .enableOppoPush(String appKey, String appSecret)
                 .enableHWPush() //​开发者需要调用该方法来开启华为推送                 .enableHWPush() //​开发者需要调用该方法来开启华为推送
-                .enableFCM(String senderId); //​开发者需要调用该方法来开启FCM推送+                .enableFCM(String senderId); //​开发者需要调用该方法来开启 FCM 推送
  
 EMOptions options = new EMOptions();​ EMOptions options = new EMOptions();​
行 63: 行 68:
 </​code>​ </​code>​
 开发者需要把上述配置中的相关信息换成开发者自己申请的各平台的配置。建议开发者尽可能多的配置三方推送,以确保离线消息的到达率。 开发者需要把上述配置中的相关信息换成开发者自己申请的各平台的配置。建议开发者尽可能多的配置三方推送,以确保离线消息的到达率。
 +
 +**请注意: 开发者需要在 SDK 初始化之前配置相关的推送信息。**
  
 开发者可以调用以下代码监听推送相关事件(仅支持小米、魅族、OPPO、VIVO): 开发者可以调用以下代码监听推送相关事件(仅支持小米、魅族、OPPO、VIVO):
行 70: 行 77:
  public void onError(EMPushType pushType, long errorCode) {  public void onError(EMPushType pushType, long errorCode) {
  EMLog.e("​PushClient",​ "Push client occur a error: " + pushType + " - " + errorCode);  EMLog.e("​PushClient",​ "Push client occur a error: " + pushType + " - " + errorCode);
-// TODO: 开发者会在这个回调中收到使用推送的相关错误信息,各推送类型的error code开发者可以自己去各推送平台官网查询错误原因。+// TODO: 开发者会在这个回调中收到使用推送的相关错误信息,各推送类型的 error code 开发者可以自己去各推送平台官网查询错误原因。
  }  }
  
行 80: 行 87:
 }); });
 </​code>​ </​code>​
-===== Google FCM推送集成 ===== 
  
-''​SDK 3.4.2 版本开始默认优先使用FCM推送,在一些带Google Play Service的华为设备上,开发者可通过设置EMOptions#​setUseFCM(false)关闭FCM推送的使用,来达到使用华为推送的目的。''​+===== 关于混淆 ===== 
 +  * 如果您在项目中开启了混淆,请把以下规则添加到您的混淆规则中: 
 +  <​code>​ 
 +  # 环信 push 
 +  -dontwarn com.hyphenate.push.*** 
 +  -keep class com.hyphenate.push.*** {*;} 
 +  </​code>​ 
 + 
 +  * 关于环信推送中集成的第三方推送的混淆规则,可以自行到各开发者推送平台查看 
 + 
 +===== Google FCM 推送集成 ===== 
 + 
 +''​SDK 3.4.2 版本开始默认优先使用 FCM 推送,在一些带 Google Play Service 的华为设备上,开发者可通过设置 EMOptions#​setUseFCM(false) 关闭 FCM 推送的使用,来达到使用华为推送的目的。SDK 3.8.5 版本开始废弃了 EMOptions#​setUseFCM(false),由应用层去控制是否优先使用 FCM 推送。''​
  
 ==== 说明 ==== ==== 说明 ====
  
   * FCM 使用主要针对海外用户;   * FCM 使用主要针对海外用户;
-  * FCM 要求设备安装有 Google Play 服务、 Google Play 商店 和 能连接Google服务器的网络。+  * FCM 要求设备安装有 Google Play 服务、 Google Play 商店 和 能连接 Google 服务器的网络。
  
 ==== 服务端 ==== ==== 服务端 ====
行 99: 行 117:
 4.选择应用类型后需要输入包名、项目昵称、SHA-1,然后点击 **Register App**。 4.选择应用类型后需要输入包名、项目昵称、SHA-1,然后点击 **Register App**。
  
-5.进入引导页,如下图,点击按钮下载google-services.json文件到本地。//​注意该json文件在Android项目中的放置位置。//​+5.进入引导页,如下图,点击按钮下载 google-services.json 文件到本地。//​注意该 json 文件在 Android 项目中的放置位置。//​
  
 {{:​im:​200androidcleintintegration:​3.3.5_config_download.png?​direct&​400|}} {{:​im:​200androidcleintintegration:​3.3.5_config_download.png?​direct&​400|}}
  
-6.跳过引导页,点击Cloud Messaging tab页,复制Server Key和Sender ID。+6.跳过引导页,点击 Cloud Messaging tab 页,复制 Server Key 和 Sender ID。
  
 {{:​im:​200androidcleintintegration:​3.3.5_cloud_messaging.png?​direct&​400|}} {{:​im:​200androidcleintintegration:​3.3.5_cloud_messaging.png?​direct&​400|}}
  
-7.登录[[http://​console.easemob.com/​|环信管理后台]],选择你的应用—选择推送证书—新增证书,证书的名称要求填上方复制Sender ID,证书秘钥填写上方复制的Server Key。+7.登录[[http://​console.easemob.com/​|环信管理后台]],首页-应用列表查看应用-即时通讯—消息推送-添加推送证书,证书的名称要求填上方复制 Sender ID,证书秘钥填写上方复制的 Server Key。
  
 {{:​im:​android:​push:​添加谷歌证书.png?​direct|}} {{:​im:​android:​push:​添加谷歌证书.png?​direct|}}
行 115: 行 133:
 ==== 移动端 ==== ==== 移动端 ====
  
-1.添加Google Play Service相关依赖+''​从 SDK 3.8.5 版本开始,移除了 SDK 内置的 11.4.0 的 FCM 推送的相关依赖,将 FCM 推送集成从 SDK 中转移到应用层,集成方式会有变化,参考后续的文档。''​
  
-用于检查设备是否支持Google FCM推送,''​该步骤在FCM官方集成文档上不存,由于国内特殊使用环境,所以我们增了该配置用于辅助检测''​。+=== SDK 3.8.5 版本之后集成方式 === 
 +1.项目根目录下的 build.gradle 中添加 FCM 服务插件
  
-把''​compile '​com.google.android.gms:​play-services-base:​11.4.0'''​该行配置添加到项目相应的build.gradle文件中,SDK demo中的配置在easeui/​build.gradle中,如下:+<​code>​ 
 +dependencies { 
 +        // Google Firebase cloud messaging 
 +        classpath '​com.google.gms:​google-services:​4.3.8'​ 
 +    } 
 +</​code>​ 
 + 
 +2.添加 FCM 相关依赖库 
 + 
 +在项目 App 目录下的 build.gradle 中导入 Firebase 平台的相关库 
 + 
 +<​code>​ 
 +dependencies { 
 +    // Import the BoM for the Firebase platform 
 +    implementation platform('​com.google.firebase:​firebase-bom:​28.2.1'​) 
 + 
 +    // When using the BoM, you don't specify versions in Firebase library dependencies 
 +    implementation '​com.google.firebase:​firebase-messaging'​ 
 +    } 
 +</​code>​ 
 + 
 +3.在项目 App 目录下的 build.gradle 中添加 Google Services plugin 
 + 
 +<​code>​ 
 +// Add the following line: 
 +apply plugin: '​com.google.gms.google-services' ​ // Google Services plugin 
 +</​code>​ 
 + 
 +4.放置下载的 google-services.json 在项目的 App 目录下 
 + 
 +{{:​im:​200androidcleintintegration:​3.3.5_config_location.png?​direct&​400|}} 
 + 
 +5.实现一个继承自 FirebaseInstanceIdService 的自定义 service,该类用于监听 FCM token 的创建和更新,以及用于 FCM 在后台进行接收应用推送消息的处理。一个设备对应一个 FCM token,该 token 用于服务端向该设备推送消息,所以该 token 创建或更新后需及时上传至环信服务器。并把该 service 注册到 AndroidManifest.xml 中。 
 + 
 +<​code>​ 
 +public class EMFCMMSGService extends FirebaseMessagingService { 
 +    private static final String TAG = "​EMFCMMSGService";​ 
 + 
 +    @Override 
 +    public void onMessageReceived(RemoteMessage remoteMessage) { 
 +        super.onMessageReceived(remoteMessage);​ 
 +        if (remoteMessage.getData().size() > 0) { 
 +            String message = remoteMessage.getData().get("​alert"​);​ 
 +            Log.i(TAG, "​onMessageReceived:​ " + message); 
 +        } 
 +    } 
 + 
 +    @Override 
 +    public void onNewToken(@NonNull String token) { 
 +        super.onNewToken(token);​ 
 +        Log.i(TAG, "​onNewToken:​ " + token); 
 +        EMClient.getInstance().sendFCMTokenToServer(token);​ 
 +    } 
 +
 +</​code>​ 
 + 
 +AndroidManifest.xml: 
 + 
 +<​code>​ 
 +<service android:​name="​.common.fcm.EMFCMMSGService">​ 
 +       <​intent-filter>​ 
 +            <action android:​name="​com.google.firebase.MESSAGING_EVENT"​ /> 
 +       </​intent-filter>​ 
 +</​service>​ 
 +</​code>​ 
 + 
 +6.在 SDK 初始化的地方去启用 FCM 推送 
 + 
 +<​code>​ 
 +EMPushConfig.Builder builder = new EMPushConfig.Builder(context);​ 
 +builder.enableFCM(String senderId);​ 
 +options.setPushConfig(builder.build());​ 
 +</​code>​ 
 + 
 +7.SDK 初始化之后去注册 PushListener 接口,重写 isSupportPush 方法,由开发者实现代码判断 FCM 是否可用,只需要判断 EMPushType.FCM,其他无需处理。 
 + 
 +<​code>​ 
 +EMPushHelper.getInstance().setPushListener(new PushListener() { 
 +   ​@Override 
 +   ​public void onError(EMPushType pushType, long errorCode) { 
 +      // TODO: 返回的 errorCode 仅 9xx 为环信内部错误,可从 EMError 中查询,其他错误请根据 pushType 去相应第三方推送网站查询。 
 +      EMLog.e("​PushClient",​ "Push client occur a error: " + pushType + " - " + errorCode);​ 
 +   } 
 + 
 +   ​@Override 
 +   ​public boolean isSupportPush(EMPushType pushType, EMPushConfig pushConfig) { 
 +      // 由外部实现代码判断设备是否支持 FCM 推送 
 +      if(pushType == EMPushType.FCM){ 
 +           ​return GoogleApiAvailabilityLight.getInstance().isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS;​ 
 +         } 
 +          return super.isSupportPush(pushType,​ pushConfig);​ 
 +    } 
 +
 +</​code>​ 
 + 
 +8.在登录成功之后添加上传 FCM 推送 token 的代码,确保推送 token 上传成功 
 + 
 +<​code>​ 
 +if(GoogleApiAvailabilityLight.getInstance().isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS){ 
 +     // 获取 FCM 推送 token 并上传 
 +     ​FirebaseMessaging.getInstance().getToken().addOnCompleteListener(new OnCompleteListener<​String>​() { 
 +        @Override 
 +        public void onComplete(@NonNull Task<​String>​ task) { 
 +            if (!task.isSuccessful()) { 
 +                EMLog.d("​FCM",​ "​Fetching FCM registration token failed:"​+task.getException());​ 
 +                return; 
 +             } 
 +             // Get new FCM registration token 
 +             ​String token = task.getResult();​ 
 +             ​EMLog.d("​FCM",​ token); 
 +             ​EMClient.getInstance().sendFCMTokenToServer(token);​ 
 +         } 
 +    }); 
 +
 +</​code>​ 
 +  
 +=== SDK 3.8.5 版本之前集成方式 === 
 +1.添加 Google Play Service 相关依赖库 
 + 
 +用于检查设备是否支持 Google FCM 推送,''​该步骤在 FCM 官方集成文档上不存在,由于国内特殊的使用环境,所以我们增加了该配置用于辅助检测''​。 
 + 
 +把 ''​compile '​com.google.android.gms:​play-services-base:​11.4.0'''​ 该行配置添加到项目相应的 build.gradle 文件中,SDK demo 中的配置在 easeui/​build.gradle 中,如下:
  
 <​code>​ <​code>​
行 128: 行 268:
 </​code>​ </​code>​
  
-''​注意:​Google推送相关依赖库版本必须对应(该文档中均为:11.4.0),否则可能会出现类冲突的错误。''​+''​注意:​Google 推送相关依赖库版本必须对应(该文档中均为:11.4.0),否则可能会出现类冲突的错误。''​
  
-2.在project-level的build.gradle中添加FCM相关库文件配置:+2.在 project-level 的 build.gradle 中添加 FCM 相关库文件配置:
  
 <​code>​ <​code>​
行 151: 行 291:
 </​code>​ </​code>​
  
-3.在app-level的build.gradle中添加FCM相关库文件配置:Push+3.在 app-level 的 build.gradle 中添加 FCM 相关库文件配置:Push
  
 <​code>​ <​code>​
行 163: 行 303:
 </​code>​ </​code>​
  
-''​注意:​Google推送相关依赖库版本必须对应(该文档中均为:11.4.0),否则可能会出现类冲突的错误。''​+''​注意:​Google 推送相关依赖库版本必须对应(该文档中均为:11.4.0),否则可能会出现类冲突的错误。''​
  
-4.放置下载的google-services.json在app-level的根目录下+4.放置下载的 google-services.json 在 app-level 的根目录下
  
 {{:​im:​200androidcleintintegration:​3.3.5_config_location.png?​direct&​400|}} {{:​im:​200androidcleintintegration:​3.3.5_config_location.png?​direct&​400|}}
  
-5.实现一个继承自FirebaseInstanceIdService的自定义service,该类用于监听FCM token的创建和更新。一个设备对应一个FCM token,该token用于服务端向该设备推送消息,所以该token创建或更新后需及时上传至环信服务器。+5.实现一个继承自 FirebaseInstanceIdService 的自定义 service,该类用于监听 FCM token 的创建和更新。一个设备对应一个 FCM token,该 token 用于服务端向该设备推送消息,所以该 token 创建或更新后需及时上传至环信服务器。
  
-自定义FirebaseInstanceIdService:+自定义 FirebaseInstanceIdService:
  
 <​code>​ <​code>​
行 198: 行 338:
 </​code>​ </​code>​
  
-6.实现一个继承自FirebaseMessagingService的自定义service,该类用于FCM在后台进行接收应用推送消息的处理。并把该service注册到AndroidManifest.xml中。+6.实现一个继承自 FirebaseMessagingService 的自定义 service,该类用于 FCM 在后台进行接收应用推送消息的处理。并把该 service 注册到 AndroidManifest.xml 中。
  
-自定义FirebaseMessagingService:+自定义 FirebaseMessagingService:
  
 <​code>​ <​code>​
行 227: 行 367:
 </​code>​ </​code>​
  
-7.通过EMOptions#​setUseFCM(true)接口设置允许使用FCM推送,SDK会进行FCM推送条件的检查,并在FCM推送条件满足的情况下使用FCM推送。接口使用可参考Demo中的DemoHelper。+7.通过 EMOptions#​setUseFCM(true) 接口设置允许使用 FCM 推送,SDK 会进行 FCM 推送条件的检查,并在 FCM 推送条件满足的情况下使用 FCM 推送。接口使用可参考 Demo 中的 DemoHelper。
  
-8.启用FCM推送+8.启用 FCM 推送 
 +  * ''​SDK3.5.4 及以后版本:''​
 <​code>​ <​code>​
 EMPushConfig.Builder builder = new EMPushConfig.Builder(context);​ EMPushConfig.Builder builder = new EMPushConfig.Builder(context);​
 builder.enableFCM(String senderId); builder.enableFCM(String senderId);
 options.setPushConfig(builder.build());​ options.setPushConfig(builder.build());​
 +</​code>​
 +  * SDK 3.5.3 及之前版本:
 +<​code>​
 +EMOptions options = new EMOptions();​
 +options.setFCMNumber(senderId);​
 </​code>​ </​code>​
  
 ==== 推送服务测试 ==== ==== 推送服务测试 ====
  
-为了确保推送服务的成功集成,可按如下步骤进行测试, +为了确保推送服务的成功集成可按如下步骤进行测试 
-  - 运行app并进行登录 +  - 运行 ​App 并进行登录 
-  - 杀掉该app进程(通过Android任务列表滑动结束进程,不是按Home键让app进入后台;''​通过 设置->​应用->​强行停止 结束app进程,app无法接收到FCM推送,详情请查阅Google官方对该操作的解释''​。) +  - 杀掉该 ​App 进程(通过 Android 任务列表滑动结束进程不是按 Home 键让 ​App 进入后台;''​通过 设置->​应用->​强行停止 结束 ​App 进程,App 无法接收到 FCM 推送,详情请查阅 Google 官方对该操作的解释''​。) 
-  - 向该登录账号发送消息,app会收到通过推送服务送达的消息+  - 向该登录账号发送消息,App ​会收到通过推送服务送达的消息
  
-===== 华为HMS推送集成 =====+===== 华为 HMS 推送集成 =====
  
 ==== 创建华为应用 ==== ==== 创建华为应用 ====
-首先就是去华为开发者后台创建应用,并开启 push 服务,并上传对应的证书指纹,具体可以看下华为官方介绍:[[http://​developer.huawei.com/​consumer/​cn/​service/​hms/​catalog/​huaweipush.html?​page=hmssdk_huaweipush_devprepare| 华为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''​以及程序的''​包名''​;+注册完整后,需要在[[http://​console.easemob.com|环信开发者后台]]上传推送证书,选择 你的应用 —> 推送证书 —> Huawei —> 新增证书,然后输入你在[[http://​developer.huawei.com/​consumer/​cn/​devunion/​openPlatform/​html/​memberCenter.html#/​appManager|华为开发者后台]]创建的应用信息中的 ''​APPID''​ 和 ''​SecretKey''​ 以及程序的 ''​包名''​; 
 + 
 +==== 华为 4.0 推送集成 ==== 
 +从华为 EMUI 10.0 版本开始华为推送将通知消息智能分成两个级别:一般与重要。[[https://​developer.huawei.com/​consumer/​cn/​doc/​development/​HMSCore-Guides/​android-intelligent-classification-0000001050040120 | 华为通知消息智能分类]] 
 + 
 +可以参考环信最新的 demo 去集成 4.0 版本的华为推送:​ 
 + 
 +1、将华为推送后台项目应用下的 “agconnect-services.json” 文件拷贝到应用级根目录下。 
 + 
 +2、在项目级根目录的 build.gradle 里配置以下:
  
-==== 启用华为推送 ==== 
 <​code>​ <​code>​
 +allprojects {
 +    repositories {
 +        google()
 +        mavenCentral()
 +        maven {url '​https://​developer.huawei.com/​repo/'​}
 +        jcenter()//​马上弃用
 +    }
 +}
 +buildscript {
 +    repositories {
 +        google()
 +        mavenCentral()
 +        maven {url '​https://​developer.huawei.com/​repo/'​}
 +        jcenter()//​马上弃用
 +    }
 +    dependencies {
 +        classpath '​com.huawei.agconnect:​agcp:​1.3.1.300'​
 +    }
 +}
 +</​code>​
 +
 +3、在应用级的 build.gradle 里添加如下编译依赖:
 +
 +<​code>​
 +apply plugin: '​com.huawei.agconnect'​
 +
 +dependencies {
 +     //​其它已存在的依赖不要删除
 +     ​implementation '​com.huawei.hms:​push:​4.0.2.300'​
 +}
 +</​code>​
 +
 +4、demo 中的 HMSPushHelper 里封装了华为申请 token 的代码,可以参考实现。
 +
 +5、需要继承 HmsMessageService,重写 onNewToken,在里面去上传推送 token,可参考 demo 中的 HMSPushService,并配置到清单文件里。
 +
 +<​code>​
 +<​!--华为 HMS Config-->​
 +<service android:​name="​.service.HMSPushService"​
 +    android:​exported="​false">​
 +    <​intent-filter>​
 +        <action android:​name="​com.huawei.push.action.MESSAGING_EVENT"​ />
 +    </​intent-filter>​
 +</​service>​
 +<!-- huawei push end -->
 +</​code>​
 +
 +6、在 SDK 初始化的时候,配置启用华为推送。
 +<​code>​
 +EMOptions options = new EMOptions();​
 +//​其他配置设置
 +...
 EMPushConfig.Builder builder = new EMPushConfig.Builder(context);​ EMPushConfig.Builder builder = new EMPushConfig.Builder(context);​
 builder.enableHWPush();​ builder.enableHWPush();​
 +//​其他推送配置设置
 +...
 options.setPushConfig(builder.build());​ options.setPushConfig(builder.build());​
 </​code>​ </​code>​
 +**''​注意:''​**我们默认的推送文案会被智能分类到一般,APP端收到的就是静默通知,需要给消息设置自定义推送的标题和内容,具体分类标准可咨询华为官网。
 +
 +==== 华为推送角标 ====
 +需要在消息扩展里设置上应用入口activity,如环信demo是com.hyphenate.chatuidemo.ui.SplashActivity
 +<​code>​
 +// 设置自定义推送提示
 +JSONObject extObject = new JSONObject();​
 +try {
 +    extObject.put("​em_huawei_push_badge_class",​ "​com.hyphenate.chatuidemo.ui.SplashActivity"​);​
 +} catch (JSONException e) {
 +    e.printStackTrace();​
 +}
 +// 将推送扩展设置到消息中
 +message.setAttribute("​em_apns_ext",​ extObject);
 +</​code>​
 +清空角标数参考[[http://​obs.cn-north-1.myhwclouds.com/​consumer/​docattachment/​87918b190abda6d7b7a568a7ef1dfc314cd9ad040faccf1a999dcff158ec7d79/​badge.pdf | 华为官方文档]]
  
-==== SDK3.4.x 华为推送重大更新 ​==== +==== SDK3.4.x ​- SDK3.5.4 版本 ​华为推送集成说明 ​==== 
-为了方便用户自己升级华为推送相关sdk,环信 SDK 在''​3.4.x''​之后的版本中将华为推送的集成从''​SDK''​中''​转移到应用层''​,SDK提供上传华为推送token的接口供用户调用,方便华为推送升级时用户自行升级,以后的版本就需要开发者自己去集成华为推送相关功能,然后调用下边的方法将 token 发送到环信服务器:+为了方便用户自己升级华为推送相关 ​SDK,环信 SDK 在 ''​3.4.x''​ 之后的版本中将华为推送的集成从 ''​SDK''​ 中 ''​转移到应用层''​,SDK 提供上传华为推送 token 的接口供用户调用,方便华为推送升级时用户自行升级,以后的版本就需要开发者自己去集成华为推送相关功能,然后调用下边的方法将 token 发送到环信服务器:
 <code java> <code java>
 // 上传 token 方法,token 是通过广播接收器接收到的 // 上传 token 方法,token 是通过广播接收器接收到的
 EMClient.getInstance().sendHMSPushTokenToServer("​华为appId",​ "​注册华为的 token"​);​ EMClient.getInstance().sendHMSPushTokenToServer("​华为appId",​ "​注册华为的 token"​);​
 </​code>​ </​code>​
-''​PS:''​需要注意,此方法必须是登录成功后才能调用,所以请求华为 token 需要放在登录成功之后,所以我们请求华为推送 token 一般放在 MainActivity 类中,环信 IM 的 Demo也已经集成了华为最新推送 SDK,开发者也可以参考 demo 进行集成,token 的获去就是在广播接收器中,Demo 中有实现''​HMSPushReceiver''​类,可以看下 demo 的代码+''​PS:''​需要注意,此方法必须是登录成功后才能调用,所以请求华为 token 需要放在登录成功之后,所以我们请求华为推送 token 一般放在 MainActivity 类中,环信 IM 的 Demo 也已经集成了华为最新推送 SDK,开发者也可以参考 demo 进行集成,token 的获去就是在广播接收器中,Demo 中有实现''​HMSPushReceiver''​类,可以看下 demo 的代码
  
 这是华为官方集成文档,开发者可以自己根据华为官方文档进行集成华为推送 这是华为官方集成文档,开发者可以自己根据华为官方文档进行集成华为推送
 ''​[[http://​developer.huawei.com/​consumer/​cn/​service/​hms/​catalog/​huaweipush_agent.html?​page=hmssdk_huaweipush_sdkdownload_agent|华为消息推送服务集成官方文档]]''​ ''​[[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 中将华为的 HMSAgent 做成了一个 module 进行引用(''​这里没有对华为 HMSAgent 进行任何封装和修改''​),开发者可以直接进行使用,也可以直接下载华为官方最新的 ''​HMSAgent''​ 自己进行集成,如果使用 demo 中的 module 需要修改以下几个地方:
 <​code>​ <​code>​
 <​application>​ <​application>​
-    <!-- 接入HMSSDK 需要注册的appid参数。value的值中“10492024”用实际申请的appid替换,来源于开发者联盟网站应用的权益详情。格式 android:​value="​appid=xxxxxx"​-->​+    <!-- 接入 HMSSDK 需要注册的 appid 参数。value 的值中 “10492024” 用实际申请的 appid 替换,来源于开发者联盟网站应用的权益详情。格式 android:​value="​appid=xxxxxx"​-->​
     <​meta-data     <​meta-data
         android:​name="​com.huawei.hms.client.appid"​         android:​name="​com.huawei.hms.client.appid"​
         android:​value="​appid=10492024"​ />         android:​value="​appid=10492024"​ />
-    <!-- 接入HMSSDK 需要注册的provider,authorities 一定不能与其他应用一样,所以这边 com.hyphenate.chatuidemo 要替换上您应用的包名-->​+    <!-- 接入 HMSSDK 需要注册的 provider,authorities 一定不能与其他应用一样,所以这边 com.hyphenate.chatuidemo 要替换上您应用的包名-->​
     <​provider     <​provider
         android:​name="​com.huawei.hms.update.provider.UpdateProvider"​         android:​name="​com.huawei.hms.update.provider.UpdateProvider"​
行 282: 行 506:
         android:​exported="​false"​         android:​exported="​false"​
         android:​grantUriPermissions="​true"​ />         android:​grantUriPermissions="​true"​ />
-    <!-- 接入HMSSDK 需要注册的provider,authorities 一定不能与其他应用一样,所以这边 com.hyphenate.chatuidemo 要替换上您应用的包名-->​+    <!-- 接入 HMSSDK 需要注册的 provider,authorities 一定不能与其他应用一样,所以这边 com.hyphenate.chatuidemo 要替换上您应用的包名-->​
     <​provider     <​provider
         android:​name="​com.huawei.updatesdk.fileprovider.UpdateSdkFileProvider"​         android:​name="​com.huawei.updatesdk.fileprovider.UpdateSdkFileProvider"​
行 292: 行 516:
 </​code>​ </​code>​
  
-Demo在集成华为推送时将调用华为推送的几个方法都放在了''​HMSPushHelper''​类中,开发者可以进行参考使用+Demo 在集成华为推送时将调用华为推送的几个方法都放在了 ''​HMSPushHelper''​ 类中,开发者可以进行参考使用
  
-配置完这些之后,在''​满足条件的华为设备''​上就可以使用华为推送接收离线推送通知了; ​  +配置完这些之后,在 ''​满足条件的华为设备''​ 上就可以使用华为推送接收离线推送通知了; ​  
-这里的满足条件是指:华为设备必须安装2.6.+以上的华为移动服务,以及开启当前 ​app 的''​自启动权限''​;+这里的满足条件是指:华为设备必须安装 2.6.+ 以上的华为移动服务,以及开启当前 ​App 的''​自启动权限''​;
  
-==== 故障排查 ​==== +===== 小米推送集成 ===== 
-当开发者做完这些之后如果华为设备上还是收不到推送,可以看下控制台输出或者环信 sdcard ​保存日志,是否有一下日志输出: + 
-<code log> +小米推送需要Android端导入小米推送的jar包在清单AndroidManifest.xml里加小米相关权限和配置。并请参考Android端API文档对小米推送的appid和appkey进行设置。更多详情请参考小米官方文档。 
-// 当设备的华为移动服务版本比较低的时候,无法启用华为推送,会有以下输出 + 
-huawei mobile services is not available. please upgrade +服务器端证书配置请使环信console后台。
-// 当注册 token 时,华为开发者后台证书不对应,或者没有开通 Push 服务,当所有都确认没问题后,如果还是有这样的问题,这个需要联系华为技术支持查看下是否生效 +
-hms service connection suspended. error: 6xxx 或 9xxxxxxxx +
-</​code>​ +
-后边的 error 为华为官方错误码,更多错误码请参考华为官方错误表:[[http://​developer.huawei.com/​consumer/​cn/​service/​hms/​catalog/​huaweipush.html?​page=hmssdk_huaweipush_devguide#​表3-1 HMS 通错误码及处理方式|表3-1 HMS 通用错误码及处理方式]]+
  
-===== 魅族推送集成(即将上线) ​=====+===== 魅族推送集成 =====
  
 魅族推送包含该两种推送类型:Flyme 推送和集成推送。二者的区别是:Flyme 推送是魅族自己的推送;集成推送除了有魅族自己的 Flyme 推送外还可以通过配置集成小米、华为等第三方推送。环信 SDK 内部使用的是 Flyme 推送[[http://​open-wiki.flyme.cn/​index.php?​title=Flyme%E6%8E%A8%E9%80%81%E6%8E%A5%E5%85%A5%E6%96%87%E6%A1%A3|参考文档]] 魅族推送包含该两种推送类型:Flyme 推送和集成推送。二者的区别是:Flyme 推送是魅族自己的推送;集成推送除了有魅族自己的 Flyme 推送外还可以通过配置集成小米、华为等第三方推送。环信 SDK 内部使用的是 Flyme 推送[[http://​open-wiki.flyme.cn/​index.php?​title=Flyme%E6%8E%A8%E9%80%81%E6%8E%A5%E5%85%A5%E6%96%87%E6%A1%A3|参考文档]]
  
 +**注意:**环信 SDK 从 **3.5.4** 版本开始支持 **魅族** 推送,如您使用的是之前版本的 SDK ,请先进行升级。
 ==== 创建魅族应用 ==== ==== 创建魅族应用 ====
 首先就是去魅族开发者后台创建应用,并开启 push 服务,并上传对应的证书指纹,具体可以看下魅族官方介绍:[[http://​open-wiki.flyme.cn/​index.php?​title=Flyme%E6%8E%A8%E9%80%81%E6%8E%A5%E5%85%A5%E6%96%87%E6%A1%A3| flyme 推送服务集成]] 首先就是去魅族开发者后台创建应用,并开启 push 服务,并上传对应的证书指纹,具体可以看下魅族官方介绍:[[http://​open-wiki.flyme.cn/​index.php?​title=Flyme%E6%8E%A8%E9%80%81%E6%8E%A5%E5%85%A5%E6%96%87%E6%A1%A3| flyme 推送服务集成]]
行 378: 行 599:
  
 注意:如果开发者自己集成了魅族Flame推送且实现了 MzPushMessageReceiver ,请把该父类替换为环信 SDK 提供的 EMMzMsgReceiver ,开发者自行判断业务逻辑,非开发者自有业务逻辑请通过 super 方法交给环信 SDK 处理。 注意:如果开发者自己集成了魅族Flame推送且实现了 MzPushMessageReceiver ,请把该父类替换为环信 SDK 提供的 EMMzMsgReceiver ,开发者自行判断业务逻辑,非开发者自有业务逻辑请通过 super 方法交给环信 SDK 处理。
-===== OPPO 推送集成(即将上线) ​=====+===== OPPO 推送集成 =====
  
 +**注意:**环信 SDK 从 **3.5.4** 版本开始支持 **OPPO** 推送,如您使用的是之前版本的 SDK ,请先进行升级。''​OPPO推送在2.1.0适配了android Q,在android Q上接收OPPO推送需要升级环信SDK到3.7.1以及之后的版本,并使用OPPO推送2.1.0的包。从3.9.1版本开始,升级OPPO推送版本到3.0.0''​
 ==== 创建 OPPO 应用 ==== ==== 创建 OPPO 应用 ====
 首先就是去 OPPO 开发者后台创建应用,并开启 push 服务,并上传对应的证书指纹,具体可以看下 OPPO 官方介绍:[[https://​open.oppomobile.com/​wiki/​doc#​id=10195| OPPO 推送服务集成]] 首先就是去 OPPO 开发者后台创建应用,并开启 push 服务,并上传对应的证书指纹,具体可以看下 OPPO 官方介绍:[[https://​open.oppomobile.com/​wiki/​doc#​id=10195| OPPO 推送服务集成]]
  
 ==== 上传推送证书 ==== ==== 上传推送证书 ====
-注册完整后,需要在[[http://​console.easemob.com|环信开发者后台]]上传推送证书,选择你的应用—>​推送证书—>​OPPO—>​新增证书,然后输入你在[[https://​open.oppomobile.com/​service/​oms?​service_id=1000004&​app_type=app&​app_id=30004346| OPPO 开发者后台]]创建的应用的''​APP KEY''​和''​MASTER SECRET''​以及程序的''​包名''​;+注册完整后,需要在[[http://​console.easemob.com|环信开发者后台]]上传推送证书,选择你的应用—>​推送证书—>​OPPO—>​新增证书,然后输入你在[[https://​open.oppomobile.com/​service/​oms?​service_id=1000004&​app_type=app&​app_id=30004346| OPPO 开发者后台]]创建的应用的''​appkey''​和''​mastersecret''​以及程序的''​包名''​;
  
 ==== 接入流程 ==== ==== 接入流程 ====
行 399: 行 621:
 <!-- OPPO推送配置 start --> <!-- OPPO推送配置 start -->
 <​uses-permission android:​name="​com.coloros.mcs.permission.RECIEVE_MCS_MESSAGE"/>​ <​uses-permission android:​name="​com.coloros.mcs.permission.RECIEVE_MCS_MESSAGE"/>​
 +<​uses-permission android:​name="​com.heytap.mcs.permission.RECIEVE_MCS_MESSAGE"/>​
 <!-- OPPO推送配置 end --> <!-- OPPO推送配置 end -->
 </​code>​ </​code>​
行 404: 行 627:
 3.在 AndroidManifest.xml 的 application 标签下添加: 3.在 AndroidManifest.xml 的 application 标签下添加:
 <​code>​ <​code>​
-<​!-- ​OPPO 推送配置 start -->+<​!-- ​Oppo推送配置 start -->
 <service <service
-android:​name="​com.coloros.mcssdk.PushService" ​      android:​permission="​com.coloros.mcs.permission.SEND_MCS_MESSAGE">​ +   android:​name="​com.heytap.msp.push.service.CompatibleDataMessageCallbackService" 
-        <​intent-filter>​ +   android:​permission="​com.coloros.mcs.permission.SEND_MCS_MESSAGE">​ 
-         <action android:​name="​com.coloros.mcs.action.RECEIVE_MCS_MESSAGE"​ /> +   ​<​intent-filter>​ 
-        </​intent-filter>​ +      <action android:​name="​com.coloros.mcs.action.RECEIVE_MCS_MESSAGE"/>​ 
-</​service>​ +   ​</​intent-filter>​ 
-<​!-- ​OPPO 推送配置 end -->+</​service> <​!--兼容Q以下版本-->​ 
 + 
 +<​service 
 +   ​android:​name="​com.heytap.msp.push.service.DataMessageCallbackService"​ 
 +   ​android:​permission="​com.heytap.mcs.permission.SEND_PUSH_MESSAGE">​ 
 +   <​intent-filter>​ 
 +      <action android:​name="​com.heytap.mcs.action.RECEIVE_MCS_MESSAGE"/>​ 
 +      <action android:​name="​com.heytap.msp.push.RECEIVE_MCS_MESSAGE"/>​ 
 +   </​intent-filter>​ 
 +</​service>​ <​!--兼容Q版本--
 +<​!-- ​Oppo推送配置 end -->
 </​code>​ </​code>​
  
行 420: 行 653:
 options.setPushConfig(builder.build()); ​ options.setPushConfig(builder.build()); ​
 </​code>​ </​code>​
-注意把上方的 APP KEY 和 MASTER ​SECRET 替换成开发者自己申请的内容。 +注意把上方的 APP KEY 和 APP SECRET 替换成开发者自己申请的内容。
-===== VIVO 推送集成(即将上线) =====+
  
 +5.调用OPPO推送的初始化
 +<​code>​
 +//OPPO SDK升级到2.1.0后需要进行初始化
 +HeytapPushManager.init(context,​ true);
 +</​code>​
 +===== VIVO 推送集成 =====
 +
 +**注意:**环信 SDK 从 **3.5.4** 版本开始支持 **VIVO** 推送,如您使用的是之前版本的 SDK ,请先进行升级。
 +Vivo 需要应用上架应用商店才能正式使用VIVO推送。''​从3.9.1版本开始,升级Vivo推送版本到3.0.0.4_484。''​
 +''​Vivo默认是推送运营消息,需要联系我们配置为系统消息(重新上传证书也需要重新配置)''​
 ==== 创建 VIVO 应用 ==== ==== 创建 VIVO 应用 ====
-首先就是去 VIVO 开发者后台创建应用,并开启 push 服务,并上传对应的证书指纹,具体可以看下 VIVO 官方介绍:[[https://​open.oppomobile.com/wiki/doc#id=10195| VIVO 推送服务集成]]+首先就是去 VIVO 开发者后台创建应用,并开启 push 服务,并上传对应的证书指纹,具体可以看下 VIVO 官方介绍:[[https://​dev.vivo.com.cn/documentCenter/doc/281| VIVO 推送服务集成]]
  
 ==== 上传推送证书 ==== ==== 上传推送证书 ====
行 439: 行 681:
 <​code>​ <​code>​
 <!-- VIVO 推送配置 start --> <!-- VIVO 推送配置 start -->
 +        <!--Vivo Push SDK的版本信息-->​
 +        <​meta-data
 +            android:​name="​sdk_version_vivo"​
 +            android:​value="​484"/>​
 +        <​meta-data
 +            android:​name="​local_iv"​
 +            android:​value="​MzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsMzIsMzgsMzcsMzYsMzUsMzQsMzMsI0AzNCwzMiwzMywzNywzMywzNCwzMiwzMywzMywzMywzNCw0MSwzNSwzNSwzMiwzMiwjQDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDMyLDM4LDM3LDMzLDM1LDM0LDMzLCNAMzQsMzIsMzMsMzcsMzMsMzQsMzIsMzMsMzMsMzMsMzQsNDEsMzUsMzIsMzIsMzI"​ />
 +       
         <service         <service
             android:​name="​com.vivo.push.sdk.service.CommandClientService"​             android:​name="​com.vivo.push.sdk.service.CommandClientService"​
 +            android:​permission="​com.push.permission.UPSTAGESERVICE"​
             android:​exported="​true"​ />             android:​exported="​true"​ />
         <​activity         <​activity
行 534: 行 785:
 </​code>​ </​code>​
  
-===== 收不到离线推送? ===== 
- 
-您可以登录[[https://​console.easemob.com|环信管理后台]],在应用列表中选中相应的APP,再点击"​IM用户"​,在用户列表中搜索收不到推送的用户,找到相应的用户后,点击右侧的"​操作"​下拉菜单,再点击"​测试离线推送"​,系统会推送一条测试消息给这个用户,如果出现了问题会做出对应的错误原因提示来协助您排查问题,可能的错误提示有: 
-  * 用户不存在 
-  * 用户没有绑定Device Token 
-  * 用户没有绑定证书 
-  * 证书不存在或被禁