写点什么

融云即时通讯 SDK 集成 -- 华为推送的点击跳转处理

发布于: 2021 年 03 月 15 日

1.背景:


最近公司新上的 app 要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目 deadline 也顶不住哇).就从各家成熟的 SDK 厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的 SDK(老板说了算 hhhh).他家的官网和文档地址: 官网:https://www.rongcloud.cn/文档:https://docs.rongcloud.cn/v4这个任务当然还是落在我的头上. 基础的 IM 聊天, 群组聊天等功能集成在另一篇博客中已经讲过, 这里就先不说了. 之前的一篇文章已经讲过, 这篇文章重点讲下华为推送过来的通知栏点击事件, 这小小的一件事, 可耗费了不少的精力.


2. 融云家 SDK 接入厂商推送指南


这个他家讲的挺清楚了, 都近似手把手的教了, 那我也就不在这浪费键盘寿命了(偷个懒 hhhhh).给他家官方文档往这儿一贴好了: https://docs.rongcloud.cn/v4/views/im/ui/guide/private/notify/push/mi.html. 大家注意一下他家华为厂商推送的文档分 2.x 和 4.x 哈, 对应的是他家旧版/新版 SDK 中接入的厂商的新/旧版本推送包.我这里之前是踩过坑的, 推荐大家还是用他家的 4.x 的 sdk 包集成, 里边集成的是华为新版本的推送包. 因为华为已经在逐渐弃用旧版本的推送包了, 所以不想以后麻烦再迭代的话, 还是直接上新版本比较好, 因为现在已经有接入旧版本包的 app 在某些低版本华为 Rom 上收不到推送了, 还是谨慎一点比较好.


3. 华为推送通知点击跳转自定义


这里我们所指的跳转是, 点击通知栏到达的华为推送通知后, 调起我们的 app, 跳到相应的 Activity 的. 因为我们做的是即时通讯 App, 所以点击别人发来的消息推送通知后, 当然是跳到和该用户聊天的会话页面, 但就是这样一个小业务, 实现起来还真有点麻烦. 所以这里也算是给大家踩踩坑啦.


首先是点击跳转的逻辑, 通过和融云技术支持联系以及查看他们 sdk 的代码, 得知他们的推送都是走了一个叫 PushMessageReceiver 的类, 开发者可以注册并继承该类, 重写 onNotificationMessageClicked()方法, 显而易见这就是对通知消息的监听. 可这也是第一个坑, 华为因为平台的限制, 推送通知的点击事件根本不走这里. 准确的说是华为和 Oppo 都因为各自平台的限制, 不走这里. 所以当我兴致勃勃重写了这个方法准备一次通过的时候, 点击后直接走到了会话列表界面, 而非会话界面.


这是因为华为平台点击跳转是需要配一个 intent, 在融云的后台, 如图所示:


这里的 intent 即为通知栏点击跳转后的隐式启动相应 activity 的那个 intent.


获取某 Activity 相应 intent 的代码, 可把 intent 给打到 log 中:


Intent intent = new Intent(Intent.ACTION_VIEW,
复制代码


                Uri.parse("wonderfullpush://com.wonderfull.android.push/notification?action=your parameter"));
复制代码


        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
复制代码


        intent.setAction(Intent.ACTION_VIEW);
复制代码


        String intnetUri = intent.toUri(Intent.URI_INTENT_SCHEME);
复制代码


        Log.d("hwpush", "intnetUri=" + intnetUri);
复制代码

生成的 intent 大概是这样的格式:


intent://com.wonderfull.android.push/notification?action=$action#Intent;scheme=wonderfullpush;action=android.intent.action.VIEW;launchFlags=0x10000000;end
复制代码

不过这块还有坑, 还不能直接把装会话界面的 activity 的 intent 直接写在这里, 因为这个会话界面去的究竟是哪个对话者的界面, 相应 userId 的参数是传不到的. 在这里我尝试获取过 intent 里边的数据, 是空的.


和融云的技术支持团队确认后, 找到了解决方案. 只有 intent 走到入口类, 才能拿的到通知里携带的数据, 我 app 的闪屏页, 也就是 SplashActivity, 在融云后台把自定义点击跳转 intent 配成 SplashActivity 的. 然后在这里把 intent 的数据拿到, 再一次调用融云的接口跳转到相应的会话界面就 OK 了.


等拿到这个 intent 的后, 又是来了一点点小麻烦. 根据融云的文档, 我在入口 Activity(闪屏页, SplashActivity)这里接收到了 intent, 从 intent 里边取相应的数据:


这个 intent 中给的数据包含了转义符:


{"rc":"{\"conversationType\":\"1\",\"targetId\":\"userid8\",\"sourceType\":\"0\",\"fromUserId\":\"userid8\",\"objectName\":\"RC:TxtMsg\",\"id\":\"BLCG-G8TC-U7E6-KV7P\",\"tId\":\"doctorid3\"}"}
复制代码


String jsonStr = "{\"rc\":\"{\\\"conversationType\\\":\\\"1\\\",\\\"targetId\\\":\\\"userid8\\\",\\\"sourceType\\\":\\\"0\\\",\\\"fromUserId\\\":\\\"userid8\\\",\\\"objectName\\\":\\\"RC:TxtMsg\\\",\\\"id\\\":\\\"BLCG-G8TC-U7E6-KV7P\\\",\\\"tId\\\":\\\"doctorid3\\\"}\"}";
复制代码


        String fixStr1 = jsonStr.replace("\\", "");
复制代码


        String fixStr2 = fixStr1.replace("\"rc\":\"", "\"rc\":" );
复制代码


        String result = fixStr2.replace("\"}\"", "\"}");
复制代码


复制代码


        Log.d(TAG, "result jsonStr: "+ result);
复制代码


复制代码


        JSONObject jsonObject;
复制代码


复制代码


        try {
复制代码


            jsonObject = new JSONObject(result);
复制代码


            String options = jsonObject.getString("rc");
复制代码


            JsonObject object = (JsonObject) new JsonParser().parse(options);
复制代码


复制代码


            String targetId = object.getAsJsonObject().get("targetId").getAsString();
复制代码


复制代码


            Log.d(TAG, "analyse json targetId: " + targetId);
复制代码


复制代码


        } catch (JSONException e) {
复制代码


            e.printStackTrace();
复制代码


        }
复制代码

我选择了自行处理字符串, 拿到了相应的 targetId, 从我的闪屏页跳转到相应的会话界面去. 这样需求就搞定了.


用户头像

还未添加个人签名 2021.01.26 加入

还未添加个人简介

评论

发布
暂无评论
融云即时通讯SDK集成 -- 华为推送的点击跳转处理