Swift 4的本地通知

Преждечеммыначнем,выможетескачатьначальныйпроект。 Приложениепредставляетизсебятаблицусоспискомтиповуведомлений。

Сейчасеслитапнутьпокакойлибостроке, 警报 сназваниемуведомления。 Кконцуэтоготуторилаэтодействиебудетотправлятьлокальноеуведомлениесссодержимымстроки。 Крометого,пользовательсможетвзаимодействоватьсэтимуведомлением,выбираядляэтоееилиилиили。

Преждечемвашеприложениесможетотправлятькакиелибоуведомления,пользовательдолжеодотьна。 Дляэтого,припервомзапускеприложениянеобходимовыполнитьзапроснаотправкууведомлений,длятого,чтобыпользовательмогегоодобритьилиотклонить。

AppDelegate用户指南UserNotifications

 import UserNotifications 

ВсвойствахклассасоздаемновоесвойствоnotificationCenterиприсваиваемэкземплярклассаUNUserNotificationCenterдляуправления。 .тобудетнашцентрнотификаций。

 let notificationCenter = UNUserNotificationCenter.current() 

使用didFinishLaunchingWithOptions options ,котораябудетсодержатьвсебеопции,доступн之前。 重要信息: badgesoundalertcarPlay

 let options: UNAuthorizationOptions = [.alert, .sound, .badge] 

Определившисьсперечнемпараметровоповещениямыможемзапроситьупользователяразреениенаотп

 notificationCenter.requestAuthorization(options: options) { 
(didAllow, error) in
if !didAllow {
print("User has declined notifications")
}
}

Еслисейчасзапуститьприложение,томыполучимзапроснаотправкууведомлений

Пользовательможетпоменятьнастройкицентрауведомленийвашегоприложениявлюбоевремя。 ВыможетеотслеживатьэтинастройкиприпомощисоответствующегогетераgetNotificationSettings。 completionтотвызовсодержит 完成块 UNNotificationSettings ,которыйможноисполозоватьдляпроверкисостоянияа

 notificationCenter.getNotificationSettings { (settings) in 
if settings.authorizationStatus != .authorized {
// Notifications not allowed
}
}

Созданиезапросанауведомление

Дляотправкиуведомлений,нужносоздатьзапроснауведомление。 Любоевесееевесееевесее的

  • title :Строковыйтипданныхдлязаголовокауведомлений
  • subtitle :Строковыйтипданныхдляподзаголовокауведомлений。 (Используетсяпонеобходимости)
  • body :Строкасодержащаявсебеосновнойтекстуведомления
  • badge :Номердляотображениянаиконкеприложения
  • sound :Звукоповещенияодоставкиуведомления。 Длятого, UNNotificationSound.default()
  • launchImageName :Имяграфическогофайла,прикрепляемогокуведомлению。
  • userInfo :Словарь,используемыйдляхраненияпользовательскойинформации,которуюможнопередатьвувед
  • attachmentsUNNotificationAttachment 。 Используетсядлявключенияаудио,изображенияиливидео。

ScheduleNotification在ДавайтесоздадимзапроснауведомлениеидляэтогообъявимновыйклассscheduleNotification

 func scheduleNotification(notificationType: String) { 

let content = UNMutableNotificationContent() // Содержимое уведомления

content.title = notificationType
content.body = "This is example how to create " + notificationType Notifications"
content.sound = UNNotificationSound.default
content.badge = 1
}

ДанныйметодимеетпараметрnotificationType,которыйбудетприниматьзначениевыбраннойстрокиивыводетоего

通知触发

Мызаполнилиуведомлениеконтентом,теперьнадосоздатьтриггерпокоторомуонодолжносрабатыва。 ,томожетпроисходитьнаосновекалендаря,повремениилипоместоположению。

Отправкауведомлениянаосновекалендаря

Триггернаопределеннуудатуиввремясоздаетсяспомощьюобъекта 日期组成部分 。 Дляпреобразованиядатывdate 组件 используйтетекущийкалендарь。 Например:

 let date = Date(timeIntervalSinceNow: 3600) 
let triggerDate = Calendar.current.dateComponents([.year,.month,.day,.hour,.minute,.second,], from: date)

Создаемтриггеризобъектов 日期组件

 let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDate, repeats: false) 

Длясозданиятриггера,которыйповторяетсясопределенныминтервалом,используйтепоатоправолоныйнаб。 Например,чтобыуведомлениеповторялосьежедневноводноитожевремя,намнужнытилекочасы,м

 let date = Date(timeIntervalSinceNow: 3600) 
let triggerDaily = Calendar.current.dateComponents([.hour,.minute,.second,], from: date)
let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDaily, repeats: true)

周一至周五的Дляотправкиуведомленийеженедельновотежевремя和нампонадобятсяднинедели

 let date = Date(timeIntervalSinceNow: 3600) 
