Szukaj…


Wprowadzenie

Lokalne powiadomienia pozwalają Twojej aplikacji powiadamiać użytkownika o treściach, które nie wymagają użycia serwera.

W przeciwieństwie do zdalnych powiadomień uruchamianych z serwera powiadomienia lokalne są planowane i uruchamiane w aplikacji. Powiadomienia są generalnie ukierunkowane na zwiększenie interakcji użytkownika z aplikacją, zachęcając lub kusząc użytkownika do otwarcia i interakcji z aplikacją.

UILocalNotification jest przestarzałe w iOS 10. Zamiast tego użyj struktury UserNotifications.

Uwagi

Nie należy mylić UILocalNotification z powiadomieniami push. UILocalNotification jest uruchamiane przez twoje urządzenie, a po zaplanowaniu jest kopiowane do systemu.

Spinki do mankietów:

Planowanie lokalnego powiadomienia

Upewnij się, że widzisz Rejestracja lokalnych powiadomień , aby to zadziałało:

Szybki

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

Cel C

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

Aby zobaczyć powiadomienie w Symulatorze iOS, wpisz ^⌘H (control-Command-H), aby wrócić do domu, a następnie wpisz ⌘L (Command-L), aby zablokować urządzenie. Poczekaj kilka sekund, a pojawi się powiadomienie (ten wygląd będzie się różnić w zależności od typu powiadomienia omówionego w „Rejestrowaniu powiadomień lokalnych”):

Lokalny baner powiadomień

Swipe w sprawie zgłaszania wrócić do aplikacji (Zauważ, że jeśli to się nazywa pierwszego kontrolera widoku za viewDidLoad , viewWillAppear , viewDidAppear itp, zgłoszenie zostanie ponownie zaplanowane).

Rejestracja lokalnych powiadomień

iOS 8

Aby przedstawić użytkownikowi lokalne powiadomienia, musisz zarejestrować swoją aplikację na urządzeniu:

Szybki

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

Cel C

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

Spowoduje to wyświetlenie alertu przy pierwszym wywołaniu:

Zarejestruj się, aby otrzymywać powiadomienia o lokalnych powiadomieniach

Niezależnie od tego, co wybierze użytkownik, alert nie pojawi się ponownie, a zmiany będą musiały zostać zainicjowane przez użytkownika w Ustawieniach.

W odpowiedzi na otrzymane lokalne powiadomienie

WAŻNE: Ta metoda delegowania jest wywoływana tylko na pierwszym planie.

Szybki

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

Cel C

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

Ta metoda jest zasadniczo nadpisywana w AppDelegate, która jest zgodna z protokołem UIApplicationDelegate.

Zarządzanie lokalnymi powiadomieniami za pomocą UUID

Często trzeba będzie móc zarządzać powiadomieniami, śledząc je i anulując.

Śledź powiadomienie

Możesz przypisać UUID (uniwersalnie unikalny identyfikator) do powiadomienia, abyś mógł go śledzić:

Szybki

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

Cel C

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

Anuluj powiadomienie

Aby anulować powiadomienie, najpierw otrzymujemy listę wszystkich powiadomień, a następnie znajdujemy to z pasującym UUID. Wreszcie anulujemy to.

Szybki

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)
}

Cel 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;
    }
}

Prawdopodobnie zechcesz przechowywać wszystkie te UUID w Core Data lub Realm.

Natychmiastowe przedstawienie lokalnego powiadomienia

Jeśli chcesz natychmiast wyświetlić lokalne powiadomienie, zadzwoń:

Szybki 3

UIApplication.shared.presentLocalNotificationNow(notification)

Swift 2

UIApplication.sharedApplication().presentLocalNotificationNow(notification)

Cel C

[[UIApplication sharedApplication] presentLocalNotificationNow:notification];

Zaletą korzystania z tego jest taki, że nie będzie musiał ustawić fireDate i timeZone właściwości swojej UILocalNotification obiektu.

