iOS10本地通知UserNotifications快速入門

notification.png

iOS10更新變動(dòng)最大的就是通知這部分了扯躺,新版通知變得更加統(tǒng)一脑沿,使用更加方便藕畔,設(shè)計(jì)更加自由。以前本地通知和遠(yuǎn)程推送是分開的庄拇,雖然這些到了iOS10都合在一起了注服,但是為了便于理解,我們還是把他倆分開來進(jìn)行學(xué)習(xí)措近。這節(jié)我們學(xué)習(xí)的是本地通知溶弟。

以下的用語,如無特別表述瞭郑,通知就代表本地通知辜御,推送就代表遠(yuǎn)程服務(wù)器的推送。

快速添加一個(gè)通知

我們先舉個(gè)完整的代碼例子凰浮,大家了解下這個(gè)流程我抠,然后分步介紹這幾項(xiàng):

//第一步:注冊通知
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
//請求獲取通知權(quán)限(角標(biāo),聲音袜茧,彈框)
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (granted) {
        //獲取用戶是否同意開啟通知
        NSLog(@"request authorization successed!");
    }
}];
}
//第二步:新建通知內(nèi)容對象
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]
content.title = @"iOS10通知";
content.subtitle = @"新通知學(xué)習(xí)筆記";
content.body = @"新通知變化很大,之前本地通知和遠(yuǎn)程推送是兩個(gè)類瓣窄,現(xiàn)在合成一個(gè)了笛厦。這是一條測試通知,";
content.badge = @1;
UNNotificationSound *sound = [UNNotificationSound soundNamed:@"caodi.m4a"];
content.sound = sound;

//第三步:通知觸發(fā)機(jī)制俺夕。(重復(fù)提醒裳凸,時(shí)間間隔要大于60s)
UNTimeIntervalNotificationTrigger *trigger1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];

//第四步:創(chuàng)建UNNotificationRequest通知請求對象
NSString *requertIdentifier = @"RequestIdentifier";
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requertIdentifier content:content trigger:trigger1];

//第五步:將通知加到通知中心
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
    NSLog(@"Error:%@",error);

}];

最終效果如下:

notification01.png

通知內(nèi)容UNMutableNotificationContent

通知內(nèi)容就是設(shè)定通知的一些展示信息贱鄙,iOS10之后可以設(shè)置subtitle。
聲音的設(shè)置需要借助一個(gè)新類UNNotificationSound姨谷,通知文件要放到bundle里面逗宁。另外在實(shí)際的測試過程中發(fā)現(xiàn),添加通知的聲音有時(shí)候會(huì)無效梦湘。這應(yīng)該是iOS10存在的一個(gè)bug瞎颗,刪除掉程序,再安裝運(yùn)行就好了捌议。

觸發(fā)機(jī)制UNNotificationTrigger

Trigger是新加入的一個(gè)功能哼拔,通過此類可設(shè)置本地通知觸發(fā)條件。它一共有一下幾種類型:
1瓣颅、UNPushNotificaitonTrigger
推送服務(wù)的Trigger倦逐,由系統(tǒng)創(chuàng)建
2、UNTimeIntervalNotificaitonTrigger
時(shí)間觸發(fā)器宫补,可以設(shè)置多長時(shí)間以后觸發(fā)檬姥,是否重復(fù)。如果設(shè)置重復(fù)粉怕,重復(fù)時(shí)長要大于60s
3健民、UNCalendarNotificaitonTrigger
日期觸發(fā)器,可以設(shè)置某一日期觸發(fā)斋荞。例如荞雏,提醒我每天早上七點(diǎn)起床:

  NSDateComponents *components = [[NSDateComponents alloc] init];
  components.hour = 7;
  components.minute = 0; // components 日期            
  UNCalendarNotificationTrigger *calendarTrigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];

4、UNLocationNotificaitonTrigger
位置觸發(fā)器平酿,用于到某一范圍之后凤优,觸發(fā)通知。通過CLRegion設(shè)定具體范圍蜈彼。

通知請求UNNotificationRequest

