Flutter 63: 圖解 Flutter 集成極光 JPush 小結(jié)

??????我們每天都在接收各種推送消息取逾,而最初的 Flutter 推送主要是與原生交互進(jìn)行岁歉;現(xiàn)階段極光推出了 Flutter JPush,雖不如原生強(qiáng)大职辅,但日常需求均可滿足,小菜嘗試集成了 Flutter 版的 JPush聂示;

前期準(zhǔn)備

  1. 極光 后臺(tái)注冊(cè)賬號(hào)并【創(chuàng)建應(yīng)用】域携;
  1. 在【推送設(shè)置】中設(shè)置 Android/iOS 基本信息,小菜以 Android 為例鱼喉,注意應(yīng)用包名為 ApplicationID秀鞭;
  1. 在【應(yīng)用信息】中獲取 AppKey 等關(guān)鍵參數(shù);

中期集成

Android 配置

??????與原生接入 JPush 相同扛禽,需要在 Android Gradle 加入配置信息锋边;

defaultConfig {
    applicationId "com.example.flutterapp01"
    minSdkVersion 16
    targetSdkVersion 28
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    ndk {
        //選擇要添加的對(duì)應(yīng) cpu 類型的 .so 庫(kù)。
        abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a'
    }

    manifestPlaceholders = [
        JPUSH_PKGNAME : "com.example.flutterapp01",
        JPUSH_APPKEY : "AppKey", // NOTE: JPush 上注冊(cè)的包名對(duì)應(yīng)的 Appkey.
        JPUSH_CHANNEL : "developer-default", //暫時(shí)填寫默認(rèn)值即可.
    ]
}

Flutter 配置

??????按照平常插件接入的方法在工程 pubspec.yaml 中加入 jpush_flutter: 0.1.0 并同步即可编曼;

dependencies:
  jpush_flutter: 0.1.0

API 調(diào)用

JPush 的使用方式很簡(jiǎn)單豆巨,Demo 中都很全面,小菜僅嘗試常見(jiàn)的方法掐场;

1. 初始化

??????在原生開發(fā)中各類三方的插件幾乎均須在 Application 中初始化往扔,同樣 Flutter 也需要先調(diào)用 JPush.setup 進(jìn)行初始化;其中 channel 可自定義熊户,小菜未從源碼中獲取準(zhǔn)確消息萍膛,個(gè)人理解與高版本的 Android Channel 通道類似;

??????初始化成功之后即可獲取消息推送嚷堡,只是暫不能處理蝗罗;

final JPush _jPush = JPush();

@override
void initState() {
  super.initState();
  initPlatformState();
}

Future<void> initPlatformState() async {
  _jPush.setup(
    appKey: "后臺(tái)獲取 AppKey",
    channel: "flutter_channel",
    production: false,
    debug: true,
  );
  if (!mounted) return;
}
2. RegistrationID

??????每個(gè)用戶均有作為接收消息的唯一標(biāo)識(shí) RegistrationID,方便對(duì)單個(gè)或多個(gè)設(shè)備進(jìn)行推送測(cè)試蝌戒;

_jPush.getRegistrationID().then((rid) {
  setState(() {
    _result = "JPush RegistrationID 唯一標(biāo)識(shí):\n $rid";
    _registID = rid;
  });
});
3. 本地通知

??????JPush 提供了本地推送的方法串塑,可以靈活調(diào)用獲取本地推送消息;注意 idint 類型北苟,設(shè)置不能過(guò)長(zhǎng)桩匪;

// 源碼分析
const LocalNotification ({
    @required this.id,          // 通知 id, 可用于取消通知
    @required this.title,       // 通知標(biāo)題
    @required this.content,     // 通知內(nèi)容
    @required this.fireTime,    // 通知觸發(fā)時(shí)間(毫秒)
    this.buildId,               // 通知樣式:1 為基礎(chǔ)樣式,2 為自定義樣式(需先調(diào)用 'setStyleCustom' 設(shè)置自定義樣式)
    this.extra,                 // 額外信息
    this.badge = 0,             // iOS:本地推送觸發(fā)后應(yīng)用角標(biāo)值
    this.soundName,             // iOS:指定推送的音頻文件
    this.subtitle               // iOS:子標(biāo)題
}): 

onTap: () {
  var fireDate = DateTime.fromMillisecondsSinceEpoch(DateTime.now().millisecondsSinceEpoch + 3000);
  var localNotification = LocalNotification(
      id: 000001,
      title: 'Local Push 本地標(biāo)題',
      buildId: 1,
      content: 'Local Push 本地內(nèi)容',
      fireTime: fireDate,
      extra: {"extra_key": "extra_value"});
  _jPush.sendLocalNotification(localNotification).then((res) {
    setState(() {
      _result = res;
    });
  });
}
4. 通知類消息

??????小菜集成原生推送時(shí)分為 通知類消息透?jìng)黝愊?自定義消息)粹淋,兩種推送略有不同吸祟;通知類消息可以通過(guò)極光后臺(tái)配置消息標(biāo)題、消息內(nèi)容等多種信息桃移,且 App 接收到之后直接調(diào)用推送通道展現(xiàn)在通知欄中屋匕;

try {
  _jPush.addEventHandler(
    onReceiveNotification: (Map<String, dynamic> message) async {
      // 獲取通知數(shù)據(jù)
      print('Flutter JPush 獲取通知類數(shù)據(jù):\n $message');
      setState(() {
        _result = 'Flutter JPush 獲取通知類數(shù)據(jù):\n $message';
        _message = message;
      });
    }
  );
} on PlatformException {
  platformVersion = 'Failed to get platform version.';
}
5. 透?jìng)黝愊?/h5>

??????透?jìng)黝愊⑼ㄟ^(guò)極光后臺(tái)配置發(fā)送,主要配置通知內(nèi)容借杰;App 接收到不會(huì)直接調(diào)用推送通道过吻,獲取內(nèi)容后我們可根據(jù)內(nèi)容靈活使用,是否展示推送消息或其他操作等;且通知類消息與透?jìng)黝愊@取參數(shù)不同纤虽;

try {
  _jPush.addEventHandler(
    onReceiveMessage: (Map<String, dynamic> message) async {
      // 獲取透?jìng)鲾?shù)據(jù)
      print('Flutter JPush 獲取透?jìng)黝悢?shù)據(jù):\n $message');
      setState(() {
        _result = 'Flutter JPush 獲取透?jìng)黝悢?shù)據(jù):\n $message';
        _message = message;
      });
    }
  );
} on PlatformException {
  platformVersion = 'Failed to get platform version.';
}
6. 推送點(diǎn)擊監(jiān)聽(tīng)

??????獲取到推送之后注定要有點(diǎn)擊操作乳绕,JPush 也同樣提供了監(jiān)聽(tīng)方法,包括通知類消息和本地推送消息逼纸;

try {
  _jPush.addEventHandler(
    onOpenNotification: (Map<String, dynamic> message) async {
      // 點(diǎn)擊通知信息
      print('Flutter JPush 點(diǎn)擊通知消息:\n $message');
      setState(() {
        _result = 'Flutter JPush 點(diǎn)擊通知消息:\n $message';
        _message = message;
      });
    }
  );
} on PlatformException {
  platformVersion = 'Failed to get platform version.';
}
7. 清空通知欄

??????在用戶收到推送通知后若未點(diǎn)擊洋措,原生 Android 可通過(guò) NotificationManager.cancel() 清除通知,Flutter 也提供了清空通知欄方法杰刽;但小菜測(cè)試只可清空通知類推送消息菠发,本地發(fā)送的通知消息無(wú)法清空;

Future clearAllNotifications() async {
  await _channel.invokeMethod('clearAllNotifications');
}

_jPush.clearAllNotifications();

后期測(cè)試

1. 通知類消息

  1. 在極光后臺(tái)【發(fā)送通知】中按要求編輯目標(biāo)平臺(tái)贺嫂、通知標(biāo)題滓鸠、通知內(nèi)容、發(fā)送時(shí)間和選擇目標(biāo)等基本信息第喳;
  1. App 接收消息糜俗,并展示推送消息,各參數(shù)如下:

2. 透?jìng)黝愊?/h4>
  1. 在極光后臺(tái)【自定義消息】中按要求編輯目標(biāo)平臺(tái)曲饱、通知內(nèi)容悠抹、發(fā)送時(shí)間和選擇目標(biāo)等基本信息;其中 Registration ID 為測(cè)試時(shí)獲取的唯一標(biāo)識(shí)渔工;
  1. App 接收消息锌钮,不會(huì)展示推送消息,若需要可調(diào)用本地通知引矩;各參數(shù)如下:
onOpenNotification: (Map<String, dynamic> message) async {
  setState(() {
    _result = 'Flutter JPush 點(diǎn)擊通知消息:\n $message';
    _message = message;
    Map<String, dynamic> message2 = convert.jsonDecode(_message['extras']['cn.jpush.android.EXTRA']);
    if (message2['type'] == "1") {
      Toast.show('自定義通知消息!', context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
    }
  });
}

onReceiveMessage: (Map<String, dynamic> message) async {
  setState(() {
    _result = 'Flutter JPush 獲取透?jìng)黝悢?shù)據(jù):\n $message';
    _message = message;
    Map<String, dynamic> message2 = convert.jsonDecode(_message['message']);
    var fireDate = DateTime.fromMillisecondsSinceEpoch(DateTime.now().millisecondsSinceEpoch + 2000);
    var localNotification = LocalNotification(
        id: message2['id'],
        title: message2['title'],
        buildId: 1,
        content: message2['context'],
        fireTime: fireDate,
        extra: {"type": message2['type']});
    _jPush.sendLocalNotification(localNotification).then((res) {
      setState(() { _result = res; });
    });
  });
}

??????小菜認(rèn)為 Flutter 版的極光推送與 Android 原生版本的差異在于,大部分的配置有 App 端移到了極光后臺(tái)侵浸,包括圖標(biāo) icon旺韭,頁(yè)面處理,通知級(jí)別等掏觉;小菜僅嘗試了基本的消息推送及處理区端,還是有很多細(xì)節(jié)需要認(rèn)真學(xué)習(xí);如有問(wèn)題澳腹,請(qǐng)多多指導(dǎo)织盼!

來(lái)源: 阿策小和尚

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市酱塔,隨后出現(xiàn)的幾起案子沥邻,更是在濱河造成了極大的恐慌,老刑警劉巖羊娃,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唐全,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蕊玷,警方通過(guò)查閱死者的電腦和手機(jī)邮利,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門弥雹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人延届,你說(shuō)我怎么就攤上這事剪勿。” “怎么了方庭?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵厕吉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我二鳄,道長(zhǎng)赴涵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任订讼,我火速辦了婚禮髓窜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘欺殿。我一直安慰自己寄纵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布脖苏。 她就那樣靜靜地躺著程拭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棍潘。 梳的紋絲不亂的頭發(fā)上恃鞋,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音亦歉,去河邊找鬼恤浪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛肴楷,可吹牛的內(nèi)容都是我干的水由。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赛蔫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼砂客!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起呵恢,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鞠值,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瑰剃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體齿诉,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粤剧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歇竟。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抵恋,靈堂內(nèi)的尸體忽然破棺而出焕议,到底是詐尸還是另有隱情,我是刑警寧澤弧关,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布盅安,位于F島的核電站,受9級(jí)特大地震影響世囊,放射性物質(zhì)發(fā)生泄漏别瞭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一株憾、第九天 我趴在偏房一處隱蔽的房頂上張望蝙寨。 院中可真熱鬧,春花似錦嗤瞎、人聲如沸墙歪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)虹菲。三九已至,卻和暖如春掉瞳,著一層夾襖步出監(jiān)牢的瞬間毕源,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工陕习, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脑豹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓衡查,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親必盖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拌牲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • 所選依賴: 工具類:一、 package com.xxx.core.util.push.enums; /** 配置...
    Y_LY閱讀 1,884評(píng)論 0 2
  • 版本記錄 前言 ??現(xiàn)在很多APP都有推送功能歌粥,其中極光推送就是很多APP的首選塌忽。我們最近的幾個(gè)APP也是用的極光...
    刀客傳奇閱讀 8,391評(píng)論 0 8
  • 本文簡(jiǎn)介:本文前篇,可以幫助朋友們快速集成極光推送失驶。本文后篇土居,是我自己項(xiàng)目實(shí)踐的一些總結(jié)和心得,應(yīng)該對(duì)讀者們還是很...
    一只懂音樂(lè)的碼蟲閱讀 6,805評(píng)論 2 13
  • Flutter 在 2018 年可以說(shuō)非常的火爆,像素級(jí)的可控性比 ReactNative 要靈活很多擦耀,但是就生態(tài)...
    HuminiOS閱讀 17,372評(píng)論 7 13
  • 版本記錄 前言 ??前一篇已經(jīng)對(duì)極光推送產(chǎn)品架構(gòu)和服務(wù)進(jìn)行了介紹棉圈,這一篇?jiǎng)t只對(duì)ios客戶端的集成和使用等狀況進(jìn)行了...
    刀客傳奇閱讀 1,135評(píng)論 0 0