本文會涉及iOS10中的UserNotifications框架,關(guān)于UN框架的介紹可以看這里iOS 7 8 9 10本地和推送通知踩坑之旅,適配iOS10之自定義推送通知
日常的推送開發(fā)中我們接觸到最多的就是系統(tǒng)默認(rèn)的Notification's UI了,那么除了使用系統(tǒng)默認(rèn)的UI樣式,能不能自定義推送的UI呢?
我們可以借助Notifications Content Extension
這個擴(kuò)展進(jìn)行非常方便的UI自定義。
如下圖所示:
但需要注意的是,自定義UI不能響應(yīng)點擊事件。
創(chuàng)建 Notifications Content Extension
創(chuàng)建好的
Notifications Content Extension
包含四個文件,分別是:
-
NotificationViewController
頭文件與m文件 MainInterface.storyboard
Info.plist
其中
NotificationViewController
繼承自UIViewController
,且實現(xiàn)了UNNotificationContentExtension
協(xié)議。
那么當(dāng)一個通知發(fā)出之后,系統(tǒng)是如何得知這個通知的UI是通過Notifications Content Extension
設(shè)置的呢。
這里就需要在Info.plist
中配置UNNotificationExtensionCategory
的值,如下圖:
UNNotificationExtensionCategory
的值為payload中設(shè)置的category
,且需要在主工程中進(jìn)行注冊,關(guān)于如何注冊上文中已經(jīng)提過。payload格式示例如下:
{"aps":{"alert":"hahhahah","badge":1,"sound":"default", "category" : "iOS10-category-identifier"}}
如果不想用sb布局,那么你就可以把NSExtensionMainStoryboard
這個key刪掉,使用NSExtensionPrincipalClass
配置你的初始化控制器。
注意
NSExtensionPrincipalClass
和NSExtensionMainStoryboard
必須存在一個。
UNNotificationContentExtension協(xié)議
- 方法1、獲取通知對象
- (void)didReceiveNotification:(UNNotification *)notification;
在此方法中,可以獲取到UNNotification
,然后對自定義UI做一些賦值與調(diào)整。例如獲取UNNotification
對象中的媒體附件:
// 獲取到通知content
UNNotificationContent *content = notification.request.content;
// 獲取到通知的媒體附件
UNNotificationAttachment *attachment = content.attachments.firstObject;
if([attachment.URL startAccessingSecurityScopedResource]){
UIImage *image = [UIImage imageWithContentsOfFile:attachment.URL.path];
[attachment.URL stopAccessingSecurityScopedResource];
}
- 方法2、攔截通知的action(optional)
- (void)didReceiveNotificationResponse:(UNNotificationResponse *)response completionHandler:(void (^)(UNNotificationContentExtensionResponseOption option))completion;
當(dāng)點擊了通知的action之后,會執(zhí)行該方法,在該方法中可以根據(jù)具體action的identifier針對不同的action作出響應(yīng)。例如,更新UI,某些操作的服務(wù)器上報等等。
注意執(zhí)行completion()
一些需要注意的問題
- 1、關(guān)于控制器內(nèi)部調(diào)整view的size,導(dǎo)致自定義視圖大小跳動的問題。
?效果如下所示:
由上圖可以看到,自定義的視圖由大變小,有一個動畫效果。導(dǎo)致這個跳動的原因是因為,當(dāng)開始展示通知視圖的時候,系統(tǒng)并不知道自定義的視圖有多大。
那么解決這個視圖大小跳動的問題,我們就可以使用UNNotificationExtensionInitialContentSizeRatio
這個key,來事先指定這個視圖的高寬比。這樣提前告知系統(tǒng)視圖大概有多大,就不會有跳動效果了。
UNNotificationExtensionInitialContentSizeRatio值的范圍大小為從0到1。
- 2、在最初展示的圖
自定義ui.png
中可以看到整個通知的UI被分成了四部分,在某些情況我們并不需要顯示系統(tǒng)默認(rèn)的通知視圖。
而隱藏系統(tǒng)默認(rèn)的通知視圖也非常簡單,使用UNNotificationExtensionDefaultContentHidden
key,設(shè)置值為true即可。