玩轉 iOS 10 推送 —— UserNotifications Framework(下)

《上》我們聊了一些:json

  • iOS 10 before 推送的流程
  • iOS 10 beta 推送的基本使用方法
  • 以及跟 iOS 10 before 推送的區別

《中》向你們詳細介紹了:ide

  • Notification Actions:3d-touch 輕觸推送橫幅操做
  • Dismiss Actions:鎖屏推送側滑操做 | 通知中心推送側滑操做 | 非 3d-touch 橫幅下拉操做
  • Response handling:點擊橫幅或操做的後續處理
  • Service Extension:更新推送橫幅(alert 變爲 title subtitle content)

《下》篇中將爲你們介紹更加進階的內容:動畫

  • Notifications User Interface:iOS 10 推送 UI
  • Media Attachments:在推送橫幅裏增長圖片、gif、音頻、視頻
  • Customization:徹底自定義推送橫幅的 UI,並在點擊操做之後當即更新推送橫幅 UI

Notifications User Interface

咱們先來看一下 iOS 10 默認的推送 UI。
包括「橫幅、鎖屏、通知中心 」三處,看起來差很少的樣子。
ui

Media Attachments

推送內容中增圖片、gif、audio、video。
在以上的三個界面均可以經過 3d-touch 觸發。
先一塊兒來看看效果。url

添加方法

  1. 打開 iOS Xcode Project - File - New - Target - iOS - Notification Service Extension - Next - Product Name 填寫 yourPushNotificationService - Finish
    具體圖示方法,在《中》裏有詳細的介紹。spa

  2. 添加文件。把大家定製的各類 media 文件拖拽至上一步系統自動生成的 yourPushNotificationService 文件夾下,勾上 copy to items,add to targets 必定要選擇這個 Notification Service 做爲 target,以下所示。
    設計

  3. 添加代碼。在 2 中生成的 NotificationService.m 裏添加代碼:3d

    -(void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    
     self.contentHandler     = contentHandler;
    
     // 1.把推送內容轉爲可變類型
     self.bestAttemptContent = [request.content mutableCopy];
    
     // 2.獲取 1 中自定義的字段 value
     NSString *urlStr = [request.content.userInfo valueForKey:@"your-attachment"];
    
     // 3.將文件夾名和後綴分割
     NSArray *urls    = [urlStr componentsSeparatedByString:@"."];
    
     // 4.獲取該文件在本地存儲的 url
     NSURL *urlNative = [[NSBundle mainBundle] URLForResource:urls[0] withExtension:urls[1]];
    
     // 5.依據 url 建立 attachment
     UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:urlStr URL:urlNative options:nil error:nil];
    
     // 6.賦值 @[attachment] 給可變內容
     self.bestAttemptContent.attachments = @[attachment];
    
     // 7.處理該內容
     self.contentHandler(self.bestAttemptContent);
    }複製代碼
  4. 先運行你的項目 target 使之在手機上安裝,再運行 Notification Service 的 target,並選擇在你的項目上運行該 Extension。此時可進行 Notification Service 代碼的調試,即在 NotificationService.m 中打斷點能夠調試,可是在你的項目中的斷點沒法調試。調試

  5. 發送 payload 需依照下述格式:code

    {  
       aps : { 
           alert : {...}, 
           mutable-content : 1 //必須
       }
       your-attachment : aPicture.png //必須
    }複製代碼

    其中:

    • mutable-content : 1 說明該推送在接收後可被修改,這個字段決定了系統是否會調用 Notification Service 中的方法。
    • your-attachment:是自定義的字段,key 能夠自定義(你本身要記住),value 須要是一個完整的文件名(或 url,後續會詳細解釋),即你想要展現的文件。
  6. 手機接收後,在任一個能看到推送條目的界面對推送條目進行 3d-touch 強按均可以觸發。(須要 iPhone 6s 及之後設備 & iOS 10)

  7. 提示:各類 media 文件大小有必定限制,圖片、視頻等過大都不會被展現,Apple 的意思是:對於圖片,最大寬度也就和屏幕等寬,過大的圖片沒有意義;對於音頻、視頻等,徹底能夠提供一個短期預覽部分,更多的內容仍是須要用戶點擊推送進入 App 以後對完整的內容進行查看。但願開發者聽從這樣的邏輯進行開發。

Notification Content

