Suche…


Einführung

Lokale Benachrichtigungen ermöglichen es Ihrer App, den Benutzer über Inhalte zu informieren, für die kein Server erforderlich ist.

Im Gegensatz zu Remote-Benachrichtigungen, die von einem Server ausgelöst werden, werden lokale Benachrichtigungen in einer App geplant und ausgelöst. Benachrichtigungen zielen im Allgemeinen darauf ab, die Benutzerinteraktion mit der App zu verbessern, indem der Benutzer dazu eingeladen wird, die App zu öffnen und damit zu interagieren.

UILocalNotification wurde in iOS 10 nicht mehr unterstützt. Verwenden Sie stattdessen das Framework UserNotifications.

Bemerkungen

Verwechseln Sie UILocalNotification nicht mit Push-Benachrichtigungen. Die UILocalNotification wird von Ihrem Gerät ausgelöst und bei der Planung in das System kopiert.

Links:

Lokale Benachrichtigung planen

Stellen Sie sicher, dass Sie für lokale Benachrichtigungen registrieren sehen, damit dies funktioniert:

Schnell

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

Ziel c

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

Um die Benachrichtigung im iOS-Simulator ^⌘H , geben Sie ^⌘H (Steuerbefehl-H) ein, um nach Hause zu gelangen, und geben Sie dann ⌘L (Befehl-L) ein, um das Gerät zu sperren. Warten Sie einige Sekunden, und die Benachrichtigung sollte erscheinen (diese Erscheinung variiert je nach Benachrichtigungstyp, der unter "Registrieren für lokale Benachrichtigungen" beschrieben wird):

Lokales Benachrichtigungsbanner

Wischen Sie über die Benachrichtigung, um zur App zurückzukehren. Wenn Sie dies in viewDidLoad des ersten View-Controllers, viewWillAppear , viewDidAppear usw. viewDidAppear , wird die Benachrichtigung erneut geplant.

Registrierung für lokale Benachrichtigungen

iOS 8

Um dem Benutzer lokale Benachrichtigungen anzuzeigen, müssen Sie Ihre App beim Gerät registrieren:

Schnell

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

Ziel c

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

Beim ersten Aufruf wird eine Warnung angezeigt:

Registrieren Sie sich für lokale Benachrichtigungen

Unabhängig davon, was der Benutzer auswählt, wird die Warnung nicht erneut angezeigt und Änderungen müssen vom Benutzer in den Einstellungen vorgenommen werden.

Antwort auf empfangene lokale Benachrichtigung

WICHTIG: Diese Delegatmethode wird nur im Vordergrund aufgerufen.

Schnell

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

Ziel c

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

Diese Methode wird im Allgemeinen in AppDelegate überschrieben, das dem UIApplicationDelegate-Protokoll entspricht.

Lokale Benachrichtigungen mit UUID verwalten

Oft müssen Sie Ihre Benachrichtigungen verwalten können, indem Sie sie nachverfolgen und abbrechen können.

Eine Benachrichtigung verfolgen

Sie können einer Benachrichtigung eine UUID (universell eindeutiger Bezeichner) zuweisen, um sie nachverfolgen zu können:

Schnell

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

Ziel c

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

Eine Benachrichtigung abbrechen

Um eine Benachrichtigung abzubrechen, erhalten wir zunächst eine Liste aller Benachrichtigungen und suchen dann die Benachrichtigung mit einer entsprechenden UUID. Zum Schluss stornieren wir es.

Schnell

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

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

Sie möchten wahrscheinlich alle diese UUIDs in Core Data oder Realm speichern.

Eine lokale Benachrichtigung wird sofort angezeigt

Wenn Sie die lokale Benachrichtigung sofort anzeigen möchten, rufen Sie an:

Swift 3

UIApplication.shared.presentLocalNotificationNow(notification)

Schnell 2

UIApplication.sharedApplication().presentLocalNotificationNow(notification)

Ziel c

[[UIApplication sharedApplication] presentLocalNotificationNow:notification];

Dies hat den Vorteil, dass Sie die Eigenschaften fireDate und timeZone Ihres UILocalNotification Objekts nicht UILocalNotification .

