Advanced Notifications 之 Notifications Content Extension(自定義通知UI)

本文會涉及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.png

但需要注意的是,自定義UI不能響應(yīng)點擊事件。

創(chuàng)建 Notifications Content Extension


創(chuàng)建Notifications Content Extension.png

創(chuàng)建好的Notifications Content Extension包含四個文件,分別是:

  • NotificationViewController頭文件與m文件
  • MainInterface.storyboard
  • Info.plist

Notifications Content Extension文件目錄.png

其中NotificationViewController繼承自UIViewController,且實現(xiàn)了UNNotificationContentExtension協(xié)議。

那么當(dāng)一個通知發(fā)出之后,系統(tǒng)是如何得知這個通知的UI是通過Notifications Content Extension設(shè)置的呢。

這里就需要在Info.plist中配置UNNotificationExtensionCategory的值,如下圖:

UNNotificationExtensionCategory配置.png

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配置你的初始化控制器。

注意NSExtensionPrincipalClassNSExtensionMainStoryboard必須存在一個。

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ù)器上報等等。

action響應(yīng)更新ui.gif

注意執(zhí)行completion()

一些需要注意的問題

  • 1、關(guān)于控制器內(nèi)部調(diào)整view的size,導(dǎo)致自定義視圖大小跳動的問題。
    ?效果如下所示:
ui跳動問題.gif

由上圖可以看到,自定義的視圖由大變小,有一個動畫效果。導(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)的通知視圖也非常簡單,使用UNNotificationExtensionDefaultContentHiddenkey,設(shè)置值為true即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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