iOS 10 新增的另外一項 Extension,用於徹底自定義推送展現的 UI 界面,響應 Actions 的同時刷新該 UI。簡單的說就是你能夠把須要推送的內容(好比一條完整的新聞快訊,包括多條文字+圖片的組合)所有放到一條推送裏,用戶點擊了一個 Action(如贊、踩、關注、甚至評論等),在推送裏馬上刷新 UI(如展現加星動畫、評論內容等)。

特色

  • 須要添加 Notification content extension
  • 徹底自定義 UI
  • 推送 UI 不能響應觸摸、點擊、滑動等任何手勢
  • 能夠響應 notification actions

下圖中日程表的 UI 徹底由開發者自定義,而且在點擊了 Accept 以後,UI 當即發生了變化:

添加方法

打開 iOS Xcode Project - File - New - Target - iOS - Notification Content - Next - Product Name 填寫 yourPushNotificationContent - Finish

系統會在 Xcode 工程目錄中 自動生成 yourPushNotificationContent 文件夾,而且包含四個文件:NotificationViewController.hNotificationViewController.mMainInterface.storyboardInfo.plist

NotificationViewController.h/m
  • 繼承自 UIViewController,並實現了 UNNotificationContentExtension 協議。
  • 你能夠在 viewDidLoad 裏各類代碼寫你的 UI,或者使用 storyboard 拖拖拽拽就 ok。
  • 在 didReceiveNotification 方法裏接收推送內容,而後各類處理邏輯、傳值、展現 UI 等等。當點擊了 actions,也會走到這裏,而且包含一個 action 的字段,判斷點擊了哪一個 action 進而相應的更新你的 UI。
MainInterface.storyboard

拖拖拽拽一個 UI 就出來了 ^。^

Info.plist
  • 須要在這裏讓系統知道,哪一個 id 字段會觸發你這個 extension。


    高亮部分字段的值,須要跟 Notification Actions 的 category id 值同樣,這樣收到推送時,就會同時觸發 Notification content + Notification actions。

  • 同時這裏也能夠添加多個值,用於收到不一樣的推送,展現相似的 UI。
    好比接受聚會邀請和提醒聚會邀請,UI 相近,操做卻不一樣。

調試

當你各類 UI 展現後,會發現存在 2 個問題。

其一

是系統會自動展現一遍收到的推送內容,這部分極可能跟你的內容是重複的。

解決方法

在 Info.plist 中添加以下字段,而且把值設爲 YES 便可隱藏系統默認的展現。

其二

是展現內容比較少的時候,系統仍然會以最大的界面展現出來,會露出不少空白部分。

解決方法
方法一:在 viewDidLoad 中調整 self 的 size 以達到一個合適的尺寸。以下獲取了 size,並修改至一半的高度。
- (void)viewDidLoad {
    [super viewDidLoad];
    CGSize size = self.view.bounds.size;
    self.preferredContentSize = CGSizeMake(size.width, size.height/2);
}複製代碼

效果以下所示,仔細看你會發現存在小 bug,先展現了完整的高度,而後瞬間變成一半的高度,看起來有個高度適應的動畫的樣子。致使這種結果的緣由是系統準備展現推送的時候,尚未執行到你的代碼(展現從系統層級到 App 層級的過程),這是蘋果內部的機制所致。

方法二:仍是在 Info.plist 文件添加新的字段,設置縮放比例。

這樣系統層級會預先讀取該數據,用於展現。固然有時候展現的內容不一樣,須要的高度不一樣,而這裏只能設置成惟一的固定值。不過這也是現階段蘋果所能給你提供的可行方法了。

而後最終的展現效果以下,沒有上面那個不舒服的高度調整動畫了。

小結

感受 Notification Content 的功能極其強大,有了它以後連 App 都不須要再啓動了的樣子(只要能合理的設計展現內容和操做),省去了用戶每次爲了一項簡單操做都要進行「啓動 App - 操做 - 切換到多任務界面 - 退出 App」這樣的繁瑣過程。本來用戶看到推送可能不太有意願去查看詳細內容,如今他只須要很簡單的操做就能快速的查看,推送的點開率應該會所以而大幅增長吧。
究其如此便捷的緣由,Notification Service Extension 和 Notification Content 都是獨立於項目的 target,收到推送後,系統會單獨運行這兩個 target,徹底不會在此時去啓動 App 並執行 App 中大量的代碼,童鞋們在調試的時候也能夠注意這一點。

以上 《玩轉 iOS 10 推送》上中下三篇就所有結束了,更多分享內容將會在以後奉上^。^

相關文章
相關標籤/搜索