通知請求的構(gòu)造
+ (instancetype)requestWithIdentifier:(NSString *)identifier content:(UNNotificationContent *)content trigger:(nullable UNNotificationTrigger *)trigger;
就是把上面三項(xiàng)連接起來筑辨。它有一個(gè)參數(shù)identifier,這相當(dāng)于通知的一個(gè)身份幸逆。iOS10通知支持更新棍辕,就是基于此identifier再發(fā)一條通知。

通知中心UNUserNotificationCenter

獲取通知[UNUserNotificationCenter currentNotificationCenter]然后通過addNotificaitonRequest:就完成了一個(gè)通知的添加还绘。

擴(kuò)展通知的內(nèi)容

通知我們已經(jīng)添加上了楚昭,現(xiàn)在我們需要擴(kuò)展一下通知的內(nèi)容,給它加一些內(nèi)容拍顷。擴(kuò)展的內(nèi)容需要支持3D-touch的手機(jī)(6s以上)抚太,重壓之后全面顯示

添加附件

iOS10之前通知的樣式不能更改,在iOS10之后引入了UNNotificationationAttachment,可以在通知中添加圖片尿贫,音頻电媳,視頻。蘋果對這些附件的大小和類型有一個(gè)限制:


attachment_type.png

如果我想在通知里加一個(gè)圖片庆亡,可以這樣處理:

NSString *imageFile = [[NSBundle mainBundle] pathForResource:@"sport" ofType:@"png"];
UNNotificationAttachment *imageAttachment = [UNNotificationAttachment attachmentWithIdentifier:@"iamgeAttachment" URL:[NSURL fileURLWithPath:imageFile] options:nil error:nil];
content.attachments = @[imageAttachment];//雖然是數(shù)組匾乓,但是添加多個(gè)只能顯示第一個(gè)
/* add request and notificaiton code ... */

效果如下:

notification02.png

重壓之后:


notificaiton03.png

添加交互