let triggerWeekly = Calendar.current.dateComponents([.weekday, .hour, .minute, .second,], from: date)
let trigger = UNCalendarNotificationTrigger(dateMatching: triggerWeekly, repeats: true)

Отправкауведомленияпоместоположению

Данныйтриггерсрабатываетвмомент,когдапользовательпопадаетвкакуютоопределенноооооент。 МестоположениеопределяетсяCoreLocationсиспользованиемCLRegion

 let trigger = UNLocationNotificationTrigger(triggerWithRegion: region, repeats:false) 

Отправкауведомленияповремени

Мывнашемпроектебудемиспользоватьименноэтоттригер。 scheduleNotification(notificationType:) 5ссканд:создаемтигер,которыйнастроимна5секунд:

 let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false) 

Расписание

Имеяконтентитриггермыготовыктому,чтобысоздатьзапроснауведомлениеидобавитееоввевовтв。 Длякаждогозапросатребуетсястроковыйидентификатордлядальнейшегоиспользования:

 let identifier = "Local Notification" 
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)

notificationCenter.add(request) { (error) in
if let error = error {
print("Error \(error.localizedDescription)")
}
}

Еслиприложениеотправляетдругоеуведомлениестемжеидентификаторомнеенеебуд Вызовadd add() стойжестрокойидентификаторазаменитсуществующееуведомление。 Есливыхотитезапланироватьнесколькозапросов,каждыйразиспользуйтедругойидентификатор。

ИтакметодscheduleNotification scheduleNotification(notificationType:) создаетзапроснауведомлениесопределеннымконтентомипоопределенномара。 Осталосьвызватьданныйметод,тапаяпострокестипомуведомлениянаосновномэкранеприложения。

TableViewControllerAppDelegate

 let appDelegate = UIApplication.shared.delegate as? AppDelegate 

请在didSelectRowAt indexPathscheduleNotification(notificationType:)上添加okAction

 let okAction = UIAlertAction(title: "OK", style: .default) { (action) in 

self.appDelegate?.scheduleNotification(notificationType: notificationType)
}

Через5секундпосленажатиянакнопку«ОК»будетотправленоуведомлениеиеслиприложениевэтоммоментбудетненапереднемплане,топользовательегополучит。

Сейчаспослеполученияуведомлениянаиконкеприложениякрасныйбейджсчислон Давайтеэтоисправимисделамтак,чтобыбейджпропадал,послеоткрытияприложения

AppDelegate和applicationDidBecomeActive的Дляэтогопереходим:

 UIApplication.shared.applicationIconBadgeNumber = 0 

Запускаемпроект,проверяем。

Какбылосказановыше,мыможемполучитьуведомлениетольковтомслучае, Длятого,чтобыполучатьуведомлениядажевтомслучае,

 extension AppDelegate: UNUserNotificationCenterDelegate { 

}

Данныйпротоколсодержитдванеобязательныхметода:

  • userNotificationCenter(_:willPresent:withCompletionHandler:) withCompletionHandler userNotificationCenter(_:willPresent:withCompletionHandler:) вызывается,когдаприложениенаходитсянапереднемплане。 UNNotification ,请在UNNotificationRequest中添加一个UNNotificationRequest 。 Втелеметоданеобходимовыполнитьвызов 完成处理程序 UNNotificationPresentationOptions
  • userNotificationCenter (_: didReceive:withCompletionHandler:) используется,длявыборадействияпотапунауведомление。 动作UNNotificationResponse ,是actionIdentifier标识符дляопределениятогоилииногодействия。 СистемныеидентификаторыUN

Вобоихслучаяхнужновызвать 完成处理程序 длязавершения

Длярешениянашейзадачимыреализуемпервыйметод:

 func userNotificationCenter(_ center: UNUserNotificationCenter, 
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

}

Намнеобходимовызвать completionhandler处理程序длявыборанабораопцийоповещенияобубедомлении。

 completionHandler([.alert, .sound]) 

ПодписавшисьподпротоколUNUserNotificationCenterDelegate,在необходимоназначитьделегата。 在didFinishLaunchingWithOptions执行Дляэтого的操作:

 notificationCenter.delegate = self 

Теперьпользовательсможетполучатьуведомления,在будетнапереднемплан之前。

Обработкауведомлений

