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

Edit: вам не нужно помещать приложение в фоновом режиме, чтобы представить уведомление от iOS 10 и далее.

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

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

здесь пример проекта.


С Имплемацией Objective-C:

Я написал демо-проект здесь:iOS10AdaptationTips .

  1. импорт UserNotifications

    ///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];
                              }
                          }];
    

    Запрос Авторизации: enter image description here

  3. расписание localNotification

  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!");
            }
        }];
    

тогда это будет выглядеть так:

В Фоновом Режиме : enter image description here Экран Блокировки:
enter image description here

Если повтор по умолчанию показывает только один enter image description here вместо того, чтобы показывать много на экране блокировки на 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()

End set:

completionHandler([.alert,.sound,.badge])

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


Я сделал реализацию для Swift 3, которая может помочь, вы можете проверить ее здесь:https://stackoverflow.com/a/45381380/2296630


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

  1. убедитесь, что у вас есть разрешение. Если нет, используйте UNUserNotificationCenter.текущий.)(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])
    }