Поиск…


Вступление

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

В отличие от удаленных уведомлений, которые запускаются с сервера, локальные уведомления планируются и запускаются в приложении. Уведомления в целом направлены на то, чтобы увеличить взаимодействие пользователя с приложением, пригласить или соблазнить пользователя открывать и взаимодействовать с ним.

UILocalNotification устарела в iOS 10. Вместо этого используйте Framework UserNotifications.

замечания

Не путайте UILocalNotification с помощью push-уведомлений. Устройство UILocalNotification запускается вашим устройством, и по расписанию копируется в систему.

Ссылки:

Планирование локального уведомления

Убедитесь, что вы видите Регистрация для местных уведомлений, чтобы это работало:

стриж

let notification = UILocalNotification()
notification.alertBody = "Hello, local notifications!"
notification.fireDate = NSDate().dateByAddingTimeInterval(10) // 10 seconds after now
UIApplication.sharedApplication().scheduleLocalNotification(notification)

Objective-C

UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Hello, local notifications!";
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:10]; // 10 seconds after now
[[UIApplication sharedApplication] scheduleLocalNotification:notification];

Чтобы увидеть уведомление в симуляторе iOS, введите ^⌘H (control-command-H), чтобы вернуться домой, а затем введите ⌘L (command-L), чтобы заблокировать устройство. Подождите несколько секунд, и появится уведомление (этот вид будет отличаться в зависимости от типа уведомления, описанного в разделе «Регистрация для локальных уведомлений»):

Локальное уведомление

Проведите по уведомлению, чтобы вернуться в приложение (обратите внимание, что если вы вызвали это в представлении диспетчера viewDidLoad , viewWillAppear , viewDidAppear и т. Д., Уведомление будет запланировано снова).

Регистрация для местных уведомлений

iOS 8

Чтобы предоставлять пользователям локальные уведомления, вам необходимо зарегистрировать свое приложение на устройстве:

стриж

let settings = UIUserNotificationSettings(forTypes: [.Badge, .Sound, .Alert], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)

Objective-C

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];

Это будет предупреждать при первом вызове:

Зарегистрируйтесь для оповещения о местных оповещениях

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

Ответ на полученное местное уведомление

ВАЖНО: этот метод делегата вызывается только на переднем плане.

стриж

func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
    
}

Objective-C

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    
}

Этот метод обычно переопределяется в AppDelegate, который соответствует протоколу UIApplicationDelegate.

Управление локальными уведомлениями с использованием UUID

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

Отслеживать уведомление

Вы можете назначить UUID (универсальный уникальный идентификатор) для уведомления, чтобы вы могли отслеживать его:

стриж

let notification = UILocalNotification()
let uuid = NSUUID().uuidString
notification.userInfo = ["UUID": uuid]
UIApplication.shared.scheduleLocalNotification(notification)

Objective-C

UILocalNotification *notification = [[UILocalNotification alloc] init];
NSString *uuid = [[NSUUID UUID] UUIDString];
notification.userInfo = @{ @"UUID": uuid };
[[UIApplication sharedApplication] scheduleLocalNotification:notification];

Отмена уведомления

Чтобы отменить уведомление, мы сначала получаем список всех уведомлений, а затем находим тот, у которого есть соответствующий UUID. Наконец, мы отменим его.

стриж

let scheduledNotifications = UIApplication.shared.scheduledLocalNotifications

guard let scheduledNotifications = scheduledNotifications else {
    return
}

for notification in scheduledNotifications where "\(notification.userInfo!["UUID"]!)" == UUID_TO_CANCEL {
    UIApplication.sharedApplication().cancelLocalNotification(notification)
}

Objective-C

NSArray *scheduledNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];

for (UILocalNotification *notification in scheduledNotifications) {
    if ([[notification.userInfo objectForKey:"UUID"] compare: UUID_TO_CANCEL]) {
        [[UIApplication sharedApplication] cancelLocalNotification:notification];
        break;
    }
}

Вероятно, вы захотите сохранить все эти UUID в Core Data или Realm.

Немедленное представление локального уведомления

Если вы хотите немедленно указать местное уведомление, вы должны позвонить:

Swift 3

UIApplication.shared.presentLocalNotificationNow(notification)

Swift 2

UIApplication.sharedApplication().presentLocalNotificationNow(notification)

Objective-C

[[UIApplication sharedApplication] presentLocalNotificationNow:notification];

Преимущество использования этого заключается в том, что вам не нужно будет устанавливать свойства fireDate и timeZone вашего объекта UILocalNotification .

Звук уведомления

Пользовательские звуки могут быть предоставлены для уведомлений, созданных вашим приложением. Когда система отображает предупреждение для локального уведомления или значки значка приложения, он воспроизводит этот звук (пока пользователь не отключил звуки уведомлений).

