iOS推送服務的變更

1.推送條幅和功能的變化

?我們首先來看看推送消息是如何在手機上顯示的

iOS 8
iOS 9(1)
iOS 9(2)

相對于iOS8,iOS9增加了輸入框按鈕,也就是為UIMutableUserNotificationAction增加了behavior屬性

iOS 10(1)
iOS 10(2)

相對于iOS 9滞欠,iOS 10增加了subTitle和附件等

2.調用函數(shù)庫的變化

iOS8和iOS 9使用同一套函數(shù)方法,所有的相關類聲明在UIUserNotificationSettings.h和UILocalNotification.h文件中宗侦,iOS8和iOS9唯一的區(qū)別是iOS9支持輸入框按鈕臂容,也就是iOS 9的UIMutableUserNotificationAction類增加了behavior和parameters屬性。在iOS10中范删,新增了一個框架UserNotifications蕾域,提供了一套新的解決方案,所有的操作都是通過UNUserNotificationCenter執(zhí)行的。

3.注冊方式的變化

在這三個大的版本中旨巷,雖然注冊推送的方式在不斷的變化巨缘,到iOS 10甚至換了一個框架,但是推送服務的核心理念一直沒變采呐,在這里若锁,我們可以做一個簡單的劃分,把注冊推送服務粗略的分為下列幾步:

1.創(chuàng)建通知分類(notificationcategory)2.創(chuàng)建通知設置(notificationsetting)3.注冊到app

在iOS8和iOS 9的版本中懈万,注冊推送服務


在iOS 10的版本中拴清,注冊推送服務

在文章開頭圖片上推送條幅下面還帶有按鈕,那么如何給推送消息添加按鈕呢会通,這個時候就需要用到通知分類(notification category)了口予。我們先看兩段代碼:

? ? ? ? 在iOS 8和iOS 9中創(chuàng)建category
在iOS 10中創(chuàng)建category

從上面兩個圖可以知道,不管是在哪個版本涕侈,創(chuàng)建通知分類(notificationcategory)的步驟都是一樣的沪停,首先會先創(chuàng)建notification action,然后再添加到通知分類中裳涛。一般情況下一個通知分類中會有一到兩個notification action木张,通過notificationaction來控制按鈕的一些屬性。一個通知分類最多可以有兩個按鈕端三,多余的會被忽略舷礼。

4.代理方法的變化

在用到推送服務的時候,如果不需要再推送條幅下面增加按鈕郊闯,那么我們平常就只需要使用下圖中的這個代理方法了

在iOS8和iOS 9中當我們點擊推送的條幅(注意不是條幅下面的按鈕)或者收到推送消息時app處于前臺狀態(tài)妻献,就會調用上圖中的回調方法

圖中兩個分別是本地推送和遠程推送的通知,本地推送可以通過nitification這個參數(shù)獲取userInfo和角標數(shù)团赁,遠程推送需要通過userInfo育拨,這個userInfo是由應用服務器的推送消息中的Payload來決定的,一些自定義數(shù)據(jù)可以在這里獲取欢摄。

而當我們需要為推送消息加一些點擊事件熬丧,比如直接通過點擊條幅中的回復按鈕來回復聊天消息,那么在點擊回復按鈕之后怀挠,就會執(zhí)行下圖中的代理方法析蝴。

iOS 8中點擊條幅按鈕會調用的代理方法
iOS 9中點擊條幅按鈕會調用的代理方法

如圖所示,分別是在iOS 8和iOS 9中的本地推送和遠程推送的代理方法绿淋,當我們點擊推送條幅中的按鈕時嫌变,會調用上圖中的代理方法,iOS 8和iOS 9使用的是同一套函數(shù)庫躬它,為什么我們還需要區(qū)分開來寫呢。因為這個代理方法在iOS8和iOS 9中有一些區(qū)別东涡,我們通過對比可以知道冯吓,iOS9中的方法比iOS 8多了一個參數(shù)responseInfo倘待,那么這個參數(shù)有什么作用呢?文章開頭我們說iOS9比iOS8多了一個輸入框按鈕组贺,我們可以通過這個responseInfo參數(shù)獲取用戶在輸入框中輸入的字符串凸舵,通過responseInfo[UIUserNotificationActionResponseTypedTextKey]來獲取。

在處理點擊事件時失尖,我們?nèi)绾沃傈c擊的按鈕是哪個呢啊奄?通過對比參數(shù)identifier和定義notification action時設置的identifier,可以知道是哪個按鈕掀潮。

接下來菇夸,我們看看iOS 10是如何處理這些事件的。

在iOS 10中仪吧, 一般情況下庄新,我們只需要處理這兩個代理方法就可以了。

iOS 10新增的變化除了之前所說的那些以外薯鼠,還有一個顯著的變化择诈,就是當推送消息到達時,即使你的app處于前臺出皇,仍然可以顯示推送條幅羞芍。而在iOS 10之前,app必須是在后臺狀態(tài)才能顯示郊艘。當然荷科,即使是iOS 10,你需要達到這種效果暇仲,還需要一些配置步做,你需要實現(xiàn)上圖中的第一個代理方法,并且調用completionHandler()奈附,這樣子就可以在前臺收到推送條幅了全度。另外,上圖中的第一個代理只有在app處于前臺的時候才會調用斥滤。當app處于前臺時将鸵,通過completionHandler()這個block來控制推送消息是以什么樣的形式通知用戶,一般情況下只需要像圖中那樣調用就可以了佑颇。

至于上圖中的第二個代理顶掉,則是在點擊條幅和條幅中的按鈕時會被調用,這一點需要注意一下挑胸。同樣的痒筒,我們要區(qū)分是哪個點擊事件,和在iOS 8、iOS 9中一樣簿透,也是根據(jù)action的identifier移袍,只不過iOS 10的這個屬性沒有通過參數(shù)直接暴露出來,它被封裝在參數(shù)response中老充,可以通過response.actionIdentifier獲取葡盗,當我們點擊條幅(不是按鈕)時,response.actionIdentifier返回的是com.apple.UNNotificationDefaultActionIdentifier啡浊。

5.iOS 10的UNNotificationRequest

在iOS 10中觅够,如果想要創(chuàng)建一個本地推送,那就必須創(chuàng)建一個UNNotificationRequest對象巷嚣,然后通過UNUserNotificationCenter發(fā)出喘先。那么如何創(chuàng)建UNNotificationRequest呢,請看下圖:

UNNotificationRequest的創(chuàng)建

從上圖可以看出涂籽,在iOS 10中苹祟,要創(chuàng)建一個UNNotificationRequest對象,一個UNNotificationRequest需要一個UNMutableNotificationContent對象用來定義推送內(nèi)容和一個UNNotificaitonTrigger對象用來定義觸發(fā)條件评雌。

UNMutableNotificationContent對象除了定義body树枫、title等一般的屬性外,還可以添加附件對象UNNotificationAttachment,附件可以是圖片景东、音頻砂轻、視頻,系統(tǒng)在執(zhí)行request之前斤吐,會先驗證這些附件是否必須滿足下面的條件搔涝,如果不能滿足,request不會被執(zhí)行和措。

附件UNNotificationAttachment需要滿足相應的條件

至于UNNotificaitonTrigger對象庄呈,我們一般使用它的子類,它有四種子類派阱,分別是:

UNTimeIntervalNotificationTrigger定義距離當前時間多少秒之后觸發(fā)本地推送

UNCalendarIntervalNotificationTrigger定義哪個時間點觸發(fā)本地推送

UNLocationIntervalNotificationTrigger定義進入或離開一個經(jīng)緯度范圍時觸發(fā)本地推送

UNPushIntervalNotificationTrigger當推送信息來自APNs時诬留,request的觸發(fā)器是這個類型

iOS 10的本地和遠程推送的代理方法都是執(zhí)行的同樣的回調方法,所以需要通過判斷response參數(shù)的notification.request.trigger的類型是否是UNPushIntervalNotificationTrigger贫母,來判斷是否是遠程推送文兑。

6.遠程推送的附件添加

本地推送添加附件非常簡單,只需要給UNNotificationRequest對象的content屬性添加一個UNNotificationAttachment附件對象腺劣。但是在進行遠程推送時绿贞,并不需要我們來創(chuàng)建UNNotificationRequest對象,這個時候我們就需要借助于UNNotificationServiceExtension對象橘原。

