解决友盟推送与融云推送的冲突

本文仅用于使用旧版推送集成方案的客户。不适用于使用融云 Push 2.0 集成方案的客户。

同时集成融云和友盟的推送,配置会有冲突,主要解决思路,暂时将融云配置相关位置去掉。

本文标注了gradle 和AndroidManifest.xml 中需要合并修改的位置

华为推送

  1. 登录华为开发者后台,在我的应用->开发->概览->下载 agconnect-servics.json 文件,如下图

  2. 将下载好的 agconnect-servics.json 文件放到 app 模块下的根目录,如下图

  3. 在 project 的 build.gradle 添加 如下配置

    buildscript {
        repositories {
          google()
            maven { url 'http://developer.huawei.com/repo/'}
        }
        dependencies {
            classpath "com.android.tools.build:gradle:4.1.2"
            classpath 'com.huawei.agconnect:agcp:1.4.1.300'
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    allprojects {
        repositories {
            google()
            mavenCentral()
            maven {url  "http://maven.rongcloud.cn/repository/maven-releases/"}
            maven {url 'http://developer.huawei.com/repo/'}
            maven { url 'https://repo1.maven.org/maven2/' }
        }
    }
    
  4. app 目录下添加友盟 华为相关依赖

     dependencies {
       
       //友盟基础库依赖(必须)
        api 'com.umeng.umsdk:common:9.4.2'
        api 'com.umeng.umsdk:asms:1.4.0'
        
        //友盟Push依赖
        api 'com.umeng.umsdk:push:6.4.0'
        
        //    华为
            api 'com.umeng.umsdk:huawei-umengaccs:1.3.4'
            api 'com.huawei.hms:push:5.3.0.301'
      
          }
          
      apply plugin: 'com.huawei.agconnect'
    
  5. 在 AndroidManifest.xml 添加如下配置信息

    <service
        android:name="io.rong.push.platform.hms.HMSPushService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    
    <meta-data
        android:name="com.huawei.hms.client.appid"
        android:value="appid=xxx" />
    

小米推送

1,app 目录下 builg.gradle 添加友盟中小米依赖

 dependencies {
   
//    小米
      api 'com.umeng.umsdk:xiaomi-umengaccs:1.2.4'
      api 'com.umeng.umsdk:xiaomi-push:4.0.2'  
      
      }

注:您如果已经集成融云中的小米推送,在主工程中的 AndroidManifest.xml 文件下小米推送下面配置注释

<!-- 小米 配置开始 < -->
<!-- <permission -->
<!-- android:name="cn.rongcloud.um.permission.MIPUSH_RECEIVE" -->
<!-- android:protectionLevel="signature" /> -->
<!-- <uses-permission android:name="cn.rongcloud.um.permission.MIPUSH_RECEIVE" /> &lt;!&ndash; 小米 配置结束 < &ndash;&gt; -->

2,在主工程中的 AndroidManifest.xml 文件中增加小米推送配置

<!-- 小米 配置开始 < -->
<service
    android:name="com.xiaomi.push.service.XMPushService"
    android:enabled="true" />
<service
    android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
    android:enabled="true"
    android:exported="true" />
<service
    android:name="com.xiaomi.mipush.sdk.MessageHandleService"
    android:enabled="true" /> <!-- 注:此service必须在2.2.5版本以后(包括2.2.5版本)加入 -->
<service
    android:name="com.xiaomi.push.service.XMJobService"
    android:enabled="true"
    android:exported="false"
    android:permission="android.permission.BIND_JOB_SERVICE" /> <!-- 注:此service必须在3.0.1版本以后(包括3.0.1版本)加入 -->
<receiver
    android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>
<receiver
    android:name="com.xiaomi.push.service.receivers.PingReceiver"
    android:exported="false">
    <intent-filter>
        <action android:name="com.xiaomi.push.PING_TIMER" />
    </intent-filter>
</receiver>
<!-- 小米 配置结束 < -->

3.友盟与融云小米广播接收器的冲突解决

自定义MiMessageReceiver 继承自小米包下的PushMessageReceiver,将融云定义的MiMessageReceiver中的代码全部复制,然后将onReceiveRegisterResult中小米返回的推送token 传给友盟方,最后AndroidManifest.xml中注册自定义的MiMessageReceiver

public class MiMessageReceiver extends PushMessageReceiver {
    private static final String TAG = io.rong.push.platform.mi.MiMessageReceiver.class.getSimpleName();

    public MiMessageReceiver() {
    }

    @Override
    public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
        RLog.v(TAG, "onReceivePassThroughMessage is called. " + message.toString());
    }

    @Override
    public void onNotificationMessageClicked(Context context, MiPushMessage message) {
        RLog.v(TAG, "onNotificationMessageClicked is called. " + message.toString());
        PushNotificationMessage pushNotificationMessage = PushUtils.transformToPushMessage(message.getContent());
        PushManager.getInstance().onNotificationMessageClicked(context, PushType.XIAOMI, pushNotificationMessage);
    }

    @Override
    public void onNotificationMessageArrived(Context context, MiPushMessage message) {
        RLog.v(TAG, "onNotificationMessageArrived is called. " + message.toString());
        PushNotificationMessage pushNotificationMessage = PushUtils.transformToPushMessage(message.getContent());
        if (pushNotificationMessage != null) {
            PushManager.getInstance().onNotificationMessageArrived(context, PushType.XIAOMI, pushNotificationMessage);
        }

    }

    @Override
    public void onCommandResult(Context context, MiPushCommandMessage message) {
        RLog.v(TAG, "onCommandResult is called. " + message.toString());
    }

    @Override
    public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
        String command = message.getCommand();
        List<String> arguments = message.getCommandArguments();
        String cmdArg1 = arguments != null && arguments.size() > 0 ? (String) arguments.get(0) : null;
        String cmdArg2 = arguments != null && arguments.size() > 1 ? (String) arguments.get(1) : null;
        RLog.d(TAG, "onReceiveRegisterResult. cmdArg1: " + cmdArg1 + "; cmdArg2:" + cmdArg2);
        if ("register".equals(command)) {
            if (message.getResultCode() == 0L) {
                PushManager.getInstance().onReceiveToken(context, PushType.XIAOMI, cmdArg1);
                
                //将token 上送给友盟
            NotifManager notifManager=new NotifManager();
                notifManager.init(context.getApplicationContext());
                notifManager.reportThirdPushToken(cmdArg1,"MI_TOKEN");
               
            } else {
                PushManager.getInstance().onErrorResponse(context, PushType.XIAOMI, "request_token", message.getResultCode());
            }
        }

    }
}

