Добавить локальное уведомление в ios10 - swift 3
Изменить: Таким образом, поместив приложение в фоновом режиме, сделали свое дело.
Оригинал:
Поэтому я пытался добавить уведомление в новый центр UNUserNotificationCenter, но, похоже, я его не получил.
У моего контроллера просмотра есть действие:
@IBAction func sendPressed(_ sender: AnyObject) {
let content = UNMutableNotificationContent()
content.title = "Hello"
content.body = "What up?"
content.sound = UNNotificationSound.default()
// Deliver the notification in five seconds.
let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false)
let request = UNNotificationRequest.init(identifier: "FiveSecond", content: content, trigger: trigger)
// Schedule the notification.
let center = UNUserNotificationCenter.current()
center.add(request) { (error) in
print(error)
}
print("should have been added")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let center = UNUserNotificationCenter.current()
center.requestAuthorization([.alert, .sound]) { (granted, error) in
}
}
И у меня есть Notification Content Extension
в проекте также, но это, кажется, не вызвано вообще, какие-либо идеи, которые я пропускаю? Я пытаюсь пример из пользовательской документации, но это не говорит мне больше, или я пропустил это.
Здесь: https://developer.apple.com/reference/usernotifications/unmutablenotificationcontent
Также: https://developer.apple.com/reference/usernotificationsui https://developer.apple.com/reference/usernotifications
5 ответов
Вам нужно зарегистрироваться для уведомления... Я пытался, и это работает.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
let center = UNUserNotificationCenter.current()
center.requestAuthorization([.alert, .sound]) { (granted, error) in
// Enable or disable features based on authorization.
}
return true
}
Изменить: вам не нужно помещать ваше приложение в фоновом режиме, чтобы представить уведомление от iOS 10 и выше.
Используйте обратный вызов ниже, чтобы настроить уведомление для представления на переднем плане.
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
Вот пример проекта.
С реализацией Objective-C:
Я написал демо-проект здесь: iOS10AdaptationTips.
импортировать уведомления пользователя
///Notification become independent from Foundation @import UserNotifications;
запросить авторизацию для localNotification
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (!error) { NSLog(@"request authorization succeeded!"); [self showAlert]; } }];
график локальных уведомлений
обновить номер значка приложения
// //Deliver the notification at 08:30 everyday // NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; // dateComponents.hour = 8; // dateComponents.minute = 30; // UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:dateComponents repeats:YES]; UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; content.title = [NSString localizedUserNotificationStringForKey:@"Elon said:" arguments:nil]; content.body = [NSString localizedUserNotificationStringForKey:@"Hello Tom!Get up, let's play with Jerry!" arguments:nil]; content.sound = [UNNotificationSound defaultSound]; /// 4. update application icon badge number content.badge = @([[UIApplication sharedApplication] applicationIconBadgeNumber] + 1); // Deliver the notification in five seconds. UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5.f repeats:NO]; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"FiveSecond" content:content trigger:trigger]; /// 3. schedule localNotification UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { if (!error) { NSLog(@"add NotificationRequest succeeded!"); } }];
тогда это будет выглядеть так:
На заднем плане: Экран блокировки:
Если повтор по умолчанию показывает только один вместо того, чтобы показывать многие на экране блокировки на iOS9: http://i67.tinypic.com/98t75s.jpg а также автоматически поддерживать 3D Touch http://a67.tinypic.com/dorw3b.jpg
Я пишу демо здесь: iOS10AdaptationTips.
Я решил свою проблему следующим образом (Firebase, Swift 3):
Найдите этот метод в вашем AppDelegate:
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
Найдите эту строку:
completionHandler()
Конечный набор:
completionHandler([.alert,.sound,.badge])
уведомления не запускаются, если вы не передаете параметры презентации методу завершение.
Вот несколько шагов:
Убедитесь, что у вас есть разрешение. Если нет, используйте UNUserNotificationCenter.current(). RequestAuthorization, чтобы получить это. Или следуйте ответу, если хотите, чтобы запрос появлялся несколько раз.
Если вы хотите показать передний план уведомления, вам нужно назначить UNUserNotificationCenterDelegate где-то.
Покажи мне код
@IBAction func sendPressed(_ sender: AnyObject) { let content = UNMutableNotificationContent() content.title = "Hello" content.body = "What up?" content.sound = UNNotificationSound.default() let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false) let request = UNNotificationRequest.init(identifier: "FiveSecond", content: content, trigger: trigger) let center = UNUserNotificationCenter.current() center.add(request) { (error) in print(error) } } override func viewDidLoad(_ animated: Bool) { super.viewDidLoad(animated) // Assign the delegate UNUserNotificationCenter.current().delegate = self // Ask the permission let center = UNUserNotificationCenter.current() center.requestAuthorization([.alert, .sound]) { (granted, error) in if granted { // do something } } } // Remember to add UNUserNotificationCenterDelegate to your view controller func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { print("Got the msg...") completionHandler([.badge, .sound, .alert]) }
Я сделал реализацию для Swift 3, которая может помочь, вы можете проверить это здесь: /questions/14047844/lokalnyie-i-push-uvedomleniya-v-ios-versii-sovmestimyi/14047851#14047851