极光征文 | 如何实现Emoji表情的推送😆

在开发中难免有些奇葩的需求。正常使用极光推送的都知道,是通过后端直接推字符串,或者json数据

首先在推送前要和后端约定好。
比如以这个表情为例
😀
数据格式1:(UTF-8编码)

{
"emoji":"表情推送\uD83D\uDE00"
}

数据格式2:

{
"emoji":"表情推送😀"
}

首先说一个场景:
A.用户输入一个带😆表情,然后提交给服务端,注意,这时候服务端收到的不一定是😆,而是被编码后的\uD83D\uDE00,这是个UFT-8编码。
如果这时候服务端需要将这个带😆的表情再转发给用户B,那么B收到的也是\uD83D\uDE00

用极光推送测试情况1


用极光推送测试情况2(这里在指不通过服务端,直接在极光的后台操作)

针对这种推送,到达手机的显示也是UTF-8编码过的,如果想要在手机正常显示表情,需要对字符串解析,以安卓为例使用Gson


    public class EmojiBean {
        String emoji;

        public EmojiBean(String emoji) {
            this.emoji = emoji;
        }

        @Override
        public String toString() {
            return "EmojiBean{" +
                    "emoji='" + emoji + '\'' +
                    '}';
        }
    }

EmojiBean s = new Gson().fromJson(message, EmojiBean.class);
LogUtils.e("解析:"+s.toString());

解析完成把setText字符串,就能显示表情了

注意这里控制台打印的log是无法识别的字符

E/Tag[TAG] LogUtils[e, 231]: 解析:EmojiBean{emoji='表情推送��'}

最后在手机上显示是这样的


在这个时候直接使用通知栏推送utf-8编码过的表情显然就不行了
然后想象是否可以同过通知栏入手,在接收到系统通知的时候先对消息做序列化处理,处理后再提醒,于是查阅极光的推送文档发现了这个

通知栏样式定义不符合要求?
以上提供的自定义通知栏样式的功能是有限的。比如:Android SDK 4.0 以后的 Notification 支持指定 Style ,而这种复杂的通知样式定义 JPush SDK 还未有支持。
或者你想要自定义的复杂的通知样式,但不愿意使用上述高级的自定义通知栏定制功能。
建议不要使用 JPush 提供的通知功能,而使用自定义消息功能。
即:推送自定义消息到客户端后,App 取到自定义消息全部内容,然后 App 自己来写代码做通知的展示。请参考文档:通知 vs. 自定义消息

文档也说了,建议我们使用自定义消息,但是如果使用极光的自定义消息,通知栏是没有提示,这里还需要我们自定义通知栏。

所以为了兼容这种奇葩的推送内容,就只能采用自定消息+自定义通知栏的方式了。

以Android为例:
1、服务端要通过极光发送带表情的推送,则在服务端将表情转成utf-8编码,或者用户在提交的表情到服务端的时候本地对带表情的字符串做反序列化操作

String strEmoji = "😆";
String strPush = new Gson().toJson(new EmojiBean(strEmoji));
//转换后的结果
{
"emoji":"\uD83D\uDE00"
}

2、如果服务端拿到了编码后的表情,想推送给其它用户怎么办?

那就需要推送一条自定义消息了,注意一定要是自定义消息。普通消息会直接在通知栏显示,对未序列化过的例如\uD83D\uDE00,通知栏所出现的还是原编码后的消息。

如果要在客户端显示就必须在自定义消息中手动进行序列化处理。

 private void customMessage(Context context, String msg) {
        String message = "{\n" +
                "\"emoji\":\"" +
                msg +
                "\"}";
        
        LogUtils.e(message);
        EmojiBean s = new Gson().fromJson(message, EmojiBean.class);
        //发送到通知栏
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(context)
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setContentTitle(s.getEmoji())
                        .setContentText(s.getEmoji());

        Notification notification = mBuilder.build();
        NotificationManager mNotifyMgr =
                (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
        mNotifyMgr.notify(1, notification);
}

这样做虽然麻烦了点,但是能避免客户端收到一些乱码。

还有一种情况是,服务端返回给极光推送是 😆 ,但是通过极光转发后就变成了 �� 这样的非法字符,所以针对这种情况建议服务端给提供编码后的utf-8字符,不要直接丢表情过来。

更高级的,还可以对通知栏自定义,推送图片URL等。

再补充一点,如果在用户编辑输入框的时候,不想让他输入 emoji 表情,那么就要通过正则取匹配 emoji 的字符集,如果查到了说明是 emoji 表情,可以给提示禁止输入非法字符等

Pattern emoji = Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]",
            Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
      //动态监听输入内容
      Matcher emojiMatcher = emoji.matcher(source);
            if (emojiMatcher.find()) {
                ToastUtils.showShort("亲,此处不可以输入表情哦~");
                return "";
            }

源码:
MyReceiver.java

另外
关于推送你还可能想要了解的:

在BroadcastReceiver中利用推送设置全局弹窗,并将消息保存至本地
Android利用极光推送获取到消息并缓存至本地
关于JPush极光推送的基本用法和通知介绍


「本文为极光征文参赛文章」

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容