Zusammenfassung der neuen iOS-Feature-Updates

Neue Funktionen in iOS 14

Die neuen Funktionen in iOS 14 umfassen vor allem APP Clip, Zwischenablage, Datenschutz und weitere Neuerungen. Es gibt keine neuen Funktionen im Zusammenhang mit Benachrichtigungen.

Neue Funktionen in iOS 13

Die neuen Funktionen von iOS 13 beinhalten insbesondere den Dunkelmodus (Dark Mode), Swift UI und weitere Verbesserungen. Es gibt keine neuen Funktionen im Zusammenhang mit Benachrichtigungen.

Neue Funktionen in iOS 12

Gruppierung von Push-Benachrichtigungen

In iOS 12 werden Push-Benachrichtigungen desselben Typs zu einer Benachrichtigungsgruppe zusammengefasst. Nutzer:innen können alle Benachrichtigungen in der Gruppe durch Antippen der Benachrichtigungsgruppe einsehen.
Gruppierte Benachrichtigungen in iOS 12

Für die Gruppierung von Benachrichtigungen gibt es zwei Methoden: Automatische Gruppierung und Thread-Identifier. Bei der automatischen Gruppierung müssen Entwickler:innen nichts weiter tun, das System gruppiert die Push-Benachrichtigungen anhand der BundleId der App. Wer Benachrichtigungen gezielter gruppieren möchte, muss Thread-Identifier verwenden.
Automatische Gruppierung
Thread-Identifier Gruppierung
Nutzer:innen können Gruppen (automatisch, nach App, aus) einstellen.

Das Attribut Thread-Identifier existiert bereits seit iOS 10, aber erst ab iOS 12 wird damit die Gruppierung tatsächlich umgesetzt.

// Die eindeutige Kennung für den Thread oder die Konversation, die mit dieser Benachrichtigungsanfrage verknüpft ist. Sie wird verwendet, um Benachrichtigungen visuell zu gruppieren. @property (NS_NONATOMIC_IOSONLY, copy) NSString *threadIdentifier __TVOS_PROHIBITED;
              
              // Die eindeutige Kennung für den Thread oder die Konversation, die mit dieser Benachrichtigungsanfrage verknüpft ist. Sie wird verwendet, um Benachrichtigungen visuell zu gruppieren.
@property (NS_NONATOMIC_IOSONLY, copy) NSString *threadIdentifier __TVOS_PROHIBITED;

            
Diesen Codeblock im schwebenden Fenster anzeigen

Zusammenfassungsformat einstellen

Nach der automatischen Gruppierung von Benachrichtigungen erscheint unten eine Nachrichten-Zusammenfassung. Das Standardformat lautet: n weitere Benachrichtigungen. Das Format kann individuell angepasst werden.

Erstens: Format-Anpassung über UNNotificationCategory

+ (instancetype)categoryWithIdentifier:(NSString *)identifier actions:(NSArray<UNNotificationAction *> *)actions intentIdentifiers:(NSArray<NSString *> *)intentIdentifiers hiddenPreviewsBodyPlaceholder:(nullable NSString *)hiddenPreviewsBodyPlaceholder categorySummaryFormat:(nullable NSString *)categorySummaryFormat options:(UNNotificationCategoryOptions)options __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED;
              
              + (instancetype)categoryWithIdentifier:(NSString *)identifier
                               actions:(NSArray<UNNotificationAction *> *)actions
                     intentIdentifiers:(NSArray<NSString *> *)intentIdentifiers
         hiddenPreviewsBodyPlaceholder:(nullable NSString *)hiddenPreviewsBodyPlaceholder
                 categorySummaryFormat:(nullable NSString *)categorySummaryFormat
                               options:(UNNotificationCategoryOptions)options __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED;

            
Diesen Codeblock im schwebenden Fenster anzeigen

Zweitens: Anpassung über UNNotificationContent

