1.推送條幅和功能的變化
?我們首先來看看推送消息是如何在手機上顯示的
相對于iOS8,iOS9增加了輸入框按鈕,也就是為UIMutableUserNotificationAction增加了behavior屬性
相對于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
在文章開頭圖片上推送條幅下面還帶有按鈕,那么如何給推送消息添加按鈕呢会通,這個時候就需要用到通知分類(notification category)了口予。我們先看兩段代碼:
從上面兩個圖可以知道,不管是在哪個版本涕侈,創(chuàng)建通知分類(notificationcategory)的步驟都是一樣的沪停,首先會先創(chuàng)建notification action,然后再添加到通知分類中裳涛。一般情況下一個通知分類中會有一到兩個notification action木张,通過notificationaction來控制按鈕的一些屬性。一個通知分類最多可以有兩個按鈕端三,多余的會被忽略舷礼。
4.代理方法的變化
在用到推送服務的時候,如果不需要再推送條幅下面增加按鈕郊闯,那么我們平常就只需要使用下圖中的這個代理方法了
圖中兩個分別是本地推送和遠程推送的通知,本地推送可以通過nitification這個參數(shù)獲取userInfo和角標數(shù)团赁,遠程推送需要通過userInfo育拨,這個userInfo是由應用服務器的推送消息中的Payload來決定的,一些自定義數(shù)據(jù)可以在這里獲取欢摄。
而當我們需要為推送消息加一些點擊事件熬丧,比如直接通過點擊條幅中的回復按鈕來回復聊天消息,那么在點擊回復按鈕之后怀挠,就會執(zhí)行下圖中的代理方法析蝴。
如圖所示,分別是在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新增的變化除了之前所說的那些以外薯鼠,還有一個顯著的變化择诈,就是當推送消息到達時,即使你的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呢,請看下圖:
從上圖可以看出涂籽,在iOS 10中苹祟,要創(chuàng)建一個UNNotificationRequest對象,一個UNNotificationRequest需要一個UNMutableNotificationContent對象用來定義推送內(nèi)容和一個UNNotificaitonTrigger對象用來定義觸發(fā)條件评雌。
UNMutableNotificationContent對象除了定義body树枫、title等一般的屬性外,還可以添加附件對象UNNotificationAttachment,附件可以是圖片景东、音頻砂轻、視頻,系統(tǒng)在執(zhí)行request之前斤吐,會先驗證這些附件是否必須滿足下面的條件搔涝,如果不能滿足,request不會被執(zhí)行和措。
至于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