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

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

1.背景:

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

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上收不到推送了, 仍是谨慎一点比较好.java

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

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

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

这是由于华为平台点击跳转是须要配一个intent, 在融云的后台, 如图所示:
image app

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

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

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大概是这样的格式:spa

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

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

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

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

相关文章
相关标签/搜索