一:簡(jiǎn)單描述
iOS 10 新增了一個(gè)框架 UserNotifications.framework 辅柴,即“用戶通知框架”只锻,該框架允許開發(fā)者對(duì)通知進(jìn)行自定義,推送 "Push" 只是「通知」觸發(fā)的一種方式粹胯,而「通知」是操作系統(tǒng)層面的一種UI展示棠笑。蘋果官方文檔中 Notification 分為兩類: - Remote (遠(yuǎn)程销部,即 Push 方式) - Local (本地缴饭,通知由本地事件觸發(fā)),本文所述建立在遠(yuǎn)程推送基礎(chǔ)上介紹自定義通知(Object-C版).
二:用 UserNotifications Framework 實(shí)現(xiàn)通知(遠(yuǎn)程推送)
1. 在 Xcode 中啟用推送通知
要使用 UserNotifications Framework 需在 Xcode 項(xiàng)目中開啟推送通知: Project Target --> Capabilities --> Push Notifications
2.導(dǎo)入框架#import<UserNotifications/UserNotifications.h>
3.注冊(cè)推送
同樣的在didFinishLaunchingWithOptions方法中注冊(cè),ios 10及之下系統(tǒng)可以有不同的注冊(cè)方式殿如,相同的效果就是用戶第一次打開app會(huì)彈出通知授權(quán)框,若采用ios10注冊(cè)方式贡珊,則應(yīng)遵守<UNUserNotificationCenterDelegate>代理協(xié)議
到這一步最爬,第一次運(yùn)行app會(huì)彈出通知授權(quán)框
不過即使現(xiàn)在給用戶推送消息,用戶依舊不會(huì)接收到推送门岔,原因是沒有向apple注冊(cè)deviceToken,應(yīng)該在appDelegate中注冊(cè)deviceToken
關(guān)于是否注冊(cè)deviceToken成功可在代理方法中判斷:
到這一步爱致,依舊不能接收到推送消息,因?yàn)闆]有配置推送證書,可參考環(huán)信提供資料推送證書配置
4.推送消息
證書配置完成后可以進(jìn)行推送操作了,想要模擬apple給用戶推送消息寒随,有一個(gè)很實(shí)用的工具pusher,下載pusher,該工具可以運(yùn)行在mac或者iphone上就可以給設(shè)備推送消息糠悯,是不是很方便
這里針對(duì)pusher界面做點(diǎn)說(shuō)明,com.boru.nibook為推送證書所歸屬的蘋果開發(fā)者證書在該項(xiàng)目所配置的appID,即項(xiàng)目的bundle id,一長(zhǎng)串的64位字符串為推送目標(biāo)設(shè)備的deviceToken,最下面的內(nèi)容為推送內(nèi)容,關(guān)于推送內(nèi)容具體字段可參考apple官方文檔推送內(nèi)容字段
我們先在pusher輸入內(nèi)容:
然后點(diǎn)擊push,會(huì)在設(shè)備上彈出
5.ServiceExtension
假如想遠(yuǎn)程推送圖片給用戶妻往,可以使用ios10推出的ServiceExtension,它可以在消息到達(dá)用戶設(shè)備還未展示彈出框前對(duì)推送消息進(jìn)行修改互艾,然后在顯示出來(lái),不過使用它需要一定的條件? 1:遠(yuǎn)程通知展示alert給用戶? 2:遠(yuǎn)程通知aps json字段中必須包含mutable-content鍵,并且值為1,下面介紹如何創(chuàng)建ServiceExtension
創(chuàng)建完成后會(huì)發(fā)現(xiàn)項(xiàng)目里多了個(gè)文件夾,這是我取的名字
在ServiceExtension里的主要函數(shù)方法(可在推送消息到達(dá)用戶設(shè)備沒有顯示出來(lái)前對(duì)消息進(jìn)行修改讯泣,修改后再顯示):
開發(fā)者可在該方法中給推送消息加上圖片纫普,視頻等附件,不得不提一個(gè)UNNotificationAttachment好渠,UNNotificationAttachment支持圖片昨稼,音頻,視頻拳锚,系統(tǒng)會(huì)自動(dòng)提供一套可自定義化的UI假栓,專門針對(duì)這3種內(nèi)容.本文只做給推送消息加上圖片,設(shè)置推送字段:{"aps":
? ? ? ? ? ? ? ? ? ? ?{"alert":
? ? ? ? ? ? ? ? ? ? ? ? ? {"title":"hello",
? ? ? ? ? ? ? ? ? ? ? ? ? "subtitle":"子標(biāo)題",
? ? ? ? ? ? ? ? ? ? ? ? ?"body":"it is a beautiful day"},
? ? ? ? ? ? ? ? ? ? ? ? ?"badge":1,
? ? ? ? ? ? ? ? ? ? ? ? "sound":"default",
? ? ? ? ? ? ? ? ? ? ? ?"mutable-content":1,
? ? ? ? ? ? ? ? ? ? ? ?"image":"https://picjumbo.imgix.net/HNCK8461.jpg?q=40&w=200&sharp=30",
? ? ? ? ? ? ? ? ? ? ? ? "category":"helloIdentifier"
? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? }
可在didReceiveNotificationRequest方法中獲取到aps中的"image"字段(aps中不一定非要image字段霍掺,命名自己取匾荆,只要能取出圖片url字段即可),在該方法中拿到圖片下載完成后重新顯示推送消息杆烁,效果如下:
6.NotificationContentExtention
要想創(chuàng)建一個(gè)自定義的用戶界面牙丽,需要用到Notification content extension,接下來(lái)我們就來(lái)說(shuō)說(shuō)如何自定義界面:
一個(gè)推送分四段,
開發(fā)者可以在custom content區(qū)域進(jìn)行自定義界面,下面介紹如何創(chuàng)建Notification content extension,和創(chuàng)建serviceExtension類似
創(chuàng)建完成后,在項(xiàng)目中又多了一個(gè)文件夾
在MainInterface.storyboard中對(duì)通知自定義區(qū)域進(jìn)行界面描述,info.plist文件三個(gè)重要的參數(shù)连躏,第一個(gè)就是不使用系統(tǒng)默認(rèn)的界面剩岳,可以省略贞滨,默認(rèn)為NO入热。第二個(gè)參數(shù)指明響應(yīng)的category,這就是簽名創(chuàng)建cateogry時(shí)的那個(gè)categoryIdentifier了晓铆, 可以指定很多個(gè)(如果該參數(shù)沒有設(shè)置對(duì)勺良,則不會(huì)顯示自定義區(qū)域的界面,創(chuàng)建cateogry文章末尾講訴),第三個(gè)參數(shù)content size ratio,這個(gè)屬性定義了寬和高的比例骄噪。這個(gè)比例不能很好的適配通知所要展示的內(nèi)容尚困,因?yàn)閮?nèi)容可多可少,開發(fā)者最好的做法是在通知顯示前計(jì)算好需要展示內(nèi)容的尺寸链蕊,這樣界面就會(huì)更美觀事甜。
針對(duì)每個(gè)參數(shù)進(jìn)行不同的設(shè)置區(qū)分效果,
在自定義的NotificationContentExtention中谬泌,控制器會(huì)走didReceiveNotification方法來(lái)跟新自定義界面UI,有趣的是在該方法中設(shè)置imageView,即使給imageView設(shè)置圖片也無(wú)法正常顯示出來(lái),不過可以用以下方法來(lái)給imageView設(shè)置圖片逻谦,
到這里自定義通知界面就完成了
7.UNUserNotificationCenterDelegate
講完了自定義通知界面掌实,接下來(lái)介紹如何處理用戶行為,兩個(gè)代理方法:
第一個(gè)方法為app處在前臺(tái)時(shí)收到推送消息調(diào)用邦马,第二個(gè)方法嚴(yán)格來(lái)說(shuō)只要用戶點(diǎn)擊消息推送彈出框就會(huì)調(diào)用贱鼻。有趣的是另外兩個(gè)方法也有相似的功能
雖然都有相似功能,不過還是有差別滋将,如果以上四個(gè)方法全部打開會(huì)出現(xiàn)什么情況呢邻悬,上面兩個(gè)方法會(huì)“覆蓋”下面兩個(gè)方法,即走上面的方法随闽。不過我建議使用上面的兩個(gè)方法,因?yàn)樵赿idReceiveNotificationResponse中可以拿到對(duì)應(yīng)的actionWithIdentifier來(lái)做對(duì)應(yīng)的操作父丰,下面我們先來(lái)注冊(cè)一個(gè)UNNotificationCategory(在didFinishLaunchingWithOptions中進(jìn)行),一個(gè)UNNotificationCategory可以包含若干個(gè)UNNotificationAction掘宪,其中UNNotificationAction可分為UNNotificationActionOptionAuthenticationRequired,UNNotificationActionOptionDestructive,UNNotificationActionOptionForeground幾種類型.
值得注意的是如果注冊(cè)category的categoryIdentifier如果和上面介紹的Notification content extension中plist中的UNNotificationExtensionCategory字段不相同础米,則一定不會(huì)顯示辛辛苦苦設(shè)置的通知界面自定義區(qū)域.設(shè)置后看下效果:
點(diǎn)擊第一項(xiàng)"輸入你的信息"會(huì)彈出文本編輯
點(diǎn)擊第二項(xiàng)"忽略",系統(tǒng)則會(huì)將該條通知從界面上清除掉.點(diǎn)擊第三項(xiàng)則會(huì)進(jìn)入前臺(tái)