it-roy-ru.com

Добавить локальное уведомление в 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/usernotificationsuihttps://developer.Apple.com/reference/usernotifications

25
Bjarte

Вы должны зарегистрироваться для уведомления ... Я пытался, и это работает. 

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)

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

29
LC 웃

С реализацией 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];
                              }
                          }];
    

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

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

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

На заднем плане: 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 .

17
ElonChan

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

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

  2. Если вы хотите показать уведомление foreground, необходимо назначить 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])
    }
    
1
Allen Wang

Я решил свою проблему следующим образом (Firebase, Swift 3):  

Найти этот метод в AppDelegate:

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

Найти эту строку:

completionHandler()

Конец набора:

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

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

0
ibrahimyilmaz

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

0
mourodrigo