Anmelden

Notification Service Extension und kritische Push Nachrichten in Expo

Notification Service Extension und kritische Push Nachrichten in Expo
Technologie

24. August 2024 6 min lesen

Zuletzt geändert am 24. August 2024

Mit Version 1.0.1 warnt CheckOkay Beschützer auf iOS Geräten mit kritischen Push Nachrichten. Die Implementierung war allerdings schwieriger als gedacht. Die iOS und Android Apps von CheckOkay werden mit dem Expo Framework entwickelt und für Push Nachrichten verwenden wir die Expo Push Api. In dieser lassen sich leider keine APNS spezifischen Werte wie Folgende setzen.

"aps": {
    "criticalSound": {
        "critical": True,
        "name": 'default',
        "volume": 1.0,
    },
}

Aus diesem Grund setzen wir nun eine NSE (Notification Service Extension) ein. NSE's werden von iOS ausgeführt (selbst wenn die App terminiert ist) und können den Inhalt einer Push Nachricht modifizieren bevor diese angezeigt wird. Vereinfacht sieht unser NSE wie folgt aus:

#import "NotificationService.h"

@interface NotificationService ()

@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNNotificationRequest *receivedRequest;
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;

@end

@implementation NotificationService

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.receivedRequest = request;
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];

    NSString *criticalAlert = request.content.userInfo[@"body"][@"criticalAlert"];
    if ([criticalAlert isEqual: @"1"]) {
        self.bestAttemptContent.sound = [UNNotificationSound defaultCriticalSoundWithAudioVolume:1.0];
    }

    self.contentHandler(self.bestAttemptContent);
}

- (void)serviceExtensionTimeWillExpire {
    self.contentHandler(self.bestAttemptContent);
}

@end

Nun müssen wir die NSE in das Expo Projekt integrieren. Wird Expo im Bare Workflow genutzt, kann die NSE einfach über XCode hinzugefügt werden. Im Managed Workflow kann die NSE über ein Config Plugin eingerichtet werden. Wir haben uns dazu entschieden im Managed Workflow zu bleiben und nutzen das OneSignal Expo Plugin, wobei wir alle Referenzen auf das OneSignal SDK entfernt und nur die Funktionalität zum Konfigurieren der NSE übernommen haben.

Das modifizierte Config Plugin findest du auf unserem Github.