Anpassen des iOS SDK
Integration
Anchor link to- Deep Linking
- Universal Links
- Tracking von In-App-Käufen
- Geozones-Push-Benachrichtigungen
- Erstellen einer Rich-Media-Warteschlange
- Automatisches Abspielen eines Videos, das in einer Rich Notification mit Force Touch gesendet wird
- Benutzerdefinierter Push-Ton
- Provisorische iOS-Push-Benachrichtigungen
Deep Linking
Anchor link toFügen Sie in Ihrer Info.plist-Datei ein URL types-Array mit URL Identifier und URL Scheme hinzu.
Im folgenden Beispiel ist das URL Scheme com.pushwoosh und der URL Identifier ist promotion.

Fügen Sie in Ihrer App-Delegate-Datei (normalerweise AppDelegate.m für iOS 12 und früher oder SceneDelegate.m für iOS 13 und höher) 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
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}- (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];}SceneDelegate.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}- (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}Universal Links
Anchor link toUniversal 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.
Wie es funktioniert
Anchor link toWenn eine Push-Benachrichtigung eine https://-URL enthält (im Parameter „url“ oder „l“), wird das SDK:
- Eine
NSUserActivitymit der URL erstellen - Den Universal-Links-Handler Ihrer App aufrufen (
scene:continueUserActivity:oderapplication:continueUserActivity:restorationHandler:) - Wenn Ihre App die URL nicht verarbeitet, wird sie als Fallback in Safari geöffnet
Einrichtung
Anchor link to- 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- 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:
{ "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 den Bundle Identifier Ihrer App.
- Implementieren Sie den Universal-Links-Handler
SceneDelegate.swift (iOS 13+)
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 }}- (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 }}AppDelegate.swift (iOS 12 und früher, oder als Fallback)
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}- (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;}Senden einer Push-Benachrichtigung mit Universal Link
Anchor link toVerwenden Sie beim Erstellen einer Push-Benachrichtigung Ihre Website-URL im Feld Aktion:
https://yourdomain.com/promotion?id=123Das SDK leitet diese URL automatisch an Ihren Universal-Links-Handler weiter, sodass Sie den Benutzer zum entsprechenden Bildschirm in Ihrer App navigieren können.
Tracking von In-App-Käufen
Anchor link toStandardmäßig ist das Tracking von In-App-Käufen deaktiviert. Wenn Sie In-App-Käufe beim Konfigurieren von Customer Journeys 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.
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.
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 }- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
[[PushNotificationManager pushManager] sendSKPaymentTransactions:transactions];
//the rest of the code, consume transactions, etc}
Geozones-Push-Benachrichtigungen
Anchor link toGeozones-Push-Benachrichtigungen sind in einem separaten Framework PushwooshGeozones gekapselt.
- 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:
pod 'PushwooshXCFramework/Geozones'github "Pushwoosh/pushwoosh-ios-sdk"Wenn Sie PushwooshGeozones.xcframework verwenden möchten, geben Sie die folgende Paket-URL ein:
PushwooshGeozones-XCFramework
Alternativ können Sie das Framework einfach per Drag & Drop in Link Binaries With Libraries in den Build Phases Ihres Projekts ziehen.
- 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 ausgeführt wird.
- NSLocationAlwaysAndWhenInUseUsageDescription – (erforderlich), damit die App Geozones sowohl im Vordergrund als auch im Hintergrund verfolgt und ein Pop-up-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.
<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>- Importieren Sie das Framework
import PushwooshGeozones#import <PushwooshGeozones/PWGeozonesManager.h>- Starten Sie das Geozones-Tracking
PWGeozonesManager.shared()?.startLocationTracking()[[PWGeozonesManager sharedManager] startLocationTracking];Beispiel
Anchor link tooverride func viewDidLoad() { super.viewDidLoad()
// Start Geozones tracking when needed PWGeozonesManager.shared().startLocationTracking()}- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view.
// Start Geozones tracking when needed [[PWGeozonesManager sharedManager] startLocationTracking];}Erstellen einer Rich-Media-Warteschlange
Anchor link toFalls 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.
- Erstellen Sie eine Klasse, die PWRichMediaPresentingDelegate implementiert:
@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];}
@end2. Setzen Sie den Delegaten:
[PWRichMediaManager sharedManager].delegate = [ChainedRichMediaPresentingDelegate new];Automatisches Abspielen eines Videos, das in einer Rich Notification mit Force Touch gesendet wird
Anchor link toUm ein Video, das als Rich Notification-Anhang gesendet wird, automatisch abzuspielen, wenn die Benachrichtigung ohne Benutzerinteraktion erweitert wird, folgen Sie den unten stehenden Schritten:
- 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.

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

- Passen Sie die Eigenschaften und Methoden in der Content Extension wie folgt an:
import UIKitimport UserNotificationsimport UserNotificationsUIimport 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() }- Fügen Sie eine UIView in MainInterface.storyboard ein:

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

- Aktualisieren Sie die info.plist-Datei mit dem folgenden Eintrag:
UNNotificationExtensionUserInteractionEnabled = true
Um ein Video an Ihre Benachrichtigung anzuhängen, geben Sie die URL eines Videos in das Feld Medienanhang im Control Panel ein:

Wenn Sie eine Benachrichtigung über eine 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.
Benutzerdefinierter Push-Ton
Anchor link toUm einen benutzerdefinierten Ton abzuspielen, wenn eine Push-Benachrichtigung empfangen wird, legen Sie die Audiodatei zuerst in den Stammordner Ihres Projekts.

Geben Sie dann den Namen der Tondatei in den Push-Parametern an – füllen Sie das Feld Ton in den iOS-spezifischen Einstellungen Ihrer Nachricht aus oder geben Sie den Dateinamen als Wert für den Parameter „ios_sound“ der createMessage API-Anfrage 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.
Provisorische iOS-Push-Benachrichtigungen
Anchor link toWie es funktioniert
Anchor link toProvisorische Push-Benachrichtigungen erscheinen leise in der Mitteilungszentrale 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 der provisorischen Push-Benachrichtigung haben sie zwei Optionen, um ihre Erfahrung zu wählen – die Push-Benachrichtigungen in der Mitteilungszentrale ohne Warnungen und Töne zu behalten oder Ihnen zu erlauben, Push-Benachrichtigungen prominent zu senden, sodass sie auf dem Sperrbildschirm erscheinen.
Provisorische Push-Benachrichtigungen sollen es Benutzern ermöglichen, fundierte Entscheidungen darüber zu treffen, 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. Provisorische Push-Benachrichtigungen 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.
Wie man es implementiert
Anchor link to1. Integrieren Sie das Pushwoosh iOS SDK, indem Sie der Anleitung folgen.
2. Fügen Sie die folgende Zeichenfolge zum AppDelegate Ihres Projekts hinzu, bevor Sie die Methode registerForPushNotifications() aufrufen:
if #available(iOS 12.0, *) { Pushwoosh.sharedInstance().additionalAuthorizationOptions = UNAuthorizationOptions.provisional}if (@available(iOS 12.0, *)) { [Pushwoosh sharedInstance].additionalAuthorizationOptions = UNAuthorizationOptionProvisional;}Das ist alles! App-Benutzer erhalten Nachrichten direkt in ihre Mitteilungszentrale, sobald sie die App installieren.
Teilen Sie uns Ihr Feedback mit
Anchor link toIhr 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 mitzuteilen.