UNNotificationServiceExtension有兩個方法籍铁,分別是:

在第一個方法中涡上,我們可以根據(jù)request參數(shù)重新定義一個UMMutableNotificationContent對象,這樣我們就能加上一個附件了拒名。比如我們可以讓推送服務器推送一個圖片url過來吓懈,然后在這個方法里面下載圖片,將圖片作為附件加入到UMMutableNotificationContent對象中靡狞,最后調用contentHandler這個block提交修改的內(nèi)容。

執(zhí)行第一個方法時隔嫡,會有一定的時間限制甸怕,如果沒有及時執(zhí)行完方法,系統(tǒng)會在時間到期之前調用第二個方法腮恩,給你最后一次提交修改的機會梢杭。如果時間到期了,你還是沒有提交你修改的內(nèi)容(就是沒有執(zhí)行contentHandler這個block)秸滴,系統(tǒng)會使用原來的那個內(nèi)容武契。

使用這個UNNotificationServiceExtension對象時,我們不能直接使用它荡含,需要自己創(chuàng)建一個它的子類咒唆,并重寫它的這兩個方法。具體如何創(chuàng)建以及使用可以參考http://www.reibang.com/p/f77d070a8812释液。

最后推薦一個全释,好用的服務端推送工具NWPusher?https://github.com/noodlewerk/NWPusher,它是使用oc編寫的误债,可以在mac和iphone兩個端運行浸船,如果你有興趣的話,建議讀一讀源碼寝蹈,可以幫助你了解整個推送服務的運行機制

參考鏈接:

http://www.reibang.com/p/ff14939b6639

http://www.reibang.com/p/f77d070a8812

demo:https://github.com/ZZZZou/WPushDemo

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末李命,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子箫老,更是在濱河造成了極大的恐慌封字,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件槽惫,死亡現(xiàn)場離奇詭異周叮,居然都是意外死亡,警方通過查閱死者的電腦和手機界斜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門仿耽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人各薇,你說我怎么就攤上這事项贺【桑” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵开缎,是天一觀的道長棕叫。 經(jīng)常有香客問我,道長奕删,這世上最難降的妖魔是什么俺泣? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮完残,結果婚禮上伏钠,老公的妹妹穿的比我還像新娘。我一直安慰自己谨设,他們只是感情好熟掂,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扎拣,像睡著了一般赴肚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上二蓝,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天誉券,我揣著相機與錄音,去河邊找鬼侣夷。 笑死横朋,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的百拓。 我是一名探鬼主播琴锭,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼衙传!你這毒婦竟也來了决帖?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蓖捶,失蹤者是張志新(化名)和其女友劉穎地回,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俊鱼,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡刻像,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了并闲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片细睡。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖帝火,靈堂內(nèi)的尸體忽然破棺而出溜徙,到底是詐尸還是另有隱情湃缎,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布蠢壹,位于F島的核電站嗓违,受9級特大地震影響,放射性物質發(fā)生泄漏图贸。R本人自食惡果不足惜蹂季,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疏日。 院中可真熱鬧乏盐,春花似錦、人聲如沸制恍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽净神。三九已至,卻和暖如春溉委,著一層夾襖步出監(jiān)牢的瞬間鹃唯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工瓣喊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坡慌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓藻三,卻偏偏與公主長得像洪橘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子棵帽,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

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

  • WWDC session - Notifications 學習總結,如有不妥之處逾苫,望請指正???? pusher工具[...
    kurt_wang閱讀 5,009評論 12 28
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫卿城、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,107評論 4 62
  • 書名想必是來源于這一句“一沙一世界铅搓,一葉一如來”瑟押。有著異曲同工之妙的是,書所講的這個人和她所代表的一個節(jié)目狸吞,所傳承...
    violetlost閱讀 498評論 0 0
  • 又發(fā)現(xiàn)了個休閑好去處勉耀,浦東圖書館指煎,網(wǎng)絡不太給力,食堂和圖書館規(guī)模都挺不錯的便斥,而且感覺自習座位也少了點至壤,想搶座不容易...
    阿元閱讀 193評論 0 0
  • 我們總會走向不同的遠方,愛情是一道不可及的光枢纠。
    XMHuang閱讀 141評論 0 0