当前知识库站点已不再维护。请移步新版知识库:https://help.rongcloud.cn/

同时集成融云推送和友盟推送遇到的冲突

发布时间: 2021-09-02 18:29

回答:

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

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

实现本文相关配置前需要配合融云推送文档,集成融云推送。具体启用推送服务,请参考融云推送文档。

https://docs.rongcloud.cn/v4/5X/views/im/ui/guide/notify/push/android.html


华为推送

1. 下载

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

1630576143478247.png

2.配置 

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

1630576113266707.png

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>