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

46次阅读

共计 3050 个字符,预计需要花费 8 分钟才能阅读完成。

融云即时通讯 SDK 集成 — 华为推送的点击跳转解决

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, 从我的闪屏页跳转到相应的会话界面去. 这样需要就搞定了.

正文完
 0