/// Das Argument, das in die Zusammenfassung für diese Benachrichtigung eingefügt wird. @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSString *summaryArgument __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED; /// Eine Zahl, die angibt, wie viele Elemente in der Zusammenfassung durch diese Benachrichtigung repräsentiert werden. /// Beispiel: Wenn eine Podcast-App eine Benachrichtigung für 3 neue Episoden einer Show sendet, /// sollte das Argument der Name der Show und der Wert 3 sein. /// Standard ist 1 und darf nicht 0 sein. @property (NS_NONATOMIC_IOSONLY, readonly, assign) NSUInteger summaryArgumentCount __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED;
              
              /// Das Argument, das in die Zusammenfassung für diese Benachrichtigung eingefügt wird.
@property (NS_NONATOMIC_IOSONLY, readonly, copy) NSString *summaryArgument __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED;

/// Eine Zahl, die angibt, wie viele Elemente in der Zusammenfassung durch diese Benachrichtigung repräsentiert werden.
/// Beispiel: Wenn eine Podcast-App eine Benachrichtigung für 3 neue Episoden einer Show sendet,
/// sollte das Argument der Name der Show und der Wert 3 sein.
/// Standard ist 1 und darf nicht 0 sein.
@property (NS_NONATOMIC_IOSONLY, readonly, assign) NSUInteger summaryArgumentCount __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED;

            
Diesen Codeblock im schwebenden Fenster anzeigen

Benachrichtigungsverwaltung

Apple hat einen „Verwalten“-Button für Nachrichten eingeführt, der durch Wischen nach links erscheint.
Verwalten-Button für Nachrichten

Temporäre Berechtigung

Die temporäre Autorisierung zeigt sich darin, dass bei Push-Nachrichten zwei Buttons angezeigt werden, mit denen Nutzer:innen aktiv eine Auswahl treffen können.
Temporäre Autorisierung bei Push-Nachrichten

Warnhinweise

Zum Beispiel bei Familien- oder Gesundheitsschutz, öffentlicher Sicherheit und ähnlichen Faktoren. Diese Nachrichten erfordern, dass Nutzer:innen zwingend reagieren. Ein einfaches Szenario: Wir haben eine Kamera im Haus installiert und sind auf der Arbeit. Wenn jemand das Haus betritt, sendet die Kamera eine Nachricht. Für diese Art von Benachrichtigung ist ein spezielles Zertifikat erforderlich.
Warnhinweise für kritische Benachrichtigungen

Neue Funktionen in iOS 10

Hinweise

iOS 10 bringt zahlreiche neue Funktionen rund um Benachrichtigungen. Weitere Details finden Sie im offiziellen Blog von engagelab.

iOS 10 Service Extension

Hinweise

Mit iOS 10 wurde die Service Extension eingeführt.
Service Extension Übersicht
Das bedeutet, dass APNs vor der Zustellung auf das Gerät von einer Extension-Schicht verarbeitet werden, die es Nutzer:innen ermöglicht, eigene Einstellungen vorzunehmen und APNs zu individualisieren.

Verwendung

Die Nutzung der Service Extension ist einfach. Zunächst muss eine Service Extension erstellt werden, wie im folgenden Bild dargestellt:
Service Extension erstellen

Wichtige Hinweise:

  • Die Bundle Identifier der Service Extension darf nicht mit dem Bundle Identifier des Main Targets (der eigenen App) identisch sein. Andernfalls tritt ein Fehler wegen doppelter BundleID auf.
  • Der Bundle Identifier der Service Extension muss im Namensraum des Main Targets liegen. Beispiel: Ist die BundleID des Main Targets io.mtpush.xxx, sollte die BundleID der Service Extension das Format io.mtpush.xxx.yyy haben. Andernfalls kann es zu Fehlern kommen.

Nach erfolgreicher Erstellung und Nutzung der Service Extension erscheint in Ihrem Projekt eine Klasse mit zwei Methoden:

  • didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent *contentToDeliver))contentHandler
  • serviceExtensionTimeWillExpire

Die erste Methode wird aufgerufen, wenn APNs ankommt. Hier kann der Inhalt der Push-Benachrichtigung verarbeitet und über contentHandler weitergegeben werden. Wird die Methode nicht rechtzeitig abgeschlossen, wird die Benachrichtigung im Originalzustand angezeigt. Das bedeutet, dass Benachrichtigungen in dieser Methode personalisiert werden können.