Benachrichtigungston

Für Benachrichtigungen, die von Ihrer App generiert werden, können benutzerdefinierte Töne bereitgestellt werden. Wenn das System eine Benachrichtigung für eine lokale Benachrichtigung anzeigt oder ein App-Symbol kennzeichnet, wird dieses Geräusch abgespielt (solange der Benutzer die Benachrichtigungstöne nicht deaktiviert hat).

Der Standardwert ist Null, was bedeutet, dass für Ihre Benachrichtigung kein Ton abgespielt wird.

Um einen benutzerdefinierten Sound zu liefern, fügen Sie eine .caf , .wav oder .aiff - Datei auf Ihren App - Bundle. Sounds, die länger als 30 Sekunden dauern, werden nicht unterstützt. Wenn Sie einen Sound UILocalNotificationDefaultSoundName , der diese Anforderungen nicht erfüllt, wird der Standard-Sound UILocalNotificationDefaultSoundName ( UILocalNotificationDefaultSoundName ).

Ziel c

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

Schnell

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

Registrieren und Planen der lokalen Benachrichtigung in Swift 3.0 (iOS 10)

Anmeldung

in AppDelegate

import UserNotifications

in der Methode didFinishLaunchingWithOptions

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

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

}

Benachrichtigung erstellen und planen

    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)

Wenn dieser Teil des Codes ausgelöst wird, erhalten Sie eine Benachrichtigung, wenn Sie die Benachrichtigungsberechtigung erteilt haben.

Um es richtig zu testen, stellen Sie sicher, dass sich Ihre Anwendung im Hintergrundmodus befindet.

Was ist neu in UILocalNotification mit iOS10?

Sie können UILocalNotification , alte APIs funktionieren auch gut mit iOS10, aber wir sollten stattdessen die APIs im Framework für Benutzerbenachrichtigungen verwenden. Es gibt auch einige neue Funktionen, die Sie nur mit dem Benutzerbenachrichtigungs-Framework von iOS10 verwenden können.

Dies geschieht auch mit der Remote-Benachrichtigung, für weitere Informationen: Hier .

Neue Eigenschaften:

  1. Jetzt können Sie entweder Alarm ausgeben, ein Signal ausgeben oder das Abzeichen erhöhen, während sich die App auch mit iOS 10 im Vordergrund befindet
  2. Jetzt können Sie alle Ereignisse an einer Stelle abwickeln, wenn der Benutzer auf die Aktionsschaltfläche tippte (oder schob), selbst wenn die App bereits beendet wurde.
  3. Unterstützen Sie 3D-Touch anstelle von gleitender Geste.
  4. Jetzt können Sie spezifische lokale Benachrichtigungen nur durch einen Zeilencode entfernen.
  5. Rich-Benachrichtigung mit benutzerdefinierter Benutzeroberfläche unterstützen.

Es ist sehr einfach für uns, UILocalNotification APIs in iOS10-Benutzerbenachrichtigungs-Framework-APIs umzuwandeln, sie sind sich sehr ähnlich.

Ich schreibe hier eine Demo, um zu zeigen, wie neue und alte APIs gleichzeitig verwendet werden: iOS10AdaptationTips .

Zum Beispiel,

Mit Swift-Implementierung:

  1. UserNotifications importieren
    ///    Notification become independent from UIKit
    import UserNotifications
  1. Berechtigung für localNotification anfordern

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

  2. Anwendungssymbol-Ausweisnummer aktualisieren

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

Ziel-C-Implementierung:

  1. UserNotifications importieren
    // Notifications are independent from UIKit
    #import <UserNotifications/UserNotifications.h>
  1. Berechtigung für localNotification anfordern

    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 einplanen

  2. Anwendungssymbol-Ausweisnummer aktualisieren

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

Hier finden Sie weitere Informationen: iOS10AdaptationTips .

#aktualisierte

App wird wegen nicht abgerufener Ausnahme 'NSInternalInconsistencyException' beendet, Grund: 'Zeitintervall muss mindestens 60 sein, wenn wiederholt'

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow