極光征文 | 如何實現(xiàn)Emoji表情的推送??

在開發(fā)中難免有些奇葩的需求亮钦。正常使用極光推送的都知道剩彬,是通過后端直接推字符串召廷,或者json數(shù)據(jù)

首先在推送前要和后端約定好。
比如以這個表情為例
??
數(shù)據(jù)格式1:(UTF-8編碼)

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

數(shù)據(jù)格式2:

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

首先說一個場景:
A.用戶輸入一個帶??表情揍堕,然后提交給服務(wù)端,注意汤纸,這時候服務(wù)端收到的不一定是??衩茸,而是被編碼后的\uD83D\uDE00,這是個UFT-8編碼贮泞。
如果這時候服務(wù)端需要將這個帶??的表情再轉(zhuǎn)發(fā)給用戶B楞慈,那么B收到的也是\uD83D\uDE00

用極光推送測試情況1


用極光推送測試情況2(這里在指不通過服務(wù)端啃擦,直接在極光的后臺操作)

針對這種推送囊蓝,到達手機的顯示也是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編碼過的表情顯然就不行了
然后想象是否可以同過通知欄入手言询,在接收到系統(tǒng)通知的時候先對消息做序列化處理俯萎,處理后再提醒,于是查閱極光的推送文檔發(fā)現(xiàn)了這個

通知欄樣式定義不符合要求运杭?
以上提供的自定義通知欄樣式的功能是有限的夫啊。比如:Android SDK 4.0 以后的 Notification 支持指定 Style ,而這種復(fù)雜的通知樣式定義 JPush SDK 還未有支持辆憔。
或者你想要自定義的復(fù)雜的通知樣式撇眯,但不愿意使用上述高級的自定義通知欄定制功能报嵌。
建議不要使用 JPush 提供的通知功能,而使用自定義消息功能熊榛。
即:推送自定義消息到客戶端后锚国,App 取到自定義消息全部內(nèi)容,然后 App 自己來寫代碼做通知的展示玄坦。請參考文檔:通知 vs. 自定義消息

文檔也說了血筑,建議我們使用自定義消息,但是如果使用極光的自定義消息煎楣,通知欄是沒有提示豺总,這里還需要我們自定義通知欄。

所以為了兼容這種奇葩的推送內(nèi)容择懂,就只能采用自定消息+自定義通知欄的方式了喻喳。

以Android為例:
1、服務(wù)端要通過極光發(fā)送帶表情的推送困曙,則在服務(wù)端將表情轉(zhuǎn)成utf-8編碼表伦,或者用戶在提交的表情到服務(wù)端的時候本地對帶表情的字符串做反序列化操作

String strEmoji = "??";
String strPush = new Gson().toJson(new EmojiBean(strEmoji));
//轉(zhuǎn)換后的結(jié)果
{
"emoji":"\uD83D\uDE00"
}

2、如果服務(wù)端拿到了編碼后的表情慷丽,想推送給其它用戶怎么辦蹦哼?

那就需要推送一條自定義消息了,注意一定要是自定義消息盈魁。普通消息會直接在通知欄顯示翔怎,對未序列化過的例如\uD83D\uDE00,通知欄所出現(xiàn)的還是原編碼后的消息杨耙。

如果要在客戶端顯示就必須在自定義消息中手動進行序列化處理赤套。

 private void customMessage(Context context, String msg) {
        String message = "{\n" +
                "\"emoji\":\"" +
                msg +
                "\"}";
        
        LogUtils.e(message);
        EmojiBean s = new Gson().fromJson(message, EmojiBean.class);
        //發(fā)送到通知欄
        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);
}

這樣做雖然麻煩了點,但是能避免客戶端收到一些亂碼珊膜。

還有一種情況是容握,服務(wù)端返回給極光推送是 ?? ,但是通過極光轉(zhuǎn)發(fā)后就變成了 ?? 這樣的非法字符车柠,所以針對這種情況建議服務(wù)端給提供編碼后的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);
      //動態(tài)監(jiān)聽輸入內(nèi)容
      Matcher emojiMatcher = emoji.matcher(source);
            if (emojiMatcher.find()) {
                ToastUtils.showShort("親凉倚,此處不可以輸入表情哦~");
                return "";
            }

源碼:
MyReceiver.java

另外
關(guān)于推送你還可能想要了解的:

在BroadcastReceiver中利用推送設(shè)置全局彈窗,并將消息保存至本地
Android利用極光推送獲取到消息并緩存至本地
關(guān)于JPush極光推送的基本用法和通知介紹


「本文為極光征文參賽文章」

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嫂沉,隨后出現(xiàn)的幾起案子稽寒,更是在濱河造成了極大的恐慌,老刑警劉巖趟章,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杏糙,死亡現(xiàn)場離奇詭異,居然都是意外死亡尤揣,警方通過查閱死者的電腦和手機搔啊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來北戏,“玉大人,你說我怎么就攤上這事漫蛔∈扔” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵莽龟,是天一觀的道長蠕嫁。 經(jīng)常有香客問我,道長毯盈,這世上最難降的妖魔是什么剃毒? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮搂赋,結(jié)果婚禮上赘阀,老公的妹妹穿的比我還像新娘。我一直安慰自己脑奠,他們只是感情好基公,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宋欺,像睡著了一般轰豆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上齿诞,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天酸休,我揣著相機與錄音,去河邊找鬼祷杈。 笑死斑司,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吠式。 我是一名探鬼主播陡厘,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抽米,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了糙置?” 一聲冷哼從身側(cè)響起云茸,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谤饭,沒想到半個月后标捺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡揉抵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年亡容,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冤今。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡闺兢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戏罢,到底是詐尸還是另有隱情屋谭,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布龟糕,位于F島的核電站桐磁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏讲岁。R本人自食惡果不足惜我擂,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缓艳。 院中可真熱鬧校摩,春花似錦、人聲如沸郎任。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舶治。三九已至分井,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霉猛,已是汗流浹背尺锚。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惜浅,地道東北人瘫辩。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伐厌。 傳聞我的和親對象是個殘疾皇子承绸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容