在開發(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極光推送的基本用法和通知介紹
「本文為極光征文參賽文章」