Die zweite Methode dient als Fallback und wird kurz vor Ablauf aufgerufen, um letzte Anpassungen vorzunehmen.

Integration in iOS 9

Änderungen in iOS 9 betreffen folgende SDK-Bereiche:

  • Hinzufügen des bitCode-Codierungsformats. Wird bitCode vom SDK nicht unterstützt, kann die Option bei der Integration nicht aktiviert werden.
    • Symptom: Nach der Integration schlägt die Kompilierung fehl, im Fehlerprotokoll steht ein bitCode-Fehler.
  • Standardmäßig ist die Verbindung https. Für http-Anfragen muss die plist manuell angepasst werden. Alle Serveranfragen laufen aktuell über http.
    • Symptom: Nach der Integration schlagen alle http-Dienste von MTPush fehl (Verbindungsfehler oder Timeout).

bitCode-Lösung

  • Ab MTPush iOS SDK v1.8.7 wird bitCode unterstützt.

Https-Lösung

Für MTPush 2.0.0 oder höher nicht mehr erforderlich.

  • In der Info.plist des Projekts muss der Typ NSAppTransportSecurity als Dictionary hinzugefügt werden.
  • Unter NSAppTransportSecurity muss NSAllowsArbitraryLoads (Boolean) auf YES gesetzt werden.

iOS 9 UIUserNotificationActionBehaviorTextInput

Unterstützte Version

Ab Version v1.8.0 verfügbar.

  1. Die größte Änderung im Bereich Push ist die Erweiterung der Kategorie-Typen um eine Text-Action. Damit können Nutzer:innen direkt über die Benachrichtigung Texte eingeben.
  2. Die Kategorie besteht aus mehreren UIUserNotificationCategory-Objekten. Jedes erlaubt das Hinzufügen von UIMutableUserNotificationAction-Parametern, um weitere Aktionen in der Benachrichtigungsleiste bereitzustellen. Neu in iOS 9 ist der Text-Input-Typ (UIUserNotificationActionBehaviorTextInput), der über das behavior-Attribut gesetzt wird.
  3. Zwei neue Callback-Methoden verarbeiten Button-Events:
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0) - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0)
              
              - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0)

- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0)

            
Diesen Codeblock im schwebenden Fenster anzeigen

Hinweis:

  • Bei UIUserNotificationActionBehaviorTextInput kann über responseInfo[UIUserNotificationActionResponseTypedTextKey] der eingegebene Text abgefragt werden, mit UIUserNotificationTextInputActionButtonTitleKey der geklickte Button.
  • Bei UIUserNotificationActionBehaviorDefault ist responseInfo nil; die Unterscheidung erfolgt über identifier.

Client-Einstellungen

Benachrichtigungen mit Schnellantwort einrichten

# ifdef __IPHONE_9_0 UIMutableUserNotificationAction *replyAction = [[UIMutableUserNotificationAction alloc]init]; replyAction.title = @"Antworten"; replyAction.identifier = @"comment-reply"; replyAction.activationMode = UIUserNotificationActivationModeBackground; replyAction.behavior = UIUserNotificationActionBehaviorTextInput; UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc]init]; category.identifier = @"reply"; [category setActions:@[replyAction] forContext:UIUserNotificationActionContextDefault]; # endif
              
              # ifdef __IPHONE_9_0 
 UIMutableUserNotificationAction *replyAction = [[UIMutableUserNotificationAction alloc]init];
 replyAction.title = @"Antworten";
 replyAction.identifier = @"comment-reply";
 replyAction.activationMode = UIUserNotificationActivationModeBackground;
 replyAction.behavior = UIUserNotificationActionBehaviorTextInput;
  
 UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc]init];
 category.identifier = @"reply";
 [category setActions:@[replyAction] forContext:UIUserNotificationActionContextDefault];
# endif

            
Diesen Codeblock im schwebenden Fenster anzeigen

Callback-Funktionen verwenden

- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler { if ([identifier isEqualToString:@"comment-reply"]) { NSString *response = responseInfo[UIUserNotificationActionResponseTypedTextKey]; // Verarbeite den eingegebenen Text } completionHandler(); }
              
              - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler {
    if ([identifier isEqualToString:@"comment-reply"]) {
        NSString *response = responseInfo[UIUserNotificationActionResponseTypedTextKey];
        // Verarbeite den eingegebenen Text
    }
    completionHandler();
}

            
Diesen Codeblock im schwebenden Fenster anzeigen

Server-Einstellungen

Im Server-Payload muss das Feld category ergänzt werden. Wenn dieses mit der identifier der Client-Kategorie übereinstimmt, werden die Aktionen und Buttons angezeigt.

{"aps":{"alert":"example", "sound":"default", "badge": 1, "category":"reply"}}
              
              {"aps":{"alert":"example", "sound":"default", "badge": 1, "category":"reply"}}

            
Diesen Codeblock im schwebenden Fenster anzeigen

iOS 8 UILocalNotification

Drei neue Parameter wurden zu UILocalNotification in iOS 8 hinzugefügt: region, regionTriggersOnce und category.

  • region: Steuert, ob beim Betreten oder Verlassen eines geografischen Bereichs eine Benachrichtigung ausgelöst wird. Dafür ist die „Beim Verwenden“-Berechtigung für CoreLocation erforderlich.
  • regionTriggersOnce (BOOL): Ist dieser Wert YES, wird die Benachrichtigung nur einmal ausgelöst, bei NO bei jedem Betreten/Verlassen.
  • category: Wenn localNotification über + [UIUserNotificationSettings SettingsForUserNotificationTypes: userNotificationActionSettings:] registriert wurde, kann über category die registrierte Kategorie abgerufen werden.

Client-Einstellungen

Verwendung von UILocalNotification

// Lokale Benachrichtigung setzen CLLocationCoordinate2D coordinate2D; coordinate2D.latitude = 100.0; coordinate2D.longitude = 100.0; CLRegion *currentRegion = [[CLCircularRegion alloc] initWithCenter:coordinate2D radius:CLLocationDistanceMax identifier:@"test"]; [APService setLocalNotification:[NSDate dateWithTimeIntervalSinceNow:120] alertBody:@"test ios8 notification" badge:0 alertAction:@"Abbrechen" identifierKey:@"1" userInfo:nil soundName:nil region:currentRegion regionTriggersOnce:YES category:@"test"];
              
              // Lokale Benachrichtigung setzen
CLLocationCoordinate2D coordinate2D;
coordinate2D.latitude = 100.0;
coordinate2D.longitude = 100.0;
CLRegion *currentRegion =
    [[CLCircularRegion alloc] initWithCenter:coordinate2D
                                      radius:CLLocationDistanceMax
                                  identifier:@"test"];

[APService setLocalNotification:[NSDate dateWithTimeIntervalSinceNow:120]
                      alertBody:@"test ios8 notification"
                          badge:0
                    alertAction:@"Abbrechen"
                  identifierKey:@"1"
                       userInfo:nil
                      soundName:nil
                         region:currentRegion
             regionTriggersOnce:YES
                       category:@"test"];

            
Diesen Codeblock im schwebenden Fenster anzeigen

iOS 8 UIUserNotificationSettings

Unterstützte Version

Ab Version v1.8.0 verfügbar.

Client-Einstellungen

Verwendung von UIUserNotificationCategory

if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { NSMutableSet *categories = [NSMutableSet set]; UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init]; category.identifier = @"identifier"; UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init]; action.identifier = @"test2"; action.title = @"Test"; action.activationMode = UIUserNotificationActivationModeBackground; action.authenticationRequired = YES; // YES wird rot angezeigt, NO blau action.destructive = NO; NSArray *actions = @[action]; [category setActions:actions forContext:UIUserNotificationActionContextMinimal]; [categories addObject:category]; }
              
              if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
    NSMutableSet *categories = [NSMutableSet set];

    UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];

    category.identifier = @"identifier";

    UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init];

    action.identifier = @"test2";

    action.title = @"Test";

    action.activationMode = UIUserNotificationActivationModeBackground;

    action.authenticationRequired = YES;

    // YES wird rot angezeigt, NO blau
    action.destructive = NO;

    NSArray *actions = @[action];

    [category setActions:actions forContext:UIUserNotificationActionContextMinimal];

    [categories addObject:category];
}

            
Diesen Codeblock im schwebenden Fenster anzeigen

