# Anpassen des iOS SDK

## Integration

* [Deep Linking](#deep-linking)
* [Universal Links](#universal-links)
* [In-App-Kauf-Tracking](#in-app-purchase-tracking)
* [Geozones-Push-Benachrichtigungen](#geozones-push-notifications)
* [Erstellen einer Rich-Media-Warteschlange](#creating-a-rich-media-queue)
* [Automatisches Abspielen eines Videos, das in einer Rich Notification mit Force Touch gesendet wird](#autoplay-a-video-sent-in-a-rich-notification-with-force-touch)
* [Benutzerdefinierter Push-Ton](#custom-push-sound)
* [iOS Provisional Push](#ios-provisional-push)


### Deep Linking

Fügen Sie in Ihrer **Info.plist**-Datei ein `URL types`-Array mit einem `URL Identifier` und einem `URL Scheme` hinzu.\
Im folgenden Beispiel ist das `URL Scheme` _com.pushwoosh_ und der `URL Identifier` ist _promotion_.

<img src="/ios-push-notifications-customizing-ios-sdk-3.webp" alt=""/>

Fügen Sie in Ihrer App-Delegate-Datei (normalerweise AppDelegate.m für iOS 12 und älter oder SceneDelegate.m für iOS 13 und neuer) die entsprechende openURL-Delegate-Funktion hinzu, wie im folgenden Beispiel beschrieben. Das Beispiel prüft auf die richtige Seite, parst den „id“-Wert aus der URL und öffnet als Reaktion den PromoPageViewController.

```AppDelegate.swift```
<Tabs>
<TabItem label="Swift">
```swift
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let page = components?.host
    var promotionId: String?

    if page == "promotion" {
        return
    }

    let items = components?.queryItems ?? []

    for item in items {
        if item.name == "id" {
            promotionId = item.value
        }
    }

    //show PromoPageViewController
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *page = components.host;
    NSString *promotionId = nil;

    //return if this is not a promotion deep link
    if(![page isEqualToString:@"promotion"])
        return NO;

    for(NSURLQueryItem *item in components.queryItems)
    {
        if([item.name isEqualToString:@"id"])
            promotionId = item.value;
    }

    PromoPageViewController *vc = [[PromoPageViewController alloc] init];
    vc.promotionId = promotionId
    [self presentViewController:vc animated:YES completion:nil];
}
```
</TabItem>
</Tabs>

```SceneDelegate.swift```
<Tabs>
<TabItem label="Swift">
```swift
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let urlContext = URLContexts.first else { return }
        
    let components = URLComponents(url: urlContext.url, resolvingAgainstBaseURL: false)
    let page = components?.host
    var promotionId: String?
        
    guard page == "promotion" else {
        return
    }
        
    let items = components?.queryItems ?? []
        
    for item in items {
        if item.name == "id" {
            promotionId = item.value
        }
    }
        
    //show PromoPageViewController
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (void)scene:(UIWindowScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
    UIOpenURLContext *urlContext = URLContexts.anyObject;
    if (!urlContext) {
        return;
    }

    NSURLComponents *components = [NSURLComponents componentsWithURL:urlContext.URL resolvingAgainstBaseURL:NO];
    NSString *page = components.host;
    NSString *promotionId = nil;

    if (![page isEqualToString:@"promotion"]) {
        return;
    }

    for (NSURLQueryItem *item in components.queryItems) {
        if ([item.name isEqualToString:@"id"]) {
            promotionId = item.value;
        }
    }

    //show PromoPageViewController
}
```

</TabItem>
</Tabs>

### Universal Links

Universal Links ermöglichen es Benutzern, Ihre App direkt zu öffnen, wenn sie auf einen Link zu Ihrer Website tippen. Im Gegensatz zu benutzerdefinierten URL-Schemata verwenden Universal Links Standard-`https://`-URLs und bieten eine nahtlosere Benutzererfahrung.

<Aside type="note">
Ab **SDK-Version 7.0.15** leitet das Pushwoosh iOS SDK Universal Links von Push-Benachrichtigungen automatisch an die Handler Ihrer App weiter, anstatt sie in Safari zu öffnen.
</Aside>

#### Wie es funktioniert

Wenn eine Push-Benachrichtigung eine `https://`-URL enthält (im Parameter "url" oder "l"), wird das SDK:

1. Eine `NSUserActivity` mit der URL erstellen
2. Den Universal-Links-Handler Ihrer App aufrufen (`scene:continueUserActivity:` oder `application:continueUserActivity:restorationHandler:`)
3. Wenn Ihre App die URL nicht verarbeitet, wird sie als Fallback in Safari geöffnet

#### Einrichtung

1. **Konfigurieren Sie Associated Domains in Xcode**

Fügen Sie die Associated Domains-Fähigkeit zu Ihrer App hinzu und fügen Sie Ihre Domain hinzu:

```
applinks:yourdomain.com
```

2. **Hosten Sie die Apple App Site Association-Datei**

Erstellen Sie eine `apple-app-site-association`-Datei auf Ihrem Webserver unter `https://yourdomain.com/.well-known/apple-app-site-association`:

```json
{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "TEAM_ID.com.your.bundleid",
        "paths": ["/path/*", "/promotion/*"]
      }
    ]
  }
}
```

Ersetzen Sie `TEAM_ID` durch Ihre Apple Developer Team ID und `com.your.bundleid` durch die Bundle-ID Ihrer App.

3. **Implementieren Sie den Universal-Links-Handler**

```SceneDelegate.swift``` (iOS 13+)
<Tabs>
<TabItem label="Swift">
```swift
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
          let url = userActivity.webpageURL else {
        return
    }

    // Handle the Universal Link URL
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let path = components?.path

    if path?.starts(with: "/promotion") == true {
        // Navigate to promotion screen
        let promotionId = components?.queryItems?.first(where: { $0.name == "id" })?.value
        // Show promotion with promotionId
    }
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
    if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        return;
    }

    NSURL *url = userActivity.webpageURL;
    if (!url) {
        return;
    }

    // Handle the Universal Link URL
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *path = components.path;

    if ([path hasPrefix:@"/promotion"]) {
        // Navigate to promotion screen
        NSString *promotionId = nil;
        for (NSURLQueryItem *item in components.queryItems) {
            if ([item.name isEqualToString:@"id"]) {
                promotionId = item.value;
                break;
            }
        }
        // Show promotion with promotionId
    }
}
```
</TabItem>
</Tabs>

```AppDelegate.swift``` (iOS 12 und früher, oder als Fallback)
<Tabs>
<TabItem label="Swift">
```swift
func application(_ application: UIApplication,
                 continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
          let url = userActivity.webpageURL else {
        return false
    }

    // Handle the Universal Link URL
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let path = components?.path

    if path?.starts(with: "/promotion") == true {
        // Navigate to promotion screen
        return true
    }

    return false
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (BOOL)application:(UIApplication *)application
        continueUserActivity:(NSUserActivity *)userActivity
          restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *restorableObjects))restorationHandler {

    if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        return NO;
    }

    NSURL *url = userActivity.webpageURL;
    if (!url) {
        return NO;
    }

    // Handle the Universal Link URL
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *path = components.path;

    if ([path hasPrefix:@"/promotion"]) {
        // Navigate to promotion screen
        return YES;
    }

    return NO;
}
```
</TabItem>
</Tabs>

#### Senden einer Push-Benachrichtigung mit Universal Link

Verwenden Sie beim Erstellen einer Push-Benachrichtigung Ihre Website-URL im Feld **Aktion**:

```
https://yourdomain.com/promotion?id=123
```

Das SDK leitet diese URL automatisch an Ihren Universal-Links-Handler weiter, sodass Sie den Benutzer zum entsprechenden Bildschirm in Ihrer App navigieren können.

<Aside type="tip">
Universal Links bieten eine bessere Benutzererfahrung als benutzerdefinierte URL-Schemata, da sie auch dann funktionieren, wenn Ihre App nicht installiert ist – der Benutzer wird stattdessen auf Ihre Website weitergeleitet.
</Aside>

### In-App-Kauf-Tracking

Standardmäßig ist das Tracking von In-App-Käufen deaktiviert. Wenn Sie In-App-Käufe beim Konfigurieren von [Customer Journeys](/de/product/customer-journey/pushwoosh-journey-overview) verfolgen möchten, setzen Sie das Flag _Pushwoosh\_PURCHASE\_TRACKING\_ENABLED_ in der _info.plist_-Datei auf _true_. Eine Liste der verfügbaren Flags finden Sie in der [Tabelle](/de/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/advanced-integration-guide/#complete-list-of-infoplist-properties).

Wenn Sie In-App-Käufe manuell verfolgen möchten, können Sie den folgenden Code verwenden.

Rufen Sie in der `paymentQueue:updatedTransactions:`-Delegate-Methode die `sendSKPaymentTransactions`-Methode von `PushManager` auf.

<Tabs>
<TabItem label="Swift">
```swift
 func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
     // In-Apps Tracking Pushwoosh code here
     Pushwoosh.sharedInstance().sendSKPaymentTransactions(transactions)
     // the rest of the code, consume transactions, etc
 }
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {

  [[PushNotificationManager pushManager] sendSKPaymentTransactions:transactions];

  //the rest of the code, consume transactions, etc
}
```
</TabItem>
</Tabs>

<img src="/ios-push-notifications-customizing-ios-sdk-4.webp" alt="InAppTrackingViewController.swift"/>

<LinkCard title="Beispiel" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/In-Apps%20Tracking/InAppTrackingViewController.swift" />

### Geozones-Push-Benachrichtigungen

Geozones-Push-Benachrichtigungen sind in einem separaten Framework **PushwooshGeozones** gekapselt.

1. Fügen Sie PushwooshGeozones.framework zu Ihrem Projekt hinzu

Um PushwooshGeozones.framework mit einem Abhängigkeitsmanager zu Ihrem Projekt hinzuzufügen, fügen Sie die folgenden Zeilen in Ihre `podfile` oder `cartfile` ein:

<Tabs>
  <TabItem value="podfile" label="Podfile">

  ```plaintext
  pod 'PushwooshXCFramework/Geozones'
  ```

  </TabItem>
  
  <TabItem value="carfile" label="Carfile">

  ```plaintext
  github "Pushwoosh/pushwoosh-ios-sdk"
  ```

  </TabItem>
  
  <TabItem value="swiftpm" label="SwiftPM">
  
  Wenn Sie **PushwooshGeozones.xcframework** verwenden möchten, geben Sie die folgende Paket-URL ein:  
  [PushwooshGeozones-XCFramework](https://github.com/Pushwoosh/PushwooshGeozones-XCFramework)  

  </TabItem>
</Tabs>


Alternativ können Sie das Framework einfach per Drag & Drop in **Link Binaries With Libraries** in den **Build Phases** Ihres Projekts ziehen.


2. Fügen Sie die folgenden Schlüssel zu Ihrer Info.plist hinzu:

- **NSLocationWhenInUseUsageDescription** – *(erforderlich)*, damit die App Geozones nur verfolgt, während sie im Vordergrund läuft.  
- **NSLocationAlwaysAndWhenInUseUsageDescription** – *(erforderlich)*, damit die App Geozones **sowohl im Vordergrund als auch im Hintergrund** verfolgt und ein Popup-Dialog zur Berechtigungsanfrage anzeigt.  
- **NSLocationAlwaysUsageDescription** – *(optional)*, damit die App Geozones **jederzeit** verfolgt; sollte verwendet werden, wenn Ihre App auf iOS 10 und frühere Versionen abzielt.  

```xml
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>for app to track Geozones in both conditions and to show a permission request dialog</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>for app to track Geozones only while running in the foreground</string>
```
![]() 

<LinkCard title="Pushwoosh Info.plist Beispiel" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Info.plist" />

3. Importieren Sie das Framework

<Tabs>
  <TabItem value="swift" label="Swift">

  ```swift
  import PushwooshGeozones
  ```

  </TabItem>
  
  <TabItem value="objective-c" label="Objective-C">

  ```objc
  #import <PushwooshGeozones/PWGeozonesManager.h>
  ```

  </TabItem>
</Tabs>

4. Starten Sie das Geozones-Tracking

<Tabs>
  <TabItem value="swift" label="Swift">

  ```swift
  PWGeozonesManager.shared()?.startLocationTracking()
  ```

  [GitHub-Referenz](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/Geozones%20Push%20Notification/GeozonesViewController.swift)

  </TabItem>
  
  <TabItem value="objective-c" label="Objective-C">

  ```objc
  [[PWGeozonesManager sharedManager] startLocationTracking];
  ```

  [GitHub-Referenz](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Geozones%20Push%20Notification/PWGeozonesViewController.m)

  </TabItem>
</Tabs>

##### Beispiel 
<Tabs>
  <TabItem value="swift" label="Swift-Beispiel">

  ```swift
  override func viewDidLoad() {
      super.viewDidLoad()

      // Start Geozones tracking when needed
      PWGeozonesManager.shared().startLocationTracking()
  }
  ```

  </TabItem>
  
  <TabItem value="objective-c" label="Objective-C-Beispiel">

  ```objc
  - (void)viewDidLoad {
      [super viewDidLoad];
      // Do any additional setup after loading the view.

      // Start Geozones tracking when needed
      [[PWGeozonesManager sharedManager] startLocationTracking];
  }
  ```

  </TabItem>
</Tabs>


### Erstellen einer Rich-Media-Warteschlange

Falls mehrere Rich-Media-Seiten gleichzeitig angezeigt werden sollen (z. B. wenn Trigger-Ereignisse für zwei oder mehr In-Apps gleichzeitig stattfinden oder eine Rich-Media-Seite bereits angezeigt wird, wenn ein anderes Trigger-Ereignis auftritt), können Sie eine Warteschlange für die Anzeige von Rich-Media-Seiten einrichten. Um eine Warteschlange zu erstellen, folgen Sie den unten beschriebenen Schritten.

1. Erstellen Sie eine Klasse, die PWRichMediaPresentingDelegate implementiert:

```objective-c
@interface ChainedRichMediaPresentingDelegate () <PWRichMediaPresentingDelegate>

@property (nonatomic) NSMutableArray *queue;

@property (nonatomic) BOOL inAppIsPresenting;

@end


@implementation ChainedRichMediaPresentingDelegate

- (instancetype)init {
    self = [super init];

    if (self) {
        _queue = [NSMutableArray new];
    }

    return self;
}

- (BOOL)richMediaManager:(PWRichMediaManager *)richMediaManager shouldPresentRichMedia:(PWRichMedia *)richMedia {
    [_queue addObject:richMedia];
    return !_inAppIsPresenting;
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didPresentRichMedia:(PWRichMedia *)richMedia {
    _inAppIsPresenting = YES;
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didCloseRichMedia:(PWRichMedia *)richMedia {
    _inAppIsPresenting = NO;

    [_queue removeObject:richMedia];

    if (_queue.count) {
        [[PWRichMediaManager sharedManager] presentRichMedia:_queue.firstObject];
    }
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager presentingDidFailForRichMedia:(PWRichMedia *)richMedia withError:(NSError *)error {
    [self richMediaManager:richMediaManager didCloseRichMedia:richMedia];
}

@end
```

2\. Setzen Sie den Delegaten:

```objective-c
 [PWRichMediaManager sharedManager].delegate = [ChainedRichMediaPresentingDelegate new];
```

<Tabs>
<TabItem label="Swift (GitHub)">
<LinkCard title="Beispiel" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/tree/main/customizing/customizing/Rich%20Media%20Queue" />
</TabItem>

<TabItem label="Objective-C (GitHub)">
<LinkCard title="Beispiel" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/tree/main/customizing/customizingObjC/customizingObjC/Rich%20Media%20Queue" />
</TabItem>
</Tabs>

### Automatisches Abspielen eines Videos, das in einer Rich Notification mit Force Touch gesendet wird

Um ein Video, das als [Rich Notification-Anhang](/de/developer/pushwoosh-sdk/ios-sdk/ios-rich-notifications-integration/) gesendet wird, automatisch abzuspielen, wenn die Benachrichtigung ohne Benutzerinteraktion erweitert wird, führen Sie die folgenden Schritte aus:

1. Fügen Sie die Notification Content Extension zu Ihrem Projekt hinzu:

* Wählen Sie in Xcode Datei > Neu > Ziel.
* Wählen Sie Notification Content Extension.
* Geben Sie ihr einen Namen und schließen Sie die Einrichtung ab.

<img src="/ios-push-notifications-customizing-ios-sdk-5.webp" alt="Notification Content Extension - iOS Rich Push Notification"/>

Wenn Sie mit der Meldung "Schema aktivieren" aufgefordert werden, wählen Sie Abbrechen.

<img
  src="/ios-push-notifications-customizing-ios-sdk-6.webp"
  alt="Activate Notification Content Scheme"
  style={{ display: "block", margin: "0 auto", maxWidth: "40%", height: "auto" }}
  width="400"
/>

2. Passen Sie die Eigenschaften und Methoden in der Content Extension wie folgt an:

```
import UIKit
import UserNotifications
import UserNotificationsUI
import AVKit


class NotificationViewController: UIViewController, UNNotificationContentExtension {
    var playerController: AVPlayerViewController!
    @IBOutlet weak var playerBackgroundView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any required interface initialization here.
    }

    func didReceive(_ notification: UNNotification) {
        let attachment = notification.request.content.attachments.first

        playerController = AVPlayerViewController()
        // Set height programmatically
        // preferredContentSize.height = 250

        if let url = attachment?.url {
            setupVideoPlayer(url: url)
        } else {
            print("No valid URL...")
        }
    }

    private func setupVideoPlayer(url: URL) {
        guard let playerController = self.playerController else { return }
        let player = AVPlayer(url: url)
        playerController.player = player
        playerController.view.frame = self.playerBackgroundView.bounds
        playerBackgroundView.addSubview(playerController.view)
        addChild(playerController)
        playerController.didMove(toParent: self)
        player.play()
    }
```

3. Fügen Sie eine UIView in MainInterface.storyboard ein:

<img src="/ios-push-notifications-customizing-ios-sdk-7.webp" alt="UIView im MainInterface.storyboard"/>

4. Verknüpfen Sie das playerBackgroundView IBOutlet mit der gerade hinzugefügten UIView:

<img src="/ios-push-notifications-customizing-ios-sdk-8.webp" alt="Verknüpfen Sie das playerBackgroundView IBOutlet mit der UIView"/>

5. Aktualisieren Sie die info.plist-Datei mit dem folgenden Eintrag:

```
UNNotificationExtensionUserInteractionEnabled = true
```

<img src="/ios-push-notifications-customizing-ios-sdk-9.webp" alt="UNNotificationExtensionUserInteractionEnabled = true"/>

Um ein Video an Ihre Benachrichtigung anzuhängen, geben Sie die URL eines Videos in das Feld Medienanhang im Control Panel ein:

<img src="/ios-push-notifications-customizing-ios-sdk-10.webp" alt="URL eines Videos im Feld Medienanhang im Pushwoosh Control Panel"/>

Wenn Sie eine Benachrichtigung über eine API [/createMessage](/de/developer/api-reference/messages-api#createmessage)-Anfrage senden, fügen Sie die URL in den Parameter "ios\_attachment" ein und stellen Sie sicher, dass das Flag "mutable-content" auf \`1\` gesetzt ist.

<Aside type="note">
Um die Autoplay-Funktion zu testen, können Sie das folgende Beispielvideo verwenden: [Hello World Beispielvideo](https://docs-assets.developer.apple.com/published/efa8e7a0a97cfab20bf0f4c307b9b121/Hello-World-overview.mp4).
</Aside>

<video src="/ios-push-notifications-customizing-ios-sdk-11.webm" title="Hello World Beispielvideo" autoplay loop muted playsinline />

### Benutzerdefinierter Push-Ton

Um einen benutzerdefinierten Ton beim Empfang einer Push-Benachrichtigung abzuspielen, legen Sie zuerst die Audiodatei in das Stammverzeichnis Ihres Projekts.

<img
  src="/ios-push-notifications-customizing-ios-sdk-12.webp"
  alt=""
  style={{ display: "block", margin: "0 auto", maxWidth: "40%", height: "auto" }}
  width="400"
/>

Geben Sie dann den Namen der Sounddatei in den Push-Parametern an – füllen Sie das Feld Ton in den [iOS-spezifischen Einstellungen](/de/product/messaging-channels/push-notifications/send-push-notifications/one-time-push#ios) Ihrer Nachricht aus oder geben Sie den Dateinamen als Wert für den Parameter "ios\_sound" der [createMessage API-Anfrage](/de/developer/api-reference/messages-api/) an.

Die Audiodatei für einen benutzerdefinierten iOS-Ton muss in einem der folgenden Formate vorliegen: **.aif**, **.caf**, **.wav**. **Stellen Sie sicher, dass Sie das Format im Dateinamen angeben; andernfalls wird es vom Pushwoosh iOS SDK ignoriert.**

<Aside type="tip">
Berücksichtigen Sie die Beschränkungen des App Stores für die Bundle-Größe, wenn Sie die Sounddatei zu Ihrem Bundle hinzufügen.
</Aside>


### iOS Provisional Push

<Aside>
Unterstützt ab iOS 12 und neuer.
</Aside>

#### Wie es funktioniert

Provisional-Push-Benachrichtigungen erscheinen leise im Notification Center des Benutzers, aber nicht auf dem Sperrbildschirm. Diese Art von Push-Benachrichtigungen muss nicht explizit von einem Benutzer erlaubt werden: Sie können sie senden, sobald ein Benutzer Ihre App installiert und startet.

Benutzer können sich jedoch weiterhin für Ihre prominenten Push-Benachrichtigungen anmelden: Beim Öffnen des Provisional Push haben sie zwei Optionen, um ihre Erfahrung zu wählen – die Push-Benachrichtigungen im Notification Center ohne Alarme und Töne zu belassen oder Ihnen zu erlauben, Push-Benachrichtigungen prominent zu senden, sodass sie auf dem Sperrbildschirm erscheinen.

Provisional Pushes sind so konzipiert, dass Benutzer fundierte Entscheidungen darüber treffen können, ob sie Benachrichtigungen von Ihrer App erhalten möchten. Da die native APN-Abonnementanfrage den Benutzern nur einmal angezeigt wird und sie sich später in den Systemeinstellungen ihres Telefons anmelden müssen, abonnieren einige Benutzer möglicherweise nicht, da sie nicht wissen, welchen Wert sie mit Ihren Push-Benachrichtigungen erhalten. Provisional Pushes geben den Benutzern dieses Verständnis: Sie können sehen, welche Inhalte Sie in Push-Benachrichtigungen liefern, und entscheiden, ob sie über diese Inhalte prominent benachrichtigt werden müssen.

<Aside type="caution" title="Wichtig">
Bitte beachten Sie, dass Provisional Pushes, wenn sie implementiert sind, die native APN-Aufforderung ersetzen, was bedeutet, dass Benutzer sich nicht für prominente Benachrichtigungen anmelden können, bis sie ihr Notification Center öffnen und sich dafür entscheiden, Provisional Pushes als prominente zu erhalten.
</Aside>

#### Wie man es implementiert

1\. Integrieren Sie das Pushwoosh iOS SDK, indem Sie der [Anleitung](/de/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/quick-start/) folgen.

2\. Fügen Sie die folgende Zeichenfolge zum AppDelegate Ihres Projekts hinzu, bevor Sie die Methode `registerForPushNotifications()` aufrufen:

<Tabs>
<TabItem label="Swift">
```swift
if #available(iOS 12.0, *) {
    Pushwoosh.sharedInstance().additionalAuthorizationOptions = UNAuthorizationOptions.provisional
}
```

<LinkCard title="Beispiel" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/provisionalpush/provisionalpush/AppDelegate/AppDelegate.swift" />
</TabItem>

<TabItem label="Objective-C">
```objective-c
if (@available(iOS 12.0, *)) {
	[Pushwoosh sharedInstance].additionalAuthorizationOptions = UNAuthorizationOptionProvisional;
}
```

<LinkCard title="Beispiel" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/provisionalpush/provisionalpushObjC/provisionalpushObjC/AppDelegate/AppDelegate.m" />
</TabItem>
</Tabs>

Das ist alles! App-Benutzer erhalten Nachrichten direkt in ihr Notification Center, sobald sie die App installieren.

### 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.