Когдапользовательнажимаетнауведомление,оножидает,чтоприложениеоткроетсяивывотикакое。 Сейчаспритапенауведомлениеприложениеоткрываетсяавтоматически,ноэтодействиеничтоне。 Еслинужнореагироватьнауведомление, UNUserNotificationCenterDelegate

 func userNotificationCenter(_ center: UNUserNotificationCenter, 
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {

if response.notification.request.identifier == "Local Notification" {
print("Handling notifications with the Local Notification Identifier")
}

completionHandler()
}

采取行动的本地通知

Чтобывключитьнастраиваемыедействиядляпользователявуведомление, Категорияопределяеттипуведомления,котороеможетсодержатьодноилинесколькодействий。 Вкачествепрактическогопримерасоздадимкатегориюсдвумядействиями。 Дляэтонампонадобитьсявыполнитьтриосновныхпункта:

1.Определяемдействие(действия)уведомления:

scheduleNotification(notificationType:)添加Переходим。 Параметрыдействияуведомлениямогутпредложитьпользователю:

  • разблокироватьустройство
  • запуститьприложение,выполнивприэтомкакоетодействие
  • предоставитьвариантсдеструктивнымпоследствиемкоторыйбудетвыделенкраснымцветом。
 let snoozeAction = UNNotificationAction(identifier: "Snooze", title: "Snooze", options: []) 
let deleteAction = UNNotificationAction(identifier: "Delete", title: "Delete", options: [.destructive])

2.Созданиекатегориидлядействий

Длясозданияновойкатегориинужноопределитьещеодинуникальныйидентификатор,покоторомобуд

 let userActions = "User Actions" 

ИмеяидентификаторможноUNNotificationCategoryдляинициализациикатегории:

 let category = UNNotificationCategory(identifier: userActions, actions: [snoozeAction, deleteAction], intentIdentifiers: [], options: []) 

3Регистрациякатегориивцентреуведомлений

Овалосьзарегистрироватьсозданнуукатегориювцентреуведомлений。

 notificationCenter.setNotificationCategories([category]) 

,тобывключитьнашидействиявуведомление,мыдолжнывключитьсоответствующуюкатегориювконтен

 content.categoryIdentifier = userActions 

Витогенашметодвыглядитсейчастак:

 func scheduleNotification(notificationType: String) { 

let content = UNMutableNotificationContent() // Содержимое уведомления
let userActions = "User Actions"

content.title = notificationType
content.body = "This is example how to create " + notificationType
content.sound = UNNotificationSound.default
content.badge = 1
content.categoryIdentifier = userActions

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
let identifier = "Local Notification"
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)

notificationCenter.add(request) { (error) in
if let error = error {
print("Error \(error.localizedDescription)")
}
}

let snoozeAction = UNNotificationAction(identifier: "Snooze", title: "Snooze", options: [])
let deleteAction = UNNotificationAction(identifier: "Delete", title: "Delete", options: [.destructive])
let category = UNNotificationCategory(identifier: userActions, actions: [snoozeAction, deleteAction], intentIdentifiers: [], options: [])

notificationCenter.setNotificationCategories([category])
}

Витогееслисейчаспотянутьуведомлениевниз,тораскроетсясписоквозможныхдействий:

Выможетеотображатьдочетырехдействий。

Сейчасвыбортогоилииногодействияниначтоневлияет。 Давайтерассмотрим,какнастроитьповедениеприложениявзависимостиотвыбора。 ПереходимвовторойпротоколаUNUserNotificationCenterDelegateидополняемегоинструкцией 开关

 switch response.actionIdentifier { 
case UNNotificationDismissActionIdentifier:
print("Dismiss Action")
case UNNotificationDefaultActionIdentifier:
print("Default")
case "Snooze":
print("Snooze")
scheduleNotification(notificationType: "Reminder")
case "Delete":
print("Delete")
default:
print("Unknown action")
}

重构

МыописаливсюлогикууведомленийвклассеAppDelegate,可能是будетсосдатьллних。 Добавляемвпроектновыйфайл Notifications исоздаемвнемновыйкласс:

 import Foundation 
import UserNotifications

class Notifications: NSObject, UNUserNotificationCenterDelegate {

}

ПереносимвсюлогикунавикуведомленийизклассаAppDelegateвкласс Notifications 。 Длявыполнениязапросанаразрешениеотправкиуведомленийсоздаемметод notificationRequest请求

 func notificationRequest() { 

let options: UNAuthorizationOptions = [.alert, .sound, .badge]

notificationCenter.requestAuthorization(options: options) {
(didAllow, error) in
if !didAllow {
print("User has declined notifications")
}
}
}

Важноназначитьделегатауведомленийвсамомначалежизненногоциклаприложения和напримервметоде

 let notifications = Notifications() 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

notifications.notificationCenter.delegate = notifications
notifications.notificationRequest()

return true
}

TableViewController和appDelegate应用appDelegate性能:

 let notifications = Notifications() 

索引为didSelectRowAt indexPath:

 let okAction = UIAlertAction(title: "OK", style: .default) { (action) in 

self.notifications.scheduleNotification(notificationType: notificationType)
}

Чтодальше?

Хотитебольшеинтересныхразборов,статейикурсов? zh_cn swiftbook.ru,前身为глесветедлясебячтотополезное。

Конечныйпроектможноскачатьпоссылке