版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2018.07.10 |
前言
我們做APP很多時(shí)候都需要推送功能琢蛤,以直播為例,如果你關(guān)注的主播開(kāi)播了蜂嗽,那么就需要向關(guān)注這個(gè)主播的人發(fā)送開(kāi)播通知苗膝,提醒用戶去看播,這個(gè)只是一個(gè)小的方面植旧,具體應(yīng)用根據(jù)公司的業(yè)務(wù)邏輯而定辱揭。前面已經(jīng)花了很多篇幅介紹了極光推送,其實(shí)極光推送無(wú)非就是將我們客戶端和服務(wù)端做的很多東西封裝了一下病附,節(jié)省了我們很多處理邏輯和流程问窃,這一篇開(kāi)始,我們就利用系統(tǒng)的原生推送類(lèi)結(jié)合工程實(shí)踐說(shuō)一下系統(tǒng)推送的集成完沪,希望我的講解能讓大家很清楚的理解它域庇。感興趣的可以看上面幾篇。
1. 系統(tǒng)推送的集成(一) —— 基本集成流程(一)
2. 系統(tǒng)推送的集成(二) —— 推送遇到的幾個(gè)坑之BadDeviceToken問(wèn)題(一)
3. 系統(tǒng)推送的集成(三) —— 本地和遠(yuǎn)程通知編程指南之你的App的通知 - 本地和遠(yuǎn)程通知概覽(一)
4. 系統(tǒng)推送的集成(四) —— 本地和遠(yuǎn)程通知編程指南之你的App的通知 - 管理您的應(yīng)用程序的通知支持(二)
Scheduling and Handling Local Notifications - 調(diào)度和處理本地通知
本地通知可讓您在應(yīng)用可能未運(yùn)行時(shí)提醒用戶覆积。 您可以在應(yīng)用程序在前臺(tái)或后臺(tái)運(yùn)行時(shí)調(diào)度本地通知听皿。 在調(diào)度通知后,系統(tǒng)負(fù)責(zé)在適當(dāng)?shù)臅r(shí)間向用戶發(fā)送通知宽档。 您的應(yīng)用無(wú)需運(yùn)行即可讓系統(tǒng)發(fā)送通知尉姨。
如果您的應(yīng)用未運(yùn)行,或者它位于后臺(tái)雌贱,系統(tǒng)會(huì)直接向用戶顯示本地通知啊送。 系統(tǒng)可以通過(guò)警報(bào)面板或橫幅偿短,聲音或通過(guò)標(biāo)記應(yīng)用程序的圖標(biāo)來(lái)警告用戶。 如果您的應(yīng)用提供了通知內(nèi)容應(yīng)用擴(kuò)展程序馋没,系統(tǒng)甚至可以使用您的自定義界面提醒用戶昔逗。 如果您的應(yīng)用在通知到達(dá)時(shí)位于前臺(tái),系統(tǒng)會(huì)為您的應(yīng)用提供內(nèi)部處理通知的機(jī)會(huì)篷朵。
注意:僅在iOS勾怒,watchOS和tvOS中支持本地通知。 在macOS中声旺,應(yīng)用程序在后臺(tái)運(yùn)行時(shí)不需要本地通知來(lái)標(biāo)記其圖標(biāo)笔链,播放聲音或顯示警報(bào)。
AppKit
框架已經(jīng)支持這些功能腮猖。
Configuring a Local Notification - 配置本地通知
配置本地通知的步驟如下:
- 使用通知詳細(xì)信息創(chuàng)建和配置UNMutableNotificationContent對(duì)象鉴扫。
- 創(chuàng)建UNCalendarNotificationTrigger,UNTimeIntervalNotificationTrigger或UNLocationNotificationTrigger對(duì)象澈缺,以描述傳遞通知的條件坪创。
- 使用內(nèi)容和觸發(fā)器信息創(chuàng)建UNNotificationRequest對(duì)象。
- 調(diào)用addNotificationRequest:withCompletionHandler:方法來(lái)調(diào)度通知姐赡;請(qǐng)參閱Scheduling Local Notifications for Delivery莱预。
在為通知?jiǎng)?chuàng)建內(nèi)容時(shí),請(qǐng)?zhí)顚?xiě)UNMutableNotificationContent
對(duì)象的屬性项滑,以反映您希望與用戶進(jìn)行的交互類(lèi)型依沮。例如,如果要顯示警報(bào)枪狂,請(qǐng)?zhí)顚?xiě)title
和body
屬性危喉。系統(tǒng)使用您提供的信息來(lái)確定與用戶交互的方式。處理已傳遞到應(yīng)用程序的本地通知時(shí)摘完,您還可以使用此對(duì)象中的數(shù)據(jù)姥饰。
創(chuàng)建通知內(nèi)容后,創(chuàng)建一個(gè)觸發(fā)器對(duì)象孝治,定義何時(shí)傳遞通知列粪。User Notifications
框架提供基于時(shí)間和基于位置的觸發(fā)器。使用所需條件配置觸發(fā)器谈飒,并使用該對(duì)象和內(nèi)容來(lái)創(chuàng)建UNNotificationRequest
對(duì)象岂座。
LIsting 3-1
顯示了如何創(chuàng)建和配置與鬧鐘相關(guān)的本地通知。使用UNCalendarNotificationTrigger
會(huì)導(dǎo)致通知在特定日期或時(shí)間傳遞杭措,在此示例中费什,下一次時(shí)鐘到達(dá)早上7:00。
// Listing 3-1Creating and configuring a local notification
// OC
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
content.title = [NSString localizedUserNotificationStringForKey:@"Wake up!" arguments:nil];
content.body = [NSString localizedUserNotificationStringForKey:@"Rise and shine! It's morning time!"
arguments:nil];
// Configure the trigger for a 7am wakeup.
NSDateComponents* date = [[NSDateComponents alloc] init];
date.hour = 7;
date.minute = 0;
UNCalendarNotificationTrigger* trigger = [UNCalendarNotificationTrigger
triggerWithDateMatchingComponents:date repeats:NO];
// Create the request object.
UNNotificationRequest* request = [UNNotificationRequest
requestWithIdentifier:@"MorningAlarm" content:content trigger:trigger];
// Swift
let content = UNMutableNotificationContent()
content.title = NSString.localizedUserNotificationString(forKey: "Wake up!", arguments: nil)
content.body = NSString.localizedUserNotificationString(forKey: "Rise and shine! It's morning time!",
arguments: nil)
// Configure the trigger for a 7am wakeup.
var dateInfo = DateComponents()
dateInfo.hour = 7
dateInfo.minute = 0
let trigger = UNCalendarNotificationTrigger(dateMatching: dateInfo, repeats: false)
// Create the request object.
let request = UNNotificationRequest(identifier: "MorningAlarm", content: content, trigger: trigger)
為UNNotificationRequest
對(duì)象提供標(biāo)識(shí)符為您提供了一種識(shí)別調(diào)度后的本地通知的方法手素。 您可以使用標(biāo)識(shí)符稍后查找待處理的請(qǐng)求鸳址,并在到達(dá)之前取消它們瘩蚪。 有關(guān)調(diào)度和取消請(qǐng)求的詳細(xì)信息,請(qǐng)參閱 Scheduling Local Notifications for Delivery稿黍。
1. Assigning Custom Actions to a Local Notification - 將自定義操作分配給本地通知
要在界面中顯示本地通知的自定義操作疹瘦,請(qǐng)?jiān)谂渲闷陂g將一個(gè)已注冊(cè)的類(lèi)別標(biāo)識(shí)符分配給UNMutableNotificationContent對(duì)象的categoryIdentifier屬性。 系統(tǒng)使用類(lèi)別信息來(lái)確定要包含在通知界面中的操作按鈕(如果有)巡球。 在安排通知請(qǐng)求之前言沐,必須為此屬性分配值。
Listing 3-2
顯示了如何為本地通知指定類(lèi)別標(biāo)識(shí)符酣栈。 在此示例中险胰,TIMER_EXPIRED
字符串表示在啟動(dòng)時(shí)定義的類(lèi)別,該類(lèi)別包括兩個(gè)自定義操作矿筝。 注冊(cè)此類(lèi)別的代碼如Listing 2-3
所示起便。
// Listing 3-2Defining a category of actions for a local notification
// OC
UNNotificationContent *content = [[UNNotificationContent alloc] init];
// Configure the content. . .
// Assign the category (and the associated actions).
content.categoryIdentifier = @"TIMER_EXPIRED";
// Create the request and schedule the notification.
// swift
let content = UNMutableNotificationContent()
// Configure the content. . .
// Assign the category (and the associated actions).
content.categoryIdentifier = "TIMER_EXPIRED"
// Create the request and schedule the notification.
有關(guān)如何使用類(lèi)別注冊(cè)自定義操作的信息,請(qǐng)參閱Configuring Categories and Actionable Notifications跋涣。
2. Adding a Sound to the Notification Content - 向通知內(nèi)容添加聲音
如果您希望本地通知在傳遞時(shí)播放聲音缨睡,請(qǐng)為UNMutableNotificationContent
對(duì)象的sound
屬性指定值。 您可以使用UNNotificationSound對(duì)象指定聲音陈辱,該對(duì)象允許您播放自定義聲音或默認(rèn)通知聲音。 自定義聲音必須位于用戶設(shè)備本地才能播放细诸。 將通知的聲音文件存儲(chǔ)在應(yīng)用程序的主程序包中沛贪,或下載它們并將它們存儲(chǔ)在應(yīng)用程序容器目錄的Library / Sounds
子目錄中。
要播放默認(rèn)聲音震贵,請(qǐng)創(chuàng)建聲音文件并將其指定給通知內(nèi)容利赋。 例如:
// OC
content.sound = [UNNotificationSound defaultSound];
// SWIFT
content.sound = UNNotificationSound.default()
指定自定義聲音時(shí),僅指定要播放的聲音文件的文件名猩系。 如果系統(tǒng)找到具有您提供的名稱的合適聲音文件媚送,則在發(fā)送通知時(shí)播放該聲音。 如果系統(tǒng)找不到合適的聲音文件寇甸,它將播放默認(rèn)聲音塘偎。
// OC
content.sound = [UNNotificationSound soundNamed:@"MySound.aiff"];
//SWIFT
content.sound = UNNotificationSound(named: "MySound.aiff")
有關(guān)支持的聲音文件格式的信息,請(qǐng)參閱UNNotificationSound Class Reference拿霉。
Scheduling Local Notifications for Delivery - 調(diào)度本地通知送達(dá)
要調(diào)度送達(dá)的本地通知吟秩,請(qǐng)創(chuàng)建UNNotificationRequest對(duì)象并調(diào)用UNUserNotificationCenter
的addNotificationRequest:withCompletionHandler:方法。 系統(tǒng)異步調(diào)度本地通知绽淘,在調(diào)度完成或發(fā)生錯(cuò)誤時(shí)調(diào)用完成處理程序塊涵防。 Listing 3-3
顯示了如何調(diào)度本地通知以進(jìn)行傳遞。 此示例中的代碼完成了Listing 3-1
中創(chuàng)建的通知的調(diào)度沪铭。
// Listing 3-3Scheduling a local notification for delivery
// OC
// Create the request object.
UNNotificationRequest* request = [UNNotificationRequest
requestWithIdentifier:@"MorningAlarm" content:content trigger:trigger];
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
if (error != nil) {
NSLog(@"%@", error.localizedDescription);
}
}];
// SWIFT
// Create the request object.
let request = UNNotificationRequest(identifier: "MorningAlarm", content: content, trigger: trigger)
// Schedule the request.
let center = UNUserNotificationCenter.current()
center.add(request) { (error : Error?) in
if let theError = error {
print(theError.localizedDescription)
}
}
調(diào)度的本地通知保持活動(dòng)狀態(tài)壮池,直到它們被系統(tǒng)取消調(diào)度或直到您明確取消它們?yōu)橹埂?除非通知的觸發(fā)器配置為重復(fù)偏瓤,否則系統(tǒng)會(huì)在發(fā)送后自動(dòng)取消計(jì)劃通知。 要在送達(dá)之前取消單個(gè)通知椰憋,或取消重復(fù)通知厅克,請(qǐng)調(diào)用UNUserNotificationCenter
的removePendingNotificationRequestsWithIdentifiers:方法。 被取消的通知必須具有分配給其UNNotificationRequest對(duì)象的identifier熏矿。要取消所有掛起的本地通知已骇,無(wú)論它們是否具有請(qǐng)求標(biāo)識(shí)符,請(qǐng)調(diào)用removeAllPendingNotificationRequests方法票编。
Responding to the Delivery of Notifications - 響應(yīng)送達(dá)的通知
當(dāng)您的應(yīng)用未運(yùn)行或處于后臺(tái)時(shí)褪储,系統(tǒng)會(huì)使用您指定的交互自動(dòng)提供本地和遠(yuǎn)程通知。 如果用戶選擇某個(gè)操作慧域,或選擇其中一個(gè)標(biāo)準(zhǔn)交互鲤竹,系統(tǒng)會(huì)通知您的應(yīng)用用戶的選擇。 然后昔榴,您的代碼可以使用該選擇來(lái)執(zhí)行其他任務(wù)辛藻。 如果您的應(yīng)用在前臺(tái)運(yùn)行,則會(huì)將通知直接發(fā)送到您的應(yīng)用互订。 然后吱肌,您可以決定是安靜地處理通知還是提醒用戶。
要響應(yīng)通知的傳遞仰禽,您必須為單例UNUserNotificationCenter
對(duì)象實(shí)現(xiàn)代理氮墨。 您的委托對(duì)象必須符合UNUserNotificationCenterDelegate
協(xié)議,通知中心使用該協(xié)議向您的應(yīng)用程序發(fā)送通知信息吐葵。 如果您的通知包含自定義操作规揪,則需要委托。
重要:在應(yīng)用程序或應(yīng)用程序擴(kuò)展完成啟動(dòng)之前温峭,您必須將代理分配給單例
UNUserNotificationCenter
對(duì)象猛铅。 如果不這樣做,可能會(huì)阻止您的應(yīng)用正確處理通知凤藏。
有關(guān)如何實(shí)現(xiàn)代理對(duì)象的其他信息奸忽,請(qǐng)參閱UNUserNotificationCenterDelegate Protocol Reference。
1. Handling Notifications When Your App Is in the Foreground - 處理您的應(yīng)用程序在前臺(tái)時(shí)的通知
如果在應(yīng)用程序位于前臺(tái)時(shí)收到通知清笨,您可以靜默該通知或告訴系統(tǒng)繼續(xù)顯示通知界面筷频。默認(rèn)情況下队伟,在前臺(tái)時(shí)系統(tǒng)會(huì)靜默通知谨设,并將通知的數(shù)據(jù)直接發(fā)送到您的應(yīng)用诊县。您可以使用通知數(shù)據(jù)直接更新應(yīng)用程序界面。例如,如果到達(dá)新的體育比分腌歉,您只需在界面中更新該信息即可蛙酪。
如果希望系統(tǒng)繼續(xù)顯示通知界面,請(qǐng)為UNUserNotificationCenter
提供委托對(duì)象翘盖,并實(shí)現(xiàn)userNotificationCenter:willPresentNotification:withCompletionHandler:方法桂塞。您對(duì)此方法的實(shí)現(xiàn)仍應(yīng)處理通知數(shù)據(jù)。完成后馍驯,使用您希望系統(tǒng)使用的傳遞選項(xiàng)(如果有)執(zhí)行提供的完成處理程序塊阁危。如果未指定任何選項(xiàng),系統(tǒng)會(huì)使通知靜音汰瘫。Listring 3-4顯示了此方法的示例實(shí)現(xiàn)狂打,它告訴系統(tǒng)播放聲音。通知的有效負(fù)載payload
標(biāo)識(shí)要播放的聲音混弥。
// Listing 3-4Playing a sound while your app is in the foreground
// OC
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
// Update the app interface directly.
// Play a sound.
completionHandler(UNNotificationPresentationOptionSound);
}
//SWIFT
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
// Update the app interface directly.
// Play a sound.
completionHandler(UNNotificationPresentationOptions.sound)
}
當(dāng)您的應(yīng)用處于后臺(tái)或未運(yùn)行時(shí)趴乡,系統(tǒng)不會(huì)調(diào)用userNotificationCenter:willPresentNotification:withCompletionHandler:
方法。 在這些情況下蝗拿,系統(tǒng)根據(jù)通知本身中的信息警告用戶晾捏。 您仍然可以使用UNUserNotificationCenter
對(duì)象的getDeliveredNotificationsWithCompletionHandler:方法確定是否已發(fā)送通知。
2. Responding to the Selection of a Custom Action - 響應(yīng)自定義操作的選擇
當(dāng)用戶從通知界面中選擇自定義操作時(shí)哀托,系統(tǒng)會(huì)通知您的應(yīng)用用戶的選擇惦辛。對(duì)自定義操作的響應(yīng)打包在UNNotificationResponse對(duì)象中,并傳遞給應(yīng)用程序的共享UNUserNotificationCenter
對(duì)象的委托仓手。要接收響應(yīng)裙品,您的委托對(duì)象必須實(shí)現(xiàn)userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:方法。您對(duì)該方法的實(shí)施必須能夠處理您的應(yīng)用或應(yīng)用擴(kuò)展程序支持的所有自定義操作俗或。
如果收到回復(fù)后您的應(yīng)用或應(yīng)用擴(kuò)展程序未運(yùn)行,系統(tǒng)會(huì)在后臺(tái)啟動(dòng)您的應(yīng)用或應(yīng)用擴(kuò)展程序以處理響應(yīng)岁忘。使用提供的后臺(tái)時(shí)間更新數(shù)據(jù)結(jié)構(gòu)和應(yīng)用程序界面以反映用戶的選擇辛慰。請(qǐng)勿使用時(shí)間執(zhí)行與自定義操作處理無(wú)關(guān)的任務(wù)。
Listing 3-5
顯示了具有多個(gè)類(lèi)別和自定義操作的計(jì)時(shí)器應(yīng)用程序的響應(yīng)處理程序方法的實(shí)現(xiàn)干像。該實(shí)現(xiàn)使用action
和categoryIdentifier屬性來(lái)確定適當(dāng)?shù)牟僮鬟^(guò)程帅腌。
// Listing 3-5Handling a custom notification action
// OC
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void (^)(void))completionHandler {
if ([response.notification.request.content.categoryIdentifier isEqualToString:@"TIMER_EXPIRED"]) {
// Handle the actions for the expired timer.
if ([response.actionIdentifier isEqualToString:@"SNOOZE_ACTION"])
{
// Invalidate the old timer and create a new one. . .
}
else if ([response.actionIdentifier isEqualToString:@"STOP_ACTION"])
{
// Invalidate the timer. . .
}
}
// Else handle actions for other notification types. . .
}
// SWIFT
// func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
if response.notification.request.content.categoryIdentifier == "TIMER_EXPIRED" {
// Handle the actions for the expired timer.
if response.actionIdentifier == "SNOOZE_ACTION" {
// Invalidate the old timer and create a new one. . .
}
else if response.actionIdentifier == "STOP_ACTION" {
// Invalidate the timer. . .
}
}
// Else handle actions for other notification types. . .
}
3. Handling the Standard System Actions - 處理標(biāo)準(zhǔn)系統(tǒng)操作
在系統(tǒng)的通知界面中,用戶可以明確地關(guān)閉通知界面或啟動(dòng)您的應(yīng)用麻汰,而不是選擇您的一個(gè)自定義操作速客。關(guān)閉界面涉及點(diǎn)擊適用按鈕或直接關(guān)閉界面;忽略通知或輕彈通知橫幅并不代表明確的移除五鲫。觸發(fā)系統(tǒng)操作時(shí)溺职,用戶通知中心會(huì)將其報(bào)告給userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:代理方法。傳遞給該方法的響應(yīng)對(duì)象包含以下操作標(biāo)識(shí)符之一:
- userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:可讓您知道用戶明確拒絕通知界面而未選擇自定義操作。
- UNNotificationDefaultActionIdentifier可讓您知道用戶在未選擇自定義操作的情況下啟動(dòng)了您的應(yīng)用浪耘。
您可以像處理其他操作一樣處理標(biāo)準(zhǔn)系統(tǒng)操作乱灵。Listing 3-6
顯示了userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:方法的模板用于檢查這些特殊的actions
。
// Listing 3-6Handling the standard system actions
// OC
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void (^)(void))completionHandler {
if ([response.actionIdentifier isEqualToString:UNNotificationDismissActionIdentifier]) {
// The user dismissed the notification without taking action.
}
else if ([response.actionIdentifier isEqualToString:UNNotificationDefaultActionIdentifier]) {
// The user launched the app.
}
// Else handle any custom actions. . .
}
// SWIFT
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
if response.actionIdentifier == UNNotificationDismissActionIdentifier {
// The user dismissed the notification without taking action
}
else if response.actionIdentifier == UNNotificationDefaultActionIdentifier {
// The user launched the app
}
// Else handle any custom actions. . .
}
后記
本篇主要講述了調(diào)度和處理本地通知七冲,感興趣的給個(gè)贊或者關(guān)注~~~~~