Skip to content


Deeplinking für iOS

Einführende Informationen zu Deeplinks finden Sie in unserem Artikel im Benutzerhandbuch. Wenn Sie zum ersten Mal Deeplinks in Ihrer Braze-App implementieren möchten, helfen Ihnen die folgenden Schritte beim Einstieg.

1. Schritt: Ein Schema registrieren

Sie müssen ein angepasstes Schema in der Datei Info.plist angeben. Die Navigationsstruktur wird durch ein Array von Wörterbüchern definiert. Jedes dieser Wörterbücher enthält ein String-Array.

Verwenden Sie Xcode, um Ihre Info.plist-Datei zu bearbeiten:

  1. Fügen Sie einen neuen Schlüssel hinzu, URL types. Xcode macht daraus automatisch ein Array, das ein Wörterbuch namens Item 0 enthält.
  2. Fügen Sie innerhalb von Item 0 einen Schlüssel URL identifier hinzu. Setzen Sie den Wert auf Ihr angepasstes Schema.
  3. Fügen Sie innerhalb von Item 0 einen Schlüssel URL Schemes hinzu. Dies wird automatisch ein Array sein, das einen Item 0-String enthält.
  4. Setzen Sie URL Schemes » Item 0 auf Ihr angepasstes Schema.

Wenn Sie Ihre Info.plist-Datei direkt bearbeiten möchten, können Sie auch dieser Spezifikation folgen:

1
2
3
4
5
6
7
8
9
10
11
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>{YOUR.SCHEME}</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>{YOUR.SCHEME}</string>
        </array>
    </dict>
</array>

2. Schritt: Angepasstes Schema in die Allowlist eintragen (iOS 9+)

Ab iOS 9 müssen Apps eine Allowlist mit angepassten Schemata haben, die die App öffnen darf. Der Versuch, Schemata außerhalb dieser Liste aufzurufen, führt dazu, dass das System einen Fehler in den Protokollen des Geräts aufzeichnet und der Deeplink nicht geöffnet wird. Ein Beispiel für diesen Fehler sieht so aus:

1
<Warning>: -canOpenURL: failed for URL: "yourapp://deeplink" – error: "This app is not allowed to query for scheme yourapp"

Wenn zum Beispiel eine In-App-Nachricht beim Antippen die Facebook-App öffnen soll, muss die App das angepasste Schema von Facebook (fb) in der Allowlist haben. Andernfalls wird das System den Deeplink ablehnen. Deeplinks, die auf eine Seite oder Ansicht innerhalb Ihrer eigenen App verweisen, erfordern nach wie vor, dass das angepasste Schema Ihrer App in der Info.plist Ihrer App aufgeführt ist.

Sie sollten alle Schemata, zu denen die App Deeplinks setzen muss, in einer Allowlist in der Info.plist-Datei Ihrer App mit dem Schlüssel LSApplicationQueriesSchemes auflisten. Zum Beispiel:

1
2
3
4
5
6
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>myapp</string>
    <string>facebook</string>
    <string>twitter</string>
</array>

Weitere Informationen finden Sie in der Dokumentation von Apple zum Schlüssel LSApplicationQueriesSchemes.

3. Schritt: Handler implementieren

Nachdem Ihre App aktiviert wurde, ruft iOS die Methode application:openURL:options: auf. Das wichtige Argument ist das NSURL-Objekt.

1
2
3
4
5
6
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
  NSString *path  = [url path];
  NSString *query = [url query];
  // Here you should insert code to take some action based upon the path and query.
  return YES;
}
1
2
3
4
5
6
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
  let path = url.path
  let query = url.query
  // Here you should insert code to take some action based upon the path and query.
  return true
}

Universelle Links

Um universelle Links zu verwenden, stellen Sie sicher, dass Sie eine registrierte Domain zu den Fähigkeiten Ihrer App hinzugefügt und eine apple-app-site-association-Datei hochgeladen haben. Implementieren Sie dann die Methode application:continueUserActivity:restorationHandler: in Ihrer AppDelegate. Zum Beispiel:

1
2
3
4
5
6
7
8
9
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
  restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
  if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
    NSURL *url = userActivity.webpageURL;
    // Handle url
  }
  return YES;
}
1
2
3
4
5
6
7
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
  if (userActivity.activityType == NSUserActivityTypeBrowsingWeb) {
    let url = userActivity.webpageURL
    // Handle url
  }
  return true
}

Weitere Informationen finden Sie bei Apple.

App Transport Security (ATS)

Mit iOS 9 wurde eine grundlegende Änderung eingeführt, die in In-App-Nachrichten und Push-Benachrichtigungen eingebettete Internet-URLs betrifft.

ATS-Anforderungen

Aus der Dokumentation von Apple: „App Transport Security ist ein Feature, das die Sicherheit der Verbindungen zwischen einer App und Internetdiensten verbessert. Das Feature besteht aus Standard-Verbindungsanforderungen, die den Best Practices für sichere Verbindungen entsprechen. Apps können dieses Standardverhalten außer Kraft setzen und die Transportsicherheit deaktivieren.“

ATS wird standardmäßig ab iOS 9 angewendet. Es erfordert, dass alle Verbindungen HTTPS verwenden und mit TLS 1.2 mit Forward Secrecy verschlüsselt werden. Weitere Informationen finden Sie unter Voraussetzungen für die Verbindung mit ATS. Alle Bilder, die von Braze an Endgeräte geliefert werden, werden über ein Content Delivery Network („CDN“) bereitgestellt, das TLS 1.2 unterstützt und mit ATS kompatibel ist.

Sofern sie nicht als Ausnahmen in der Info.plist Ihrer Anwendung angegeben sind, schlagen Verbindungen, die diese Anforderungen nicht erfüllen, mit Fehlern fehl, die in etwa so aussehen:

1
2
CFNetwork SSLHandshake failed (-9801)
Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred, and a secure connection to the server cannot be made."
1
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

Die ATS-Konformität wird für Links durchgesetzt, die innerhalb der mobilen App geöffnet werden (unsere Standardbehandlung angeklickter Links), und gilt nicht für Websites, die extern über einen Webbrowser geöffnet werden.

Umgang mit ATS-Anforderungen

Sie können ATS auf eine der folgenden drei Arten handhaben:

Ihre Braze-Integration kann die ATS-Anforderungen erfüllen, indem Sie sicherstellen, dass alle bestehenden Links, zu denen Sie Nutzer:innen führen (über In-App-Nachrichten und Push-Kampagnen), die ATS-Anforderungen erfüllen. Es gibt zwar Möglichkeiten, die ATS-Beschränkungen zu umgehen, aber wir empfehlen, zu überprüfen, ob alle verlinkten URLs ATS-konform sind. Da Apple immer mehr Wert auf die Sicherheit von Anwendungen legt, werden die folgenden Ansätze zur Zulassung von ATS-Ausnahmen von Apple nicht garantiert unterstützt.

Ein SSL-Tool kann Ihnen dabei helfen, Sicherheitsprobleme des Webservers zu erkennen. Dieser SSL-Server-Test von Qualys, Inc. bietet einen Punkt speziell für die Einhaltung von Apple ATS 9 und iOS 9.

ATS teilweise deaktivieren

Sie können zulassen, dass eine Teilmenge von Links mit bestimmten Domains oder Schemata als Ausnahmen von den ATS-Regeln behandelt wird. Ihre Braze-Integration erfüllt die ATS-Anforderungen, wenn jeder Link, den Sie in einem Braze-Messaging-Kanal verwenden, entweder ATS-konform ist oder durch eine Ausnahme abgedeckt wird.

Um eine Domain als Ausnahme von ATS hinzuzufügen, fügen Sie Folgendes in die Datei Info.plist Ihrer App ein:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Weitere Informationen finden Sie in Apples Artikel über App-Transport-Security-Schlüssel.

ATS vollständig deaktivieren

Sie können ATS vollständig deaktivieren. Beachten Sie, dass dies aufgrund des verlorenen Sicherheitsschutzes und der zukünftigen iOS-Kompatibilität nicht empfohlen wird. Um ATS zu deaktivieren, fügen Sie Folgendes in die Datei Info.plist Ihrer App ein:

1
2
3
4
5
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Weitere Informationen zum Debuggen von ATS-Fehlern finden Sie unter Versand einer App mit App Transport Security.

URL-Kodierung

Ab Braze iOS SDK v2.21.0 kodiert das SDK Links prozentual, um gültige NSURLs zu erstellen. Alle Link-Zeichen, die in einer korrekt geformten URL nicht zulässig sind, wie z. B. Unicode-Zeichen, werden prozentual escaped.

Um einen kodierten Link zu dekodieren, verwenden Sie die NSString-Methode stringByRemovingPercentEncoding. Beachten Sie, dass Sie in ABKURLDelegate auch YES zurückgeben müssen und dass ein Aufruf zur Aktion erforderlich ist, um die Verarbeitung der URL durch die App zu triggern. Zum Beispiel:

1
2
3
4
5
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options {
  NSString *urlString = url.absoluteString.stringByRemovingPercentEncoding;
  // Handle urlString
  return YES;
}
1
2
3
4
5
  func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    let urlString = url.absoluteString.removingPercentEncoding
    // Handle urlString
    return true
  }

Anpassung

Standard-WebView-Anpassung

Die anpassbare Klasse ABKModalWebViewController zeigt Internet-URLs an, die vom SDK geöffnet werden – typischerweise wenn „Web-URL in App öffnen“ für einen Web-Deeplink ausgewählt wurde.

Sie können eine Kategorie für die Klasse ABKModalWebViewController deklarieren oder sie direkt ändern, um die Webansicht anzupassen. Weitere Details finden Sie in der .h-Datei und der .m-Datei der Klasse.

Anpassung der Link-Handhabung

Mit dem Protokoll ABKURLDelegate können Sie die Handhabung von URLs wie Deeplinks, Web-URLs und universellen Links anpassen. Um den Delegaten während der Initialisierung von Braze zu setzen, übergeben Sie ein Delegaten-Objekt an den ABKURLDelegateKey in appboyOptions von startWithApiKey:inApplication:withAppboyOptions:. Braze ruft dann die Implementierung von handleAppboyURL:fromChannel:withExtras: in Ihrem Delegaten auf, bevor URIs verarbeitet werden.

Integrationsbeispiel: ABKURLDelegate

1
2
3
4
5
6
7
8
- (BOOL)handleAppboyURL:(NSURL *)url fromChannel:(ABKChannel)channel withExtras:(NSDictionary *)extras {
  if ([[url.host lowercaseString] isEqualToString:@"MY-DOMAIN.com"]) {
    // Custom handle link here
    return YES;
  }
  // Let Braze handle links otherwise
  return NO;
}
1
2
3
4
5
6
7
8
func handleAppboyURL(_ url: URL?, from channel: ABKChannel, withExtras extras: [AnyHashable : Any]?) -> Bool {
  if (url.host == "MY-DOMAIN.com") {
    // Custom handle link here
    return true;
  }
  // Let Braze handle links otherwise
  return false;
}

Weitere Informationen finden Sie unter ABKURLDelegate.h.

Häufige Anwendungsfälle

Deeplinks zu den App-Einstellungen

iOS kann Nutzer:innen von Ihrer App auf deren Seite in der iOS-Einstellungs-App weiterleiten. Sie können UIApplicationOpenSettingsURLString nutzen, um Nutzer:innen über Push-Benachrichtigungen und In-App-Nachrichten per Deeplink zu den Einstellungen zu führen.

  1. Vergewissern Sie sich zunächst, dass Ihre Anwendung entweder für schemabasierte Deeplinks oder für universelle Links eingerichtet ist.
  2. Legen Sie eine URI für Deeplinks zur Seite Einstellungen fest (z. B. myapp://settings oder https://www.braze.com/settings).
  3. Wenn Sie angepasste schemabasierte Deeplinks verwenden, fügen Sie den folgenden Code zu Ihrer application:openURL:options:-Methode hinzu:
1
2
3
4
5
6
7
8
9
10
- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
  NSString *path  = [url path];
  if ([path isEqualToString:@"settings"]) {
    NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    [[UIApplication sharedApplication] openURL:settingsURL];
  }
  return YES;
}
1
2
3
4
5
6
7
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
  let path = url.path
  if (path == "settings") {
    UIApplication.shared.openURL(URL(string:UIApplicationOpenSettingsURLString)!)
  }
  return true
}
New Stuff!