Добавить локальное уведомление в 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.

  1. импортировать уведомления пользователя

    ///Notification become independent from Foundation
    @import UserNotifications;
    
  2. запросить авторизацию для localNotification

    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
                          completionHandler:^(BOOL granted, NSError * _Nullable error) {
                              if (!error) {
                                  NSLog(@"request authorization succeeded!");
                                  [self showAlert];
                              }
                          }];
    

    Запрос авторизации: введите описание изображения здесь

  3. график локальных уведомлений

  4. обновить номер значка приложения

        //        //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])

уведомления не запускаются, если вы не передаете параметры презентации методу завершение.

Вот несколько шагов:

  1. Убедитесь, что у вас есть разрешение. Если нет, используйте UNUserNotificationCenter.current(). RequestAuthorization, чтобы получить это. Или следуйте ответу, если хотите, чтобы запрос появлялся несколько раз.

  2. Если вы хотите показать передний план уведомления, вам нужно назначить UNUserNotificationCenterDelegate где-то.

  3. Покажи мне код

    @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

Другие вопросы по тегам