Verwendung von UIUserNotificationType

if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:categories]; } else { [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil]; }
              
              if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
    [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:categories];
} else {
    [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
}

            
Diesen Codeblock im schwebenden Fenster anzeigen

Callback-Funktionen verwenden

// Wird aufgerufen, wenn die App durch Auswahl einer Aktion aus einer Remote-Benachrichtigung aktiviert wurde. // Ein nil-Action-Identifier steht für die Standardaktion. // Der Completion-Handler sollte so bald wie möglich nach der Verarbeitung aufgerufen werden. - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler {}
              
              // Wird aufgerufen, wenn die App durch Auswahl einer Aktion aus einer Remote-Benachrichtigung aktiviert wurde.
// Ein nil-Action-Identifier steht für die Standardaktion.
// Der Completion-Handler sollte so bald wie möglich nach der Verarbeitung aufgerufen werden.
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo
  completionHandler:(void (^)())completionHandler {}

            
Diesen Codeblock im schwebenden Fenster anzeigen

Server-Einstellungen

Im Server-Payload muss das Feld category ergänzt werden. Wenn dieses mit der identifier der Client-Kategorie übereinstimmt, werden die Aktionen und Buttons angezeigt.

{"aps":{"alert":"example", "sound":"default", "badge": 1, "category":"identifier"}}
              
              {"aps":{"alert":"example", "sound":"default", "badge": 1, "category":"identifier"}}

            
Diesen Codeblock im schwebenden Fenster anzeigen

iOS 7 Hintergrund-Push-Benachrichtigung

Die größte Neuerung im Bereich Push in iOS 7 ist die Möglichkeit, nach Empfang einer Benachrichtigung im Hintergrund Code auszuführen, um z. B. Updates vom Server zu erhalten. Anwendungsszenarien: (Multimedia-)Chat, E-Mail-Updates, abonnierte Inhalte synchronisieren – für ein besseres Nutzer:innenerlebnis.

Der Unterschied zu früheren Versionen ist in den beiden offiziellen Apple-Grafiken unten zu sehen.
Push-Benachrichtigung iOS 6
Push-Benachrichtigung iOS 7

Wenn nur content-available: 1 gesendet wird, ohne badge, sound oder Nachricht, können Inhalte im Hintergrund aktualisiert werden, ohne die Nutzer:innen zu stören. Diese werden als „Silent Remote Notifications“ bezeichnet.
Silent Remote Notifications

Client-Einstellungen

Remote-Benachrichtigungen aktivieren

In Xcode müssen unter Capabilities die Remote notifications aktiviert werden.
Remote notifications aktivieren

Benachrichtigungs-Handler anpassen

Nach der Registrierung unter Background Modes -> Remote notifications wird der folgende Handler verwendet, in dem auch der Hintergrund-Code ausgeführt wird.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;
              
              - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;

            
Diesen Codeblock im schwebenden Fenster anzeigen

Server-Push-Einstellungen

Für Hintergrundausführung muss content-available: 1 im Push enthalten sein. Fehlt dieses Feld, verhält sich die Benachrichtigung wie in früheren iOS-Versionen.

Push über das Web-Portal

Unter Optionale Einstellungen die entsprechenden Parameter auswählen.
Web-Portal Push-Einstellungen

Push per API

Im Push-API für iOS muss einfach das Feld "content-available":true ergänzt werden (wird ab iOS 7 unterstützt).

Einschränkungen und Hinweise

  • „Silent Remote Notifications“ unterliegen den von Apple festgelegten Frequenzbegrenzungen. Nicht alle erreichen die gewünschte Client-Funktion.
  • Das Zeitfenster für Hintergrundausführung ist begrenzt. Für größere Downloads siehe Apples NSURLSession-Dokumentation.
  • Hintergrund-Push benötigt, dass die App im Hintergrund oder im Suspended-State ist. Wird die App vom Nutzer über den App Switcher beendet, kann sie nicht mehr für Hintergrund-Code geweckt werden.

Weitere Details finden Sie in der offiziellen iOS-Entwicklerdokumentation von Apple.

icon
Vertrieb kontaktieren