Swift 4的本地通知
Преждечеммыначнем,выможетескачатьначальныйпроект。 Приложениепредставляетизсебятаблицусоспискомтиповуведомлений。
Сейчасеслитапнутьпокакойлибостроке, 警报 сназваниемуведомления。 Кконцуэтоготуторилаэтодействиебудетотправлятьлокальноеуведомлениесссодержимымстроки。 Крометого,пользовательсможетвзаимодействоватьсэтимуведомлением,выбираядляэтоееилиилиили。
Преждечемвашеприложениесможетотправлятькакиелибоуведомления,пользовательдолжеодотьна。 Дляэтого,припервомзапускеприложениянеобходимовыполнитьзапроснаотправкууведомлений,длятого,чтобыпользовательмогегоодобритьилиотклонить。
AppDelegate
用户指南UserNotifications
import UserNotifications
ВсвойствахклассасоздаемновоесвойствоnotificationCenterиприсваиваемэкземплярклассаUNUserNotificationCenterдляуправления。 .тобудетнашцентрнотификаций。
let notificationCenter = UNUserNotificationCenter.current()
使用didFinishLaunchingWithOptions
options
,котораябудетсодержатьвсебеопции,доступн之前。 重要信息: badge
, sound
, alert
和carPlay
。
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
:Словарь,используемыйдляхраненияпользовательскойинформации,которуюможнопередатьвувед -
attachments
:UNNotificationAttachment
。 Используетсядлявключенияаудио,изображенияиливидео。
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:)
создаетзапроснауведомлениесопределеннымконтентомипоопределенномара。 Осталосьвызватьданныйметод,тапаяпострокестипомуведомлениянаосновномэкранеприложения。
TableViewController
和AppDelegate
:
let appDelegate = UIApplication.shared.delegate as? AppDelegate
请在didSelectRowAt indexPath
和scheduleNotification(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:)
withCompletionHandleruserNotificationCenter(_: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,前身为глесветедлясебячтотополезное。
Конечныйпроектможноскачатьпоссылке