本文會(huì)涉及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這個(gè)擴(kuò)展進(jìn)行非常方便的UI自定義。
如下圖所示:

但需要注意的是,自定義UI不能響應(yīng)點(diǎn)擊事件。
創(chuàng)建 Notifications Content Extension

創(chuàng)建好的
Notifications Content Extension包含四個(gè)文件,分別是:
-
NotificationViewController頭文件與m文件 MainInterface.storyboardInfo.plist

其中
NotificationViewController繼承自UIViewController,且實(shí)現(xiàn)了UNNotificationContentExtension協(xié)議。
那么當(dāng)一個(gè)通知發(fā)出之后,系統(tǒng)是如何得知這個(gè)通知的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這個(gè)key刪掉,使用NSExtensionPrincipalClass配置你的初始化控制器。
注意
NSExtensionPrincipalClass和NSExtensionMainStoryboard必須存在一個(gè)。
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)點(diǎn)擊了通知的action之后,會(huì)執(zhí)行該方法,在該方法中可以根據(jù)具體action的identifier針對不同的action作出響應(yīng)。例如,更新UI,某些操作的服務(wù)器上報(bào)等等。

注意執(zhí)行completion()
一些需要注意的問題
- 1、關(guān)于控制器內(nèi)部調(diào)整view的size,導(dǎo)致自定義視圖大小跳動(dòng)的問題。
?效果如下所示:

由上圖可以看到,自定義的視圖由大變小,有一個(gè)動(dòng)畫效果。導(dǎo)致這個(gè)跳動(dòng)的原因是因?yàn)?,?dāng)開始展示通知視圖的時(shí)候,系統(tǒng)并不知道自定義的視圖有多大。
那么解決這個(gè)視圖大小跳動(dòng)的問題,我們就可以使用UNNotificationExtensionInitialContentSizeRatio這個(gè)key,來事先指定這個(gè)視圖的高寬比。這樣提前告知系統(tǒng)視圖大概有多大,就不會(huì)有跳動(dòng)效果了。
UNNotificationExtensionInitialContentSizeRatio值的范圍大小為從0到1。
- 2、在最初展示的圖
自定義ui.png中可以看到整個(gè)通知的UI被分成了四部分,在某些情況我們并不需要顯示系統(tǒng)默認(rèn)的通知視圖。
而隱藏系統(tǒng)默認(rèn)的通知視圖也非常簡單,使用UNNotificationExtensionDefaultContentHiddenkey,設(shè)置值為true即可。