? ? iOS10 新特性一出,各家紛紛出動研究新特性能給場景智能化所帶來的好處,從widget到推送通知的拓展。不意外的,當我還沒有來得及跟公司溝通新特性在軟件上的應用時,就被公司拉來研究了,今天我先就iOS 10 在推送通知上的新增API以及使用方法說一說:
(不避諱的說,程序媛一枚,歡迎點贊)
iOS10 的推送通知支持圖片啦!!支持視頻了!!支持自定義樣式了!!
首先認識一個類:UNNotificationSettings (枚舉,通知支持的樣式:聲音,彈框,橫幅,等等)
第一步注冊通知:
當然我們要引入頭文件:
<UserNotifications/UserNotifications.h>
//注冊推送通知,iOS10之后不論是否本地通知與遠程推送通知,都將采用注冊,以及請求發送的形式
UNUserNotificationCenter *notificationCenter = [UNUserNotificationCenter currentNotificationCenter];
notificationCenter.delegate = self;
[notificationCenter requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) {
NSLog(@"%d--%@", granted, error);
}];; //option參數設置支持通知的樣式,聲音,橫幅,彈框,等
磨刀不誤砍材工,再來認識幾個類:
trigger
設置通知的觸發時機:
UNCalenderNotificaitionTrigger(設置某時固定觸發通知)
UNLocationNotificaitionTrigger (設置當進入某一區域觸發通知)
UNTimeIntervalNotificaitionTrigger (設置多久后觸發通知)
content
UNNoticificationContent (一個設置通知組件的類,title,message,categoryIdentifier,媒體圖片,視頻,等都裝在這個結構體中發出通知請求,它還有一個和它一對的類UNMutableNoticificationContent)
UNNotificationAction (添加交互事件,包括輸入文字,點擊按鈕)
UNNotificationAttachment (媒體相關,想要推送帶“圖片”和”視頻“的通知,但是只支持本地的圖片和視頻,想要獲取數據只能下載到本地再推送哦。
PS:我踩過一個坑,你以為要自己清除下載到本地的緩存?想多啦,即使是存儲在Document,發送完通知之后蘋果會找到這條路徑自動清空緩存,做demo的時候發現自己存在那個路徑的圖片都在發送通知后的一瞬間被清空了,也就是說,想再利用這張圖,要再下載哦,或者把這張圖本地持久化,我是把圖轉成data存在NSUserDefaults了,個人覺得有點麻煩,有更好方法的大神給我留言哦~~!!)
第二步:初始化通知組件
//1.初始化通知
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.badge = @1;
content.title = self.titleTF.text;
content.body = self.messageTextView.text;? //如果沒有body則不會彈出通知
UNNotificationSound *sound = [UNNotificationSound defaultSound];
content.sound = sound;//通知聲音
content.categoryIdentifier = @"uid";//不要急,后面有解釋
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];//5秒后推送
NSString *localPath = [self getPathWithPhoteData:[[NSUserDefaults standardUserDefaults]objectForKey:@"photo"]];
if (localPath && ![localPath isEqualToString:@""]) {
UNNotificationAttachment * attachment = [UNNotificationAttachment attachmentWithIdentifier:@"photo" URL:[NSURL URLWithString:[@"file://" stringByAppendingString:localPath]] options:nil error:nil];
if (attachment) {
content.attachments = @[attachment];
}
//localPath是我通過拿到相冊圖片存到本地的路徑(為什么不用url直接下載圖片拼接本地路徑呢,因為產品想要用,他們想自己從相冊選照片!!!),總之把一個本地圖片的url丟到attachment里面就可以發送一個有圖片的通知了,視頻也是一樣用法呢。
第三部:偉大的推送請求~
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"push" content:content trigger:trigger];
//參數就是觸發時機和通知組建
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"%@", error);
}
}];
這是我的demo是一個可以自己輸入內容發送通知,并且可以設置點擊通知跳轉到某網頁的操作。
第四部:處理通知
用到這個代理:UNUserNotificationCenterDelegate
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(nonnull UNNotificationResponse *)response withCompletionHandler:(nonnull void (^)())completionHandler {
處理用戶與通知交互后的操作,我demo中的點擊跳轉網頁就是在這里處理
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
// 允許在前臺展示消息,不設置的話,默認是不行的
completionHandler(UNNotificationPresentationOptionAlert|UNNotificationPresentationOptionSound);}
接下來具體說說蘋果關于通知的拓展框架:
這部分寫的人比較多,我來補個漏
有的人自定義的UI之后發現根本不顯示,實際上要注意在info.里面的配置:
在NotificationContent里面的info.中,有3個key注意設置
1.ExtensionCategory負責綁定到通知中去,記得上面的content.categoryIdentifier = @"uid";
這里的ExtensionCategory要和content中設置的分類ID一致才能用過這個拓展框架顯示自定義的UI
2.UNNotificationExtensionDefaultContentHidden 這個key是boolean類型,之前我設置好自定義UI之后發現,出現了兩個title,兩個message,是因為我們沒有隱藏蘋果官方格式的通知,隱藏掉就好了,這里要設置為YES
今天就寫到這里啦~~謝謝大家。