//點(diǎn)擊可以顯示文本輸入框
UNTextInputNotificationAction *action1 = [UNTextInputNotificationAction actionWithIdentifier:@"replyAction" title:@"文字回復(fù)" options:UNNotificationActionOptionNone];
//點(diǎn)擊進(jìn)入應(yīng)用
UNNotificationAction *action2 = [UNNotificationAction actionWithIdentifier:@"enterAction" title:@"進(jìn)入應(yīng)用" options:UNNotificationActionOptionForeground];
//點(diǎn)擊取消,沒有任何操作
UNNotificationAction *action3 = [UNNotificationAction actionWithIdentifier:@"cancelAction" title:@"取消" options:UNNotificationActionOptionDestructive];
//通過UNNotificationCategory對象將這幾個(gè)action行為添加到通知里去
UNNotificationCategory *categroy = [UNNotificationCategory categoryWithIdentifier:@"Categroy" actions:@[action1,action2,action3] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
//將categroy賦值到通知內(nèi)容上
content.categoryIdentifier = @"Categroy";
//設(shè)置通知代理又谋,用于檢測點(diǎn)擊方法
[[UNUserNotificationCenter currentNotificationCenter] setDelegate:self];
/* add request and notificaiton code ... */

效果如下:

notificaiotn04.png
notification05.png

獲取通知交互內(nèi)容:

//識(shí)別通知交互處理的代理方法
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{

NSString *categoryIdentifier = response.notification.request.content.categoryIdentifier;

if ([categoryIdentifier isEqualToString:@"Categroy"]) {
    //識(shí)別需要被處理的拓展
    if ([response.actionIdentifier isEqualToString:@"replyAction"]){
        //識(shí)別用戶點(diǎn)擊的是哪個(gè) action
        UNTextInputNotificationResponse *textResponse = (UNTextInputNotificationResponse*)response;
        //獲取輸入內(nèi)容
        NSString *userText = textResponse.userText;
        //發(fā)送 userText 給需要接收的方法
        NSLog(@"要發(fā)送的內(nèi)容是:%@",userText);
        //[ClassName handleUserText: userText];
    }else if([response.actionIdentifier isEqualToString:@"enterAction"]){
        NSLog(@"點(diǎn)擊了進(jìn)入應(yīng)用按鈕");
    }else{
        NSLog(@"點(diǎn)擊了取消");
    }
}
completionHandler();
}

由此我們可以知道action拼缝,categroy,request這些東西都是通過各自的identifier獲取的搂根。這樣可以很方便的定位到某一個(gè)通知或者action上珍促,為交互的處理提供了很大的便利。

自定義通知樣式

在Xcode中File->New->Targe會(huì)出現(xiàn)下面的視圖

notification06.png

Notification Content對應(yīng)的是通知剩愧,Notification Service Extension對應(yīng)的是推送猪叙。我們這里要實(shí)現(xiàn)通知的自定義,選擇左邊那個(gè)仁卷。創(chuàng)建成功之后會(huì)在工程里多一個(gè)文件件
notification07.png

NotificationViewController文件是自動(dòng)生成的穴翩,里面有一個(gè)
- (void)didReceiveNotification:(UNNotification *)notification
可以在這里定義一些通知的顯示。

MainInterface.storyboard文件是控制通知的storyboard文件锦积,可以編輯需要的通知樣式芒帕。我們設(shè)計(jì)一下文字的顏色和顯示位置

notificaiton08.png

接下來你可能會(huì)問,怎么把這個(gè)自定義的通知樣式應(yīng)用到當(dāng)前通知里呢丰介?先別急背蟆,我們看下一個(gè)文件Info.flist里面的內(nèi)容

notification09.png

第一項(xiàng)UNNotificationExtensionCategory就是UNNotificationCategory的標(biāo)示,我們把他換成我們通知里使用的標(biāo)示"Category"哮幢,系統(tǒng)就會(huì)自動(dòng)匹配通知顯示的樣式带膀。
第二項(xiàng)UNNotificationExtensionIntialContentSizeRation初始內(nèi)容 Size 的比例。也可以在 viewDidLoad 中使用 self.preferredContentSize 直接設(shè)置 Size橙垢。
第三項(xiàng)UNNotificationExtensionDefaultContentHidden是否隱藏默認(rèn)內(nèi)容垛叨,如果設(shè)為YES,默認(rèn)內(nèi)容會(huì)被隱藏柜某。
顯示的效果:

notification10.png

總結(jié)

至此嗽元,iOS通知部分的內(nèi)容就學(xué)完了,參考代碼:Demo喂击。
參考文檔:
iOS10 User Notificaitons學(xué)習(xí)筆記
活久見的重構(gòu)-iOS10 UserNotificaiotns框架解析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剂癌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子翰绊,更是在濱河造成了極大的恐慌珍手,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辞做,死亡現(xiàn)場離奇詭異琳要,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)秤茅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門稚补,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人框喳,你說我怎么就攤上這事课幕。” “怎么了五垮?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵乍惊,是天一觀的道長。 經(jīng)常有香客問我放仗,道長润绎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任诞挨,我火速辦了婚禮莉撇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惶傻。我一直安慰自己棍郎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布银室。 她就那樣靜靜地躺著涂佃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜈敢。 梳的紋絲不亂的頭發(fā)上辜荠,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機(jī)與錄音扶认,去河邊找鬼侨拦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辐宾,可吹牛的內(nèi)容都是我干的狱从。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼叠纹,長吁一口氣:“原來是場噩夢啊……” “哼季研!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起誉察,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤与涡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驼卖,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氨肌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酌畜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怎囚。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖桥胞,靈堂內(nèi)的尸體忽然破棺而出恳守,到底是詐尸還是另有隱情,我是刑警寧澤贩虾,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布催烘,位于F島的核電站,受9級特大地震影響缎罢,放射性物質(zhì)發(fā)生泄漏伊群。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一屁使、第九天 我趴在偏房一處隱蔽的房頂上張望在岂。 院中可真熱鬧,春花似錦蛮寂、人聲如沸蔽午。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽及老。三九已至,卻和暖如春范抓,著一層夾襖步出監(jiān)牢的瞬間骄恶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工匕垫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留僧鲁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓象泵,卻偏偏與公主長得像寞秃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子偶惠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

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