Значение по умолчанию - nil, что означает, что для вашего уведомления не воспроизводится звук.

Чтобы предоставить настраиваемый звук, добавьте файл .caf , .wav или .aiff в свой пакет приложений. Звуки, длившиеся более 30 секунд, не поддерживаются. Подача звука, который не соответствует этим требованиям, приведет к воспроизведению звука по умолчанию ( UILocalNotificationDefaultSoundName ).

Objective-C

UILocalNotification *notification = [UILocalNotification new];
notification.soundName = @"nameOfSoundInBundle.wav"; // Use UILocalNotificationDefaultSoundName for the default alert sound

стриж

let notification = UILocalNotification()
notification.soundName = "nameOfSoundInBundle.wav"

Регистрация и расписание локального уведомления в Swift 3.0 (iOS 10)

Постановка на учет

в AppDelegate

import UserNotifications

в методе didFinishLaunchingWithOptions ,

UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge]) { (granted, error) in

// Here you can check Request is Granted or not.

}

Создание и расписание уведомлений.

    let content = UNMutableNotificationContent()
    content.title = "10 Second Notification Demo"
    content.subtitle = "From Wolverine"
    content.body = "Notification after 10 seconds - Your pizza is Ready!!"
    content.categoryIdentifier = "myNotificationCategory"

    let trigger = UNTimeIntervalNotificationTrigger(
        timeInterval: 10.0,
        repeats: false)
    
    let request = UNNotificationRequest(
        identifier: "10.second.message",
        content: content,
        trigger: trigger
    )
    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)

Когда эта часть кода запускается, если вы разрешили разрешение на уведомление, вы получите уведомление.

Чтобы проверить его правильно, убедитесь, что ваше приложение в фоновом режиме.

что нового в UILocalNotification с iOS10

Вы можете использовать UILocalNotification , старые API также отлично работают с iOS10, но нам лучше использовать API в структуре пользовательских уведомлений. Есть также некоторые новые функции, вы можете использовать только с iOS10 User Notifications.

Это также случается с удаленным уведомлением, для получения дополнительной информации: здесь .

Новые возможности:

  1. Теперь вы можете либо представить оповещение, звук или увеличить значок, в то время как приложение находится на переднем плане тоже с iOS 10
  2. Теперь вы можете обрабатывать все события в одном месте, когда пользователь нажал (или сдвинул) кнопку действия, даже когда приложение уже было убито.
  3. Поддержка 3D-касания вместо раздвижного жестов.
  4. Теперь вы можете удалить специфическое локальное уведомление только одним кодом строки.
  5. Поддержка Rich Notification с пользовательским интерфейсом.

Нам очень легко преобразовать API UILocalNotification API-интерфейсы iOS10 User Notifications, они действительно похожи.

Я пишу демо здесь, чтобы показать, как использовать новые и старые API одновременно: iOS10AdaptationTips .

Например,

С реализацией Swift:

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

        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
            // Enable or disable features based on authorization.
        }
    
  1. расписание localNotification

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

    @IBAction  func triggerNotification(){
        let content = UNMutableNotificationContent()
        content.title = NSString.localizedUserNotificationString(forKey: "Elon said:", arguments: nil)
        content.body = NSString.localizedUserNotificationString(forKey: "Hello Tom!Get up, let's play with Jerry!", arguments: nil)
        content.sound = UNNotificationSound.default()
        content.badge = UIApplication.shared().applicationIconBadgeNumber + 1;
        content.categoryIdentifier = "com.elonchan.localNotification"
        // Deliver the notification in five seconds.
        let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 60.0, repeats: true)
        let request = UNNotificationRequest.init(identifier: "FiveSecond", content: content, trigger: trigger)
    
        // Schedule the notification.
        let center = UNUserNotificationCenter.current()
        center.add(request)
    }
    
    @IBAction func stopNotification(_ sender: AnyObject) {
        let center = UNUserNotificationCenter.current()
        center.removeAllPendingNotificationRequests()
        // or you can remove specifical notification:
        // center.removePendingNotificationRequests(withIdentifiers: ["FiveSecond"])
    }
    

Реализация Objective-C:

  1. import UserNotifications
    // Notifications are independent from UIKit
    #import <UserNotifications/UserNotifications.h>
  1. запросить авторизацию для localNotification

    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
                          completionHandler:^(BOOL granted, NSError * _Nullable error) {
                              if (!error) {
                                  NSLog(@"request authorization succeeded!");
                                  [self showAlert];
                              }
                          }];
    
  1. расписание localNotification

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

    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 = [NSNumber numberWithInteger:([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!");
        }
    }];
    

Перейдите сюда для получения дополнительной информации: iOS10AdaptationTips .

#updated

Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «интервал времени должен быть не менее 60, если повторяется»

let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 60, repeats: true)


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow