# iOS-Nachrichtenzustellung nachverfolgen

Es gibt eine [API-Methode](/de/developer/api-reference/device-api#messagedeliveryevent) in Pushwoosh, die die Zustellung von Push-Benachrichtigungen verfolgt. iOS-Apps unterstützen diese Methode nicht standardmäßig, da Push-Benachrichtigungen auf iOS vom Betriebssystem und nicht vom Pushwoosh SDK gehandhabt werden. Sie können die Zustellungsverfolgung hinzufügen, indem Sie eine Notification Service Extension zu Ihrem Projekt hinzufügen. Diese Seite zeigt, wie Sie die Nachrichtenzustellungsverfolgung für iOS-Apps implementieren.

<Aside>
Erfordert Pushwoosh iOS SDK 7.x, das iOS 13.0 und höher unterstützt.
</Aside>

<Aside type="note">
Seit dem Pushwoosh iOS SDK 7.1.0 ist die empfohlene Integration die unten gezeigte Drop-in-Basisklasse `PushwooshNotificationServiceExtension`. Sie sendet das Ereignis der Nachrichtenzustellung, setzt das Badge, lädt den Medienanhang herunter und übernimmt für Sie den obligatorischen `serviceExtensionTimeWillExpire`-Fallback. Die ältere `PWNotificationExtensionManager`-API funktioniert weiterhin, ist aber veraltet – siehe [Legacy-Integration](#legacy-integration).
</Aside>

## Notification Service Extension hinzufügen

1. Wählen Sie in Xcode **File** > **New** > **Target...**

2. Wählen Sie **Notification Service Extension** und klicken Sie auf **Next.**

<img src="/ios-push-notifications-ios-message-delivery-tracking-1.webp" alt="Xcode-Zielvorlagenauswahl mit ausgewählter Notification Service Extension"/>

3. Geben Sie den Produktnamen ein und klicken Sie auf **Finish.**

<Aside type="caution">
Wählen Sie im Dialogfeld, das nach dem Klicken auf **Finish** angezeigt wird, nicht **Activate** aus.
</Aside>

4. Klicken Sie in der Aufforderung **Activate scheme** auf **Cancel**.

<img
  src="/ios-push-notifications-ios-message-delivery-tracking-2.webp"
  alt="Aufforderung zum Aktivieren des Schemas mit hervorgehobenem Abbrechen"
  style={{ display: "block", margin: "0 auto", maxWidth: "40%", height: "auto" }}
  width="400"
/>

Durch das Abbrechen stellen Sie sicher, dass Xcode weiterhin Ihre App anstelle der gerade erstellten Erweiterung debuggt. Wenn Sie es versehentlich aktiviert haben, können Sie innerhalb von Xcode wieder zum Debuggen Ihrer App wechseln.

## Abhängigkeiten für die Notification Service Extension (nur CocoaPods)

Wenn Sie den Swift Package Manager zur Verwaltung von Abhängigkeiten verwenden, können Sie diesen Schritt überspringen, da die Abhängigkeiten automatisch hinzugefügt werden.

Öffnen Sie Ihre `Podfile`-Datei und fügen Sie die Abhängigkeit für das Ziel hinzu:

```ruby title="Podfile"
target 'NotificationServiceExtension' do
  use_frameworks!
  pod 'PushwooshXCFramework'
end
```

Führen Sie die folgenden Befehle im Terminal aus, um die Abhängigkeiten zu installieren:

```shell
rm -rf Podfile.lock
pod deintegrate
pod setup
pod repo update
pod install
```

## Code zum Nachverfolgen von Nachrichtenzustellungsereignissen hinzufügen

Machen Sie Ihre Erweiterung zu einer Unterklasse von `PushwooshNotificationServiceExtension`. Eine leere Unterklasse ist ausreichend: Pushwoosh sendet das Nachrichtenzustellungsereignis, setzt das Badge, lädt den Medienanhang herunter und behandelt den Timeout-Fallback automatisch für Sie.

Ersetzen Sie den generierten Inhalt Ihrer **NotificationService**-Datei:

<Tabs>
<TabItem label="Swift">

```swift
import UserNotifications
import PushwooshFramework

class NotificationService: PushwooshNotificationServiceExtension {}
```

</TabItem>

<TabItem label="Objective-C">

```objective-c
#import <PushwooshFramework/PushwooshNotificationServiceExtension.h>

@interface NotificationService : PushwooshNotificationServiceExtension

@end

@implementation NotificationService

@end
```

</TabItem>
</Tabs>

<Aside type="tip">
Wenn Sie keinen benutzerdefinierten Code benötigen, können Sie die Quelldatei ganz weglassen und die `NSExtensionPrincipalClass` der Info.plist der Erweiterung direkt auf `PushwooshNotificationServiceExtension` verweisen lassen.
</Aside>

### App-ID

Seit Version 7.1.0 erbt die Erweiterung `Pushwoosh_APPID` (und andere `Pushwoosh_*`-Schlüssel) aus der Info.plist der Host-App, sodass Sie sie nicht mehr in der Erweiterung duplizieren müssen. Fügen Sie `Pushwoosh_APPID` nur dann zur Info.plist der Erweiterung hinzu, wenn Sie den Wert des Hosts überschreiben möchten:

```xml title="NotificationService/Info.plist"
<key>Pushwoosh_APPID</key>
<string>XXXXX-XXXXX</string>
```

<Aside type="note">
Bei Pushwoosh iOS SDK-Versionen vor 7.1.0 erbt die Erweiterung die Konfiguration nicht von der Host-App. Bei diesen Versionen müssen Sie `Pushwoosh_APPID` zur Info.plist der Erweiterung hinzufügen.
</Aside>

### App-Gruppe (Badge und Reverse-Proxy)

Eine zwischen der App und der Erweiterung geteilte App-Gruppe wird benötigt, um die Anzahl der Badges zu synchronisieren und die Reverse-Proxy-Einstellungen zu lesen, die die Host-App speichert.

1. Fügen Sie die Fähigkeit **App Groups** zum Erweiterungsziel hinzu und aktivieren Sie dort dieselbe Gruppe wie in der Host-App. Dies ist erforderlich – ohne den gemeinsamen Container können die Anzahl der Badges und die Reverse-Proxy-Einstellungen nicht synchronisiert werden.

2. Geben Sie den Namen der App-Gruppe an. Wie `Pushwoosh_APPID` erbt die Erweiterung seit Version 7.1.0 `PW_APP_GROUPS_NAME` aus der Info.plist der Host-App. Wenn Sie es dort also bereits für Badges festgelegt haben, müssen Sie es nicht zur Erweiterung hinzufügen. Legen Sie es in der Info.plist der Erweiterung nur fest, um den Host-Wert zu überschreiben, oder geben Sie es programmgesteuert an, indem Sie `pushwooshAppGroupsName` überschreiben.

```xml title="App Info.plist"
<key>PW_APP_GROUPS_NAME</key>
<string>group.com.example.app</string>
```

<Aside type="caution">
Wenn die Host-App einen Reverse-Proxy verwendet (`Pushwoosh_ALLOW_REVERSE_PROXY`), benötigt die Erweiterung diese App-Gruppe, um die dort von der App gespeicherte Proxy-URL zu lesen. Ohne sie wird das Zustellungsereignis zurückgehalten, anstatt direkt gesendet zu werden, wodurch der Proxy umgangen wird.
</Aside>

## Benachrichtigung anpassen (optional)

Die Basisklasse bietet einige Überschreibungspunkte, von der geringsten bis zur größten Kontrolle. Pushwoosh führt in jedem Fall weiterhin das Zustellungsereignis, das Badge, den Anhang und den Timeout-Fallback aus.

Legen Sie die App-Gruppe programmgesteuert fest, anstatt den Info.plist-Schlüssel zu verwenden:

```swift
override func pushwooshAppGroupsName() -> String? {
    "group.com.example.app"
}
```

Führen Sie eine asynchrone Vorbereitung durch, bevor Pushwoosh den Push verarbeitet – zum Beispiel das Vorabladen von Push-Stories-Medien – ohne die Standard-`didReceive` zu überschreiben. Rufen Sie `completion` genau einmal im Hauptthread auf:

```swift
override func pushwooshPrepare(for request: UNNotificationRequest,
                              completion: @escaping () -> Void) {
    // async work here
    completion()
}
```

Ändern Sie den Inhalt, bevor er angezeigt wird, indem Sie `didReceive` überschreiben. Rufen Sie `super` mit Ihrem eigenen Inhalts-Handler auf, ändern Sie den Inhalt darin und leiten Sie ihn dann an den ursprünglichen Handler weiter:

```swift
override func didReceive(_ request: UNNotificationRequest,
                         withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    super.didReceive(request) { content in
        let mutable = (content.mutableCopy() as? UNMutableNotificationContent) ?? content
        // customize `mutable` here
        contentHandler(mutable)
    }
}
```

## Legacy-Integration

<Aside type="caution">
`PWNotificationExtensionManager` ist seit Version 7.1.0 veraltet. Verwenden Sie es nur, wenn Sie `PushwooshNotificationServiceExtension` nicht unterklassifizieren können – zum Beispiel bei einer Erweiterung, die bereits eine Basisklasse eines anderen SDKs erweitert, oder bei einem plattformübergreifenden Wrapper (React Native, Flutter, Unity). Neue Integrationen sollten die oben genannte Basisklasse verwenden.
</Aside>

Diese Low-Level-API steuert die gleiche Verarbeitung (Zustellungsereignis, Badge, Anhang) von einer einfachen `UNNotificationServiceExtension` aus:

<Tabs>
<TabItem label="Swift">

```swift
import UserNotifications
import PushwooshFramework

class NotificationService: UNNotificationServiceExtension {

    override func didReceive(_ request: UNNotificationRequest,
                             withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        PWNotificationExtensionManager.sharedManager()
            .handleNotificationRequest(request, contentHandler: contentHandler)
    }
}
```

</TabItem>

<TabItem label="Objective-C">

```objective-c
#import "PWNotificationExtensionManager.h"

@interface NotificationService : UNNotificationServiceExtension

@end

@implementation NotificationService

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
                   withContentHandler:(void (^)(UNNotificationContent *))contentHandler {
    [[PWNotificationExtensionManager sharedManager] handleNotificationRequest:request
                                                              contentHandler:contentHandler];
}

@end
```

</TabItem>
</Tabs>

## Teilen Sie uns Ihr Feedback mit

Ihr Feedback hilft uns, eine bessere Erfahrung zu schaffen, daher würden wir uns freuen, von Ihnen zu hören, wenn Sie während des SDK-Integrationsprozesses auf Probleme stoßen. Wenn Sie auf Schwierigkeiten stoßen, zögern Sie bitte nicht, uns Ihre Gedanken [über dieses Formular](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform) mitzuteilen.