Dźwięk powiadomienia

Do powiadomień generowanych przez aplikację mogą być dostarczane niestandardowe dźwięki. Gdy system wyświetla ostrzeżenie o lokalnym powiadomieniu lub rozpoznaje ikonę aplikacji, odtwarza ten dźwięk (o ile użytkownik nie wyłączył dźwięków powiadomień).

Wartość domyślna to zero, co oznacza, że w powiadomieniu nie odtwarzany jest żaden dźwięk.

Aby dostarczyć niestandardowy dźwięk, dodaj do pakietu aplikacji plik .caf , .wav lub .aiff . Dźwięki trwające dłużej niż 30 sekund nie są obsługiwane. Dostarczenie dźwięku niespełniającego tych wymagań spowoduje odtwarzanie dźwięku domyślnego ( UILocalNotificationDefaultSoundName ).

Cel C

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

Szybki

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

Zarejestruj się i zaplanuj lokalne powiadomienia w Swift 3.0 (iOS 10)

Rejestracja

w AppDelegate

import UserNotifications

w metodzie didFinishLaunchingWithOptions

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

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

}

Utwórz i zaplanuj powiadomienie.

    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)

Gdziekolwiek ta część kodu zostanie uruchomiona, jeśli zezwoliłeś na Powiadomienie, otrzymasz powiadomienie.

Aby przetestować go poprawnie, upewnij się, że aplikacja działa w trybie tła.

co nowego w UILocalNotification z iOS10

Możesz użyć UILocalNotification , stare interfejsy API również działają dobrze z iOS10, ale zamiast tego lepiej było używać interfejsów API w ramach powiadomień użytkowników. Istnieją również nowe funkcje, z których można korzystać tylko w systemie powiadomień użytkowników iOS10.

Dzieje się tak również ze zdalnym powiadomieniem, aby uzyskać więcej informacji: tutaj .

Nowe funkcje:

  1. Teraz możesz wyświetlać alert, dźwięk lub zwiększyć odznakę, gdy aplikacja jest na pierwszym planie, także w systemie iOS 10
  2. Teraz możesz obsłużyć wszystkie zdarzenia w jednym miejscu, gdy użytkownik stuknie (lub przesunie) przycisk akcji, nawet gdy aplikacja została już zabita.
  3. Obsługuje dotyk 3D zamiast przesuwanego gestu.
  4. Teraz możesz usunąć określone lokalne powiadomienie tylko za pomocą jednego kodu wiersza.
  5. Obsługuje zaawansowane powiadomienia z niestandardowym interfejsem użytkownika.

To jest naprawdę łatwe dla nas, aby przekształcić UILocalNotification API do iOS10 użytkownika API Powiadomienia ramowych, są bardzo podobne.

Piszę tutaj Demo, aby pokazać, jak korzystać z nowych i starych interfejsów API jednocześnie: iOS10AdaptationTips .

Na przykład,

Dzięki implementacji Swift:

  1. import UserNotifications
    ///    Notification become independent from UIKit
    import UserNotifications
  1. zażądać autoryzacji dla localNotification

        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
            // Enable or disable features based on authorization.
        }
    
  1. harmonogram lokalnych powiadomień

  2. zaktualizuj numer identyfikacyjny ikony aplikacji

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

Realizacja celu C:

  1. import UserNotifications
    // Notifications are independent from UIKit
    #import <UserNotifications/UserNotifications.h>
  1. zażądać autoryzacji dla 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. harmonogram lokalnych powiadomień

  2. zaktualizuj numer identyfikacyjny ikony aplikacji

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

Przejdź tutaj, aby uzyskać więcej informacji: iOS10AdaptationTips .

#aktualizowane

Zamykanie aplikacji z powodu nieprzechwyconego wyjątku „NSInternalInconsistencyException”, powód: „odstęp czasu musi wynosić co najmniej 60, jeśli powtarza się”

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow