Flutter 集成《極光推送》點(diǎn)擊消息解決方案

最近一個(gè)項(xiàng)目采用Flutter來(lái)開(kāi)發(fā)哮针,作為一個(gè)OC原生程序猿盆赤,也是心里沒(méi)底,摸石頭過(guò)河客们。結(jié)合各方文檔趟了一把坑,把實(shí)際項(xiàng)目中遇到的坑記錄一下材诽。

附上極光的sdk地址:https://github.com/jpush/jpush-flutter-plugin

集成方法上面也有底挫,該配證書(shū)配證書(shū),該導(dǎo)依賴導(dǎo)依賴脸侥,就不贅述了建邓。說(shuō)說(shuō)遇到的坑吧。

補(bǔ)充一句睁枕,我在寫(xiě)文章的時(shí)候 JPush 是 0.3.0.


一官边、接收推送

未購(gòu)買(mǎi)付費(fèi)服務(wù):由于系統(tǒng)機(jī)制不一樣,當(dāng)APP被殺死情況下外遇,Android收不到注簿,但是Android啟動(dòng)APP之后,能收到延遲的推送跳仿。Android退出不殺進(jìn)程诡渴,依然能收到推送。IOS任何時(shí)候均能收到推送菲语。

大概原理就是妄辩,Android是通過(guò)極光的通信接受推送惑灵,需要APP進(jìn)程存在才能收到推送。IOS是通過(guò)apns(和原生一樣)眼耀。

購(gòu)買(mǎi)付費(fèi)服務(wù)(未作真實(shí)測(cè)試英支,僅供參考):Android能通過(guò) 小米、華為等自家平臺(tái)完成推送哮伟。



二干花、點(diǎn)擊推送

重點(diǎn)內(nèi)容來(lái)了,想要實(shí)現(xiàn)效果是澈吨,點(diǎn)擊推送消息跳轉(zhuǎn)到一個(gè)指定的頁(yè)面把敢。

jpush.applyPushAuthority(????????
????new?NotificationSettingsIOS(sound:?true,?alert:?true,?badge:?true));???
????try?{??????
????????jpush.addEventHandler(????????
????????//?接收通知回調(diào)方法。????????
????????onReceiveNotification:?(Map<String,?dynamic>?message)?async?{??????????
????????},???????
?????????//?點(diǎn)擊通知回調(diào)方法谅辣。????????
????????onOpenNotification:?(Map<String,?dynamic>?message)?async?{??????????
?????????},???????
?????????//?接收自定義消息回調(diào)方法修赞。????????
????????onReceiveMessage:?(Map<String,?dynamic>?message)?async?{?????????
? ? ? ? ?},???);????
????}?on?PlatformException?{??????
????????debugPrint('Failed?to?get?platform?version.');????
????}?
);

兩種情況:

1 APP活躍,收到消息桑阶,點(diǎn)擊正常執(zhí)行柏副。校驗(yàn)登錄情況,是否允許push到指定頁(yè)面蚣录。

void?jump()?{? ? ? ? ? ?
????Navigator.push(
????????context,????????????
????????new?MaterialPageRoute(builder:?(context)?=>?NotificationsPage())
????);? ?
}


2 APP被殺死割择,IOS能收到,點(diǎn)擊消息不執(zhí)行萎河。Android由于收不到消息荔泳,不存在這個(gè)情況。如果是付費(fèi)服務(wù)虐杯,收到推送消息玛歌,理論上能執(zhí)行,沒(méi)有實(shí)際測(cè)試過(guò)擎椰。

現(xiàn)在問(wèn)題就只有一個(gè)支子,IOS通過(guò)消息啟動(dòng)APP,怎么能執(zhí)行跳轉(zhuǎn)达舒。最后查閱了文檔值朋,看到了一個(gè)方法。

///
///?iOS?Only??
///?點(diǎn)擊推送啟動(dòng)應(yīng)用的時(shí)候原生會(huì)將該?notification?緩存起來(lái)巩搏,該方法用于獲取緩存?notification?
///?注意:notification?可能是?remoteNotification?和?localNotification昨登,兩種推送字段不一樣。?
///?如果不是通過(guò)點(diǎn)擊推送啟動(dòng)應(yīng)用贯底,比如點(diǎn)擊應(yīng)用?icon?直接啟動(dòng)應(yīng)用篙骡,notification?會(huì)返回?@{}。?
///?@param?{Function}?callback?=?(Object)?=>?{}??
///??
Future<Map<dynamic,?dynamic>>?getLaunchAppNotification()?async?{????
????print(flutter_log?+?"getLaunchAppNotification:");????
????final?Map<dynamic,?dynamic>?result?= await?_channel.invokeMethod('getLaunchAppNotification');
? ? return?result;??
}

于是就有了一個(gè)思路。

APP啟動(dòng)的時(shí)候創(chuàng)建一個(gè)單例糯俗,單例需要緩存主視圖的context,以便于push時(shí)候使用尿褪,比如 登錄后的home頁(yè)面的context,點(diǎn)擊消息時(shí)得湘,由home頁(yè)面push到Tag頁(yè)面杖玲。同時(shí)需要做個(gè)標(biāo)記,記錄點(diǎn)擊事件淘正,是否已經(jīng)被執(zhí)行了摆马。而點(diǎn)擊通知是需要將標(biāo)記狀態(tài)做個(gè)更改。如果是IOS消息啟動(dòng)鸿吆,直接執(zhí)行push囤采。

class?TaskNotifcation?{
? ? int?read?=?0;??
????BuildContext?_context;
? ??
? ? ///? ? ?實(shí)現(xiàn)單例
? ? ///? ? ?.........
? ? ///
? ??
? ? // 點(diǎn)擊時(shí)使用
????void checkNotifcation()?{???
????????if?(read?==?null?||?read?==?0)?{??????
????????????read?=?1;????
????????}?else?{??????
????????????read++;???
? ? ????}???
? ? ????if?(Platform.isIOS)?{?????
?????????????jpush.setBadge(0);???
? ? ????}????
????????jump();?
????}
? ??
? ? // 主視圖加載完成時(shí)候,賦值獲取context
? ??void?runTask(BuildContext?context)?async?{????
????????if?(_context?==?null)?{??????
????????????_context?=?context;?????
? ? ? ? ? ? if?(Platform.isIOS)?{????????
????????????????final?map?=?await?jpush.getLaunchAppNotification();????????
????????????????if?(map?!=?null?&&?map.isNotEmpty)?{??????????
????????????????????read?=?1;????????
????????????????}?????
? ? ? ? ? ? }?????
? ? ? ? ? ? jump();????
????????}??
????}

? ? void jump(){
? ? ? ? ? ? // TODO
? ? }
}

jump也要做相應(yīng)的驗(yàn)證惩淳,同時(shí)把狀態(tài)復(fù)位蕉毯。延遲是為了動(dòng)畫(huà)執(zhí)行,避免一閃而過(guò)(其實(shí)沒(méi)什么用)思犁。

void?jump()?{????
????if?(_context?!=?null?&&?read?>?0)?{??????
????????read?=?0;??????
????????Future.delayed(Duration(milliseconds:?300),?()?{????????
????????????Navigator.push(_context,????????????
? ? ? ? ????new?MaterialPageRoute(builder:?(context)?=>?NotificationsPage()));??????
????????});????
????}??
}?

main.dart 修改點(diǎn)擊事件代虾。TaskNotifcation 一定要是單例,單例的寫(xiě)法不用我教吧激蹲。( 這個(gè)延遲有用嗎棉磨??)

onOpenNotification:?(Map<String,?dynamic>?message)?async?{? ? ? ? ? ? ? ? ? ?????Future.delayed(Duration(seconds:?1),?()?{????????????
????????TaskNotifcation.instance.checkNotifcation();??????????
? ? ?});????????
},

在home.dart 里学辱,頁(yè)面加載完成是賦值context

@override??
Widget?build(BuildContext?context)?{?????????
????TaskNotifcation.instance.runTask(context);? ? //傳入context乘瓤,并校驗(yàn)啟動(dòng)來(lái)源
????return?Scaffold(
? ? ? ? /// widget 視圖
????);
}

到這里推送點(diǎn)擊基本就OK了,點(diǎn)擊事件都交由TaskNotifcation去管理了策泣,可以在里面加入別的業(yè)務(wù)邏輯凡橱,或更多判斷辆沦。但由于他是單例炸庞,存下來(lái)的context不會(huì)被釋放缴阎,所以還要在home.dart里加上:

@override??void?dispose()?{????
????//?TODO:?implement?dispose????
????super.dispose();????
????TaskNotifcation.instance.clearContext();?
}

class TaskNotifcation{
? ? ?/// 其他代碼
? ? ?///......??
? ? ?/// jump(){};

? ??void?clearContext(){????
????????if?(_context?!=?null)?{??????
????????????_context?=?null;????
????????}??
????}
}

我這里只提供思路和部分代碼汽抚,具體怎么實(shí)現(xiàn)需要結(jié)合實(shí)際項(xiàng)目情況做調(diào)整苟翻,相信也有比我更好的方法衰倦。第一次寫(xiě)文檔花鹅,不知道表訴清楚沒(méi)有发侵,歡迎留言交掏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市刃鳄,隨后出現(xiàn)的幾起案子盅弛,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挪鹏,死亡現(xiàn)場(chǎng)離奇詭異见秽,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)讨盒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)解取,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人返顺,你說(shuō)我怎么就攤上這事禀苦。” “怎么了遂鹊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵振乏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我秉扑,道長(zhǎng)慧邮,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任邻储,我火速辦了婚禮赋咽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吨娜。我一直安慰自己脓匿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布宦赠。 她就那樣靜靜地躺著陪毡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勾扭。 梳的紋絲不亂的頭發(fā)上毡琉,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音妙色,去河邊找鬼桅滋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛身辨,可吹牛的內(nèi)容都是我干的丐谋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼煌珊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼号俐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起定庵,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吏饿,失蹤者是張志新(化名)和其女友劉穎踪危,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體猪落,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贞远,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笨忌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兴革。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蜜唾,靈堂內(nèi)的尸體忽然破棺而出杂曲,到底是詐尸還是另有隱情,我是刑警寧澤袁余,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布擎勘,位于F島的核電站,受9級(jí)特大地震影響颖榜,放射性物質(zhì)發(fā)生泄漏棚饵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一掩完、第九天 我趴在偏房一處隱蔽的房頂上張望噪漾。 院中可真熱鬧,春花似錦且蓬、人聲如沸欣硼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诈胜。三九已至,卻和暖如春冯事,著一層夾襖步出監(jiān)牢的瞬間焦匈,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工昵仅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缓熟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓摔笤,卻偏偏與公主長(zhǎng)得像够滑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子籍茧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354