iOS推送通知拓展NotificationServiceExtension實踐

avatar

前言

自iOS10 更新以來,Apple 表示這是 iOS 有史以來最大的升級(our biggest release yet),更加智能開放的Siri、強化應用對3DTouch支持、 HomeKit 、電話攔截及全新設計的通知等等。html

iOS 10 中將以前繁雜的推送通知統一成UserNotifications.framework 來集中管理和使用通知功能,還增長一些實用的功能——撤回單條通知、更新已展現通知、中途修改通知內容、在通知中顯示多媒體資源、自定義UI等功能。ios

iOS10推送通知的有如下兩個兩個擴展框架:git

  • UNNotificationServiceExtension(通知服務拓展)
  • UNNotificationContentExtension(通知內容拓展)
通知拓展 特性
UNNotificationServiceExtension 在收到通知後,展現通知前,作一些事情的。好比,增長附件,網絡請求等。
UNNotificationContentExtension 能夠經過提早配置的categoryIdentifier來定製推送顯示的界面

1、UNNotificationServiceExtension - 通知服務擴展

1.什麼是UNNotificationServiceExtension?

的主要功能,是讓咱們在收到遠程推送的時候,在推送展現以前對其進行修改,由於咱們收到遠程推送以前會先去執行Service Extension中的代碼,這樣就能夠在收到遠程推送展現以前作一些操做。github

2.UNNotificationServiceExtension的做用

通知服務拓展能作什麼?舉個例子:bash

1.更改推送內容

經過遠程推送,推送的內容的title="1",我能夠在收到推送將要顯示以前將標題修改爲title="2",那麼推送條展現的title就是2。網絡

2.對推送內容加解密

在發送推送的時候發送一段用公鑰加密的內容,而後設備收到推送以後,用私鑰進行解密而後再去展現。例如開發者不想讓第三方推送sdk(極光推送等)知曉推送內容,則能夠採用通知服務拓展。框架

3.推送事件響應

在推送發送時,可使用服務拓展對通知的狀態(例如到達率)作統計。工具

4.富媒體下載

當遠程推送須要展現多媒體的時候,也須要在這下載,下載完畢以後,獲取本地下載文件路徑再進行展現。對下載附件多媒體得須要Service Extension。測試

3.UNNotificationServiceExtension實踐

3.1 建立一個Service Extension

File -> New -> Target
選擇拓展 ui

avatar
隨後點擊建立拓展便可,發現此時在項目中出現「xxxServiceExtension」的文件夾。
文件夾中包含了推送拓展類NotificationService。
avatar

3.2 測試

第一步,選擇target爲extension,運行項目:

第二步,選擇當前項目

第三步,在NotificationService.m中的didReceiveNotificationRequest中添加斷點:

第四步,發個遠程推送,注意,本地推送是沒反應的。

注意

新加 NotificationServiceExtension的項目,對應的的Extension target的Build Phases-》link binary with libraries 加上

  • libresolv.tbd
  • libz.tbd

3.2 遠程推送相關注意事項

相對於普通推送,推送服務拓展payload的內容基本相同,舉個例子:

{
  "aps":{
    "alert":{
      "title":"iOS 10 title",
      "subtitle":"iOS 10 subtitle",
      "body":"iOS 10 body"
    },
    "mutable-content":1,
    "category":"saySomethingCategory",
    "sound":"default",
    "badge":3
  }
}
複製代碼

注意,推送內容多了一個mutable-content,它表示咱們會在接收到通知時對內容進行更改。
開發者在didReceiveNotificationRequest方法中有30秒的時間對推送內容到達前進行處理。例如:

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
    
    // Modify the notification content here...
    self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
    self.bestAttemptContent.body = @"我是新修改的body";
    self.bestAttemptContent.title = @"我是新修改的title";
    self.bestAttemptContent.subtitle = @"我是新修改的subtitle";
    
    self.contentHandler(self.bestAttemptContent);
}
複製代碼

3.3 推送測試工具

這裏推薦Knuff: github.com/KnuffApp/Kn…

參考文獻http://www.cocoachina.com/ios/20160628/16833.html

極光接入

若開發者使用極光推送,則下載極光的SDK ,把裏面的lib文件拷貝到工程中:

相關文章
相關標籤/搜索