AndroidManifest.xml中注册自定义的MiMessageReceiver

<receiver
    android:name=".自定义MiMessageReceiver路径.MiMessageReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.xiaomi.mipush.ERROR" />
    </intent-filter>
</receiver>

魅族推送

1,app 目录下 builg.gradle 中添加如下依赖

 dependencies {
   
//      魅族
        api 'com.umeng.umsdk:meizu-umengaccs:1.1.4'
        api 'com.umeng.umsdk:meizu-push:4.0.7'      
        
      }

2,在主工程中的 AndroidManifest.xml 里增加如下配置

<!-- MeiZu 配置开始 < --><!-- 兼容 flyme5.0 以下版本,魅族内部集成 pushSDK 必填,不然无法收到 消息-->
<uses-permission android:name="com.meizu.flyme.push.permission.RECEIVE"/>
    <permission
    android:name="您的包名.push.permission.MESSAGE"
    android:protectionLevel="signature"/>
    <uses-permission android:name="您的包名.push.permission.MESSAGE"/>
    <!-- 兼容 flyme3.0 配置权限-->
    <uses-permission android:name="com.meizu.c2dm.permission.RECEIVE" />
    <!-- MeiZu 配置结束 < -->
    
    
    <application
    <!-- MeiZu 配置开始 < -->
        <receiver android:name="io.rong.push.platform.meizu.MeiZuReceiver">
        <intent-filter>
            <!-- 接收 push 消息 -->
            <action android:name="com.meizu.flyme.push.intent.MESSAGE"/>
            <!-- 接收 register 消息 -->
            <action
                android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
            <!-- 接收 unregister 消息-->
            <action
                android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK"/>
            />            <!-- 兼容低版本 Flyme3 推送服务配置 -->
            <action android:name="com.meizu.c2dm.intent.REGISTRATION"/>
            <action android:name="com.meizu.c2dm.intent.RECEIVE" />
            <category android:name="您的包名"/>
        </intent-filter>
         </receiver>
        <!-- MeiZu 配置结束 < -->
        </application>

3,如已经注册友盟中所需魅族配置MfrMzMessageReceiver 将这个位置注释

<!--        友盟中魅族-->
<!--        <receiver android:name=".umeng.MfrMzMessageReceiver">-->
<!--            <intent-filter>-->
<!--                <action android:name="com.meizu.flyme.push.intent.MESSAGE" />-->
<!--                <action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />-->
<!--                <action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK" />-->
<!--                <action android:name="com.meizu.c2dm.intent.REGISTRATION" />-->
<!--                <action android:name="com.meizu.c2dm.intent.RECEIVE" />-->
<!--                <category android:name="${applicationId}"/>-->
<!--            </intent-filter>-->
<!--        </receiver>-->

oppo推送

app 目录下 builg.gradle 中添加如下依赖

 dependencies {
   
//      oppo
        api 'com.umeng.umsdk:oppo-umengaccs:1.0.7-fix'
        implementation 'com.umeng.umsdk:oppo-push:2.1.0'   
             
      }

vivo推送

1,app 目录下 builg.gradle 中添加如下依赖

 dependencies {
   
//          vivo
           api 'com.umeng.umsdk:vivo-umengaccs:1.1.4'
           implementation 'com.umeng.umsdk:vivo-push:3.0.0' 
                
      }

2,在主工程中的 AndroidManifest.xml 文件下增加如下配置

<!-- 推送需要的权限列表 -->   		
<uses-permission android:name="android.permission.INTERNET"/>
<!-- vivo 推送服务需要配置的 service、activity -->	
	
<service   		
    android:name="com.vivo.push.sdk.service.CommandClientService"   		
	android:exported="true"/>   	<activity   		
	android:name="com.vivo.push.sdk.LinkProxyClientActivity"   	
	android:exported="false"   	
	android:screenOrientation="portrait"   	
	android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
	
	<!-- vivo push 推送 receiver 声明 -->   		
	<receiver android:name="io.rong.push.platform.vivo.VivoPushMessageReceiver" >   		
	<intent-filter>   	
		<!-- 接收 vivo push 消息 -->   
		<action android:name="com.vivo.pushclient.action.RECEIVE" />   
	</intent-filter>   	
	</receiver>

3,在 AndroidManifest.xml 文件中配置 vivo 推送平台生成的 AppID、AppKey

<!-- vivo 推送配置项 -->   		
<meta-data   		
	android:name="com.vivo.push.api_key"   	
	android:value="您的 vivo 推送平台生成 AppKey"/>   	
	<meta-data   		
	android:name="com.vivo.push.app_id"   	
	android:value="您的 vivo 推送平台生成 AppID"/>

关于推送点击打开app,AndroidManife.xml 注册融云定义的PushMessageReceiver,这里有对点击推送通知打开app做操作

<receiver 
android:name="io.rong.push.notification.PushMessageReceiver" 
android:exported="false"> 
<intent-filter> 
<action android:name="io.rong.push.intent.MESSAGE_ARRIVED" /> 
<action android:name="io.rong.push.intent.MESSAGE_CLICKED" /> 
<action android:name="io.rong.push.intent.THIRD_PARTY_PUSH_STATE" /> 
</intent-filter> 
</receiver>