《上》我們聊了一些:json
《中》向你們詳細介紹了:ide
《下》篇中將爲你們介紹更加進階的內容:動畫
咱們先來看一下 iOS 10 默認的推送 UI。
包括「橫幅、鎖屏、通知中心 」三處,看起來差很少的樣子。
ui
推送內容中增圖片、gif、audio、video。
在以上的三個界面均可以經過 3d-touch 觸發。
先一塊兒來看看效果。url
打開 iOS Xcode Project - File - New - Target - iOS - Notification Service Extension - Next - Product Name 填寫 yourPushNotificationService
- Finish
具體圖示方法,在《中》裏有詳細的介紹。spa
添加文件。把大家定製的各類 media 文件拖拽至上一步系統自動生成的 yourPushNotificationService
文件夾下,勾上 copy to items,add to targets 必定要選擇這個 Notification Service 做爲 target,以下所示。
設計
添加代碼。在 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);
}複製代碼
先運行你的項目 target 使之在手機上安裝,再運行 Notification Service 的 target,並選擇在你的項目上運行該 Extension。此時可進行 Notification Service 代碼的調試,即在 NotificationService.m
中打斷點能夠調試,可是在你的項目中的斷點沒法調試。調試
發送 payload 需依照下述格式:code
{
aps : {
alert : {...},
mutable-content : 1 //必須
}
your-attachment : aPicture.png //必須
}複製代碼
其中:
mutable-content : 1
說明該推送在接收後可被修改,這個字段決定了系統是否會調用 Notification Service 中的方法。手機接收後,在任一個能看到推送條目的界面對推送條目進行 3d-touch 強按均可以觸發。(須要 iPhone 6s 及之後設備 & iOS 10)
提示:各類 media 文件大小有必定限制,圖片、視頻等過大都不會被展現,Apple 的意思是:對於圖片,最大寬度也就和屏幕等寬,過大的圖片沒有意義;對於音頻、視頻等,徹底能夠提供一個短期預覽部分,更多的內容仍是須要用戶點擊推送進入 App 以後對完整的內容進行查看。但願開發者聽從這樣的邏輯進行開發。
iOS 10 新增的另外一項 Extension,用於徹底自定義推送展現的 UI 界面,響應 Actions 的同時刷新該 UI。簡單的說就是你能夠把須要推送的內容(好比一條完整的新聞快訊,包括多條文字+圖片的組合)所有放到一條推送裏,用戶點擊了一個 Action(如贊、踩、關注、甚至評論等),在推送裏馬上刷新 UI(如展現加星動畫、評論內容等)。
下圖中日程表的 UI 徹底由開發者自定義,而且在點擊了 Accept 以後,UI 當即發生了變化:
打開 iOS Xcode Project - File - New - Target - iOS - Notification Content - Next - Product Name 填寫 yourPushNotificationContent
- Finish
系統會在 Xcode 工程目錄中 自動生成 yourPushNotificationContent
文件夾,而且包含四個文件:NotificationViewController.h
、NotificationViewController.m
、MainInterface.storyboard
、Info.plist
。
拖拖拽拽一個 UI 就出來了 ^。^
須要在這裏讓系統知道,哪一個 id 字段會觸發你這個 extension。
同時這裏也能夠添加多個值,用於收到不一樣的推送,展現相似的 UI。
好比接受聚會邀請和提醒聚會邀請,UI 相近,操做卻不一樣。
當你各類 UI 展現後,會發現存在 2 個問題。
是系統會自動展現一遍收到的推送內容,這部分極可能跟你的內容是重複的。
在 Info.plist 中添加以下字段,而且把值設爲 YES 便可隱藏系統默認的展現。
是展現內容比較少的時候,系統仍然會以最大的界面展現出來,會露出不少空白部分。
- (void)viewDidLoad {
[super viewDidLoad];
CGSize size = self.view.bounds.size;
self.preferredContentSize = CGSizeMake(size.width, size.height/2);
}複製代碼
效果以下所示,仔細看你會發現存在小 bug,先展現了完整的高度,而後瞬間變成一半的高度,看起來有個高度適應的動畫的樣子。致使這種結果的緣由是系統準備展現推送的時候,尚未執行到你的代碼(展現從系統層級到 App 層級的過程),這是蘋果內部的機制所致。
這樣系統層級會預先讀取該數據,用於展現。固然有時候展現的內容不一樣,須要的高度不一樣,而這裏只能設置成惟一的固定值。不過這也是現階段蘋果所能給你提供的可行方法了。
而後最終的展現效果以下,沒有上面那個不舒服的高度調整動畫了。
感受 Notification Content 的功能極其強大,有了它以後連 App 都不須要再啓動了的樣子(只要能合理的設計展現內容和操做),省去了用戶每次爲了一項簡單操做都要進行「啓動 App - 操做 - 切換到多任務界面 - 退出 App」這樣的繁瑣過程。本來用戶看到推送可能不太有意願去查看詳細內容,如今他只須要很簡單的操做就能快速的查看,推送的點開率應該會所以而大幅增長吧。
究其如此便捷的緣由,Notification Service Extension 和 Notification Content 都是獨立於項目的 target,收到推送後,系統會單獨運行這兩個 target,徹底不會在此時去啓動 App 並執行 App 中大量的代碼,童鞋們在調試的時候也能夠注意這一點。
以上 《玩轉 iOS 10 推送》上中下三篇就所有結束了,更多分享內容將會在以後奉上^。^