Skip to content

Deeplinking in In-App-Nachrichten

Erfahren Sie, wie Sie Deeplinks innerhalb einer In-App-Nachricht für das Braze SDK setzen können.

Voraussetzungen

Bevor Sie dieses Feature nutzen können, müssen Sie das Android Braze SDK integrieren.

Erstellen eines universellen Delegaten

Das Android SDK bietet die Möglichkeit, ein einzelnes Delegatenobjekt festzulegen, um alle von Braze geöffneten Deeplinks über Content Cards, In-App-Nachrichten und Push-Benachrichtigungen individuell zu verarbeiten.

Ihr Delegatenobjekt sollte die IBrazeDeeplinkHandler-Schnittstelle implementieren und mit BrazeDeeplinkHandler.setBrazeDeeplinkHandler() festgelegt werden. In den meisten Fällen sollte der Delegat in Application.onCreate() Ihrer App festgelegt werden.

Im Folgenden finden Sie ein Beispiel für das Überschreiben des Standardverhaltens von UriAction mit angepassten Intent-Flags und angepasstem Verhalten für YouTube-URLs:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class CustomDeeplinkHandler implements IBrazeDeeplinkHandler {
  private static final String TAG = BrazeLogger.getBrazeLogTag(CustomDeeplinkHandler.class);

  @Override
  public void gotoUri(Context context, UriAction uriAction) {
    String uri = uriAction.getUri().toString();
    // Open YouTube URLs in the YouTube app and not our app
    if (!StringUtils.isNullOrBlank(uri) && uri.contains("youtube.com")) {
      uriAction.setUseWebView(false);
    }

    CustomUriAction customUriAction = new CustomUriAction(uriAction);
    customUriAction.execute(context);
  }

  public static class CustomUriAction extends UriAction {

    public CustomUriAction(@NonNull UriAction uriAction) {
      super(uriAction);
    }

    @Override
    protected void openUriWithActionView(Context context, Uri uri, Bundle extras) {
      Intent intent = getActionViewIntent(context, uri, extras);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
      if (intent.resolveActivity(context.getPackageManager()) != null) {
        context.startActivity(intent);
      } else {
        BrazeLogger.w(TAG, "Could not find appropriate activity to open for deep link " + uri + ".");
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class CustomDeeplinkHandler : IBrazeDeeplinkHandler {

  override fun gotoUri(context: Context, uriAction: UriAction) {
    val uri = uriAction.uri.toString()
    // Open YouTube URLs in the YouTube app and not our app
    if (!StringUtils.isNullOrBlank(uri) && uri.contains("youtube.com")) {
      uriAction.useWebView = false
    }

    val customUriAction = CustomUriAction(uriAction)
    customUriAction.execute(context)
  }

  class CustomUriAction(uriAction: UriAction) : UriAction(uriAction) {

    override fun openUriWithActionView(context: Context, uri: Uri, extras: Bundle) {
      val intent = getActionViewIntent(context, uri, extras)
      intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
      if (intent.resolveActivity(context.packageManager) != null) {
        context.startActivity(intent)
      } else {
        BrazeLogger.w(TAG, "Could not find appropriate activity to open for deep link $uri.")
      }
    }
  }

  companion object {
    private val TAG = BrazeLogger.getBrazeLogTag(CustomDeeplinkHandler::class.java)
  }
}

Deeplinking zu den App-Einstellungen

Um Deeplinks zu erlauben, die direkt die Einstellungen Ihrer App öffnen, benötigen Sie einen angepassten BrazeDeeplinkHandler. Im folgenden Beispiel bewirkt das Vorhandensein eines angepassten Schlüssel-Wert-Paares namens open_notification_page, dass der Deeplink die Einstellungsseite der App öffnet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BrazeDeeplinkHandler.setBrazeDeeplinkHandler(new IBrazeDeeplinkHandler() {
  @Override
  public void gotoUri(Context context, UriAction uriAction) {
    final Bundle extras = uriAction.getExtras();
    if (extras.containsKey("open_notification_page")) {
      Intent intent = new Intent();
      intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

      //for Android 5-7
      intent.putExtra("app_package", context.getPackageName());
      intent.putExtra("app_uid", context.getApplicationInfo().uid);

      // for Android 8 and later
      intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName());
      context.startActivity(intent);
    }
  }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
BrazeDeeplinkHandler.setBrazeDeeplinkHandler(object : IBrazeDeeplinkHandler {
  override fun gotoUri(context: Context, uriAction: UriAction) {
    val extras = uriAction.extras
    if (extras.containsKey("open_notification_page")) {
      val intent = Intent()
      intent.action = "android.settings.APP_NOTIFICATION_SETTINGS"
      intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK

      //for Android 5-7
      intent.putExtra("app_package", context.packageName)
      intent.putExtra("app_uid", context.applicationInfo.uid)

      // for Android 8 and later
      intent.putExtra("android.provider.extra.APP_PACKAGE", context.packageName)
      context.startActivity(intent)
    }
  }
})

Anpassen der WebView-Aktivität

Wenn Braze Website-Deeplinks innerhalb der App öffnet, werden diese von BrazeWebViewActivity verarbeitet.

Um dies zu ändern:

  1. Erstellen Sie eine neue Activity, die die Ziel-URL von Intent.getExtras() mit dem Schlüssel com.braze.Constants.BRAZE_WEBVIEW_URL_EXTRA verarbeitet. Ein Beispiel finden Sie unter BrazeWebViewActivity.kt.
  2. Fügen Sie diese Activity zu AndroidManifest.xml hinzu und setzen Sie exported auf false.
    1
    2
    3
    
     <activity
         android:name=".MyCustomWebViewActivity"
         android:exported="false" />
    
  3. Legen Sie Ihre angepasste Activity in einem BrazeConfig-Builder-Objekt fest. Erstellen Sie den Builder und übergeben Sie ihn an Braze.configure() in Ihrer Application.onCreate().
1
2
3
4
5
BrazeConfig brazeConfig = new BrazeConfig.Builder()
    .setCustomWebViewActivityClass(MyCustomWebViewActivity::class)
    ...
    .build();
Braze.configure(this, brazeConfig);
1
2
3
4
5
val brazeConfig = BrazeConfig.Builder()
    .setCustomWebViewActivityClass(MyCustomWebViewActivity::class.java)
    ...
    .build()
Braze.configure(this, brazeConfig)

Fehlerbehebung

Wenn Deeplinks aus Push-Benachrichtigungen auf Android nicht funktionieren, probieren Sie die folgenden Schritte:

  1. Testen Sie den Deeplink außerhalb von Braze. Öffnen Sie die Deeplink-URL aus einer anderen App, z. B. E-Mail oder einem Browser. Wenn Ihre App sich nicht öffnet, ist der Deeplink möglicherweise nicht korrekt in Ihrer AndroidManifest.xml konfiguriert. Weitere Informationen finden Sie in der Android-Dokumentation zu Deep Links erstellen.
  2. Prüfen Sie, ob die automatische Deeplink-Verarbeitung aktiviert ist. Stellen Sie sicher, dass com_braze_handle_push_deep_links_automatically in braze.xml auf true gesetzt ist, oder legen Sie diese Option über die Laufzeitkonfiguration fest. Ohne diese Einstellung öffnet Braze Ihre App und das Deeplink-Ziel nicht automatisch, wenn jemand auf eine Push-Benachrichtigung tippt.
  3. Überprüfen Sie Ihren Deeplink-Handler-Delegaten. Wenn Sie einen angepassten IBrazeDeeplinkHandler festgelegt haben, stellen Sie sicher, dass Ihre gotoUri-Implementierung die URI verarbeitet und nicht verwirft.
  4. Testen Sie kanalübergreifend. Wenn derselbe Deeplink in einer In-App-Nachricht funktioniert, aber nicht über Push, liegt das Problem wahrscheinlich in Ihrer Push-Deeplink-Verarbeitung und nicht im Deeplink selbst.

Verwendung von Jetpack Compose

Um Deeplinks bei der Verwendung von Jetpack Compose mit NavHost zu verarbeiten:

  1. Stellen Sie sicher, dass die Activity, die Ihren Deeplink verarbeitet, im Android Manifest registriert ist.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
     <activity
       ...
       <intent-filter>
         <action android:name="android.intent.action.VIEW" />
         <category android:name="android.intent.category.BROWSABLE" />
         <category android:name="android.intent.category.DEFAULT" />
         <data
             android:host="articles"
             android:scheme="myapp" />
       </intent-filter>
     </activity>
    
  2. Geben Sie in NavHost an, welche Deeplinks verarbeitet werden sollen.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
     composableWithCompositionLocal(
         route = "YOUR_ROUTE_HERE",
         deepLinks = listOf(navDeepLink {
             uriPattern = "myapp://articles/{${MainDestinations.ARTICLE_ID_KEY}}"
         }),
         arguments = listOf(
             navArgument(MainDestinations.ARTICLE_ID_KEY) {
                 type = NavType.LongType
             }
         ),
     ) { backStackEntry ->
         val arguments = requireNotNull(backStackEntry.arguments)
         val articleId = arguments.getLong(MainDestinations.ARTICLE_ID_KEY)
         ArticleDetail(
             articleId
         )
     }
    
  3. Je nach Architektur Ihrer App müssen Sie möglicherweise auch den neuen Intent verarbeiten, der an Ihre aktuelle Activity gesendet wird.
    1
    2
    3
    4
    5
    6
    7
    
     DisposableEffect(Unit) {
         val listener = Consumer<Intent> {
             navHostController.handleDeepLink(it)
         }
         addOnNewIntentListener(listener)
         onDispose { removeOnNewIntentListener(listener) }
     }
    

Voraussetzungen

Bevor Sie dieses Feature nutzen können, müssen Sie das Swift Braze SDK integrieren.

1. Schritt: Ein Schema registrieren

Um Deeplinks setzen zu können, muss ein angepasstes Schema in Ihrer Info.plist-Datei angegeben sein. 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. Stellen Sie den Wert auf Ihr angepasstes Schema ein.
  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. Stellen Sie URL Schemes » Item 0 auf Ihr angepasstes Schema ein.

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: Eine Schema-Allowlist hinzufügen

Sie müssen die URL-Schemata, die Sie an canOpenURL(_:) übergeben möchten, deklarieren, indem Sie den Schlüssel LSApplicationQueriesSchemes in die Datei Info.plist Ihrer App einfügen. Der Versuch, Schemata außerhalb dieser Allowlist 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 wie folgt 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 Ihrer 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.

Ihre Beispiel-Allowlist könnte etwa so aussehen:

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

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

3. Schritt: Einen 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
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
  let path = url.path
  let query = url.query
  // Insert your code here to take some action based upon the path and query.
  return true
}
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];
  // Insert your code here to take some action based upon the path and query.
  return YES;
}

App-Transport-Sicherheit (ATS)

Laut Apple ist „App Transport Security ein Feature, das die Sicherheit der Verbindungen zwischen einer App und Webdiensten 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 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 von einem Content Delivery Network („CDN“) verarbeitet, 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 den folgenden ähneln.

Beispielfehler 1:

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

Beispielfehler 2:

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 von angeklickten Links), und gilt nicht für Websites, die extern über einen Webbrowser geöffnet werden.

Arbeiten mit ATS

Sie können ATS auf eine der folgenden Arten handhaben, aber wir empfehlen, die ATS-Anforderungen zu erfüllen.

Ihre Braze-Integration kann die ATS-Anforderungen erfüllen, indem Sie sicherstellen, dass alle bestehenden Links, zu denen Sie Nutzer:innen weiterleiten (z. B. durch In-App-Nachrichten und Push-Campaigns), die ATS-Anforderungen erfüllen. Es gibt zwar Möglichkeiten, die ATS-Beschränkungen zu umgehen, aber unsere Empfehlung ist sicherzustellen, dass 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.

Sie können zulassen, dass eine Teilmenge von Links mit bestimmten Domains oder Schemata als Ausnahmen von den ATS-Regeln behandelt werden. 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 behandelt wird.

Um eine Domain als Ausnahme des 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-Sicherheitsschlüssel.

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>

URLs dekodieren

Das SDK kodiert Links prozentual, um gültige URLs 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 String-Eigenschaft removingPercentEncoding. Sie müssen außerdem true in BrazeDelegate.braze(_:shouldOpenURL:) zurückgeben. Ein Call-to-Action ist erforderlich, um die Verarbeitung der URL durch Ihre App zu triggern. Zum Beispiel:

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
  }
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;
}

Deeplinking zu App-Einstellungen

Sie können UIApplicationOpenSettingsURLString nutzen, um Nutzer:innen über Push-Benachrichtigungen und In-App-Nachrichten von Braze einen Deeplink zu den Einstellungen Ihrer App zu setzen.

Um Nutzer:innen aus Ihrer App in die iOS-Einstellungen zu bringen:

  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 auf die 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
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
  let path = url.path
  if (path == "settings") {
    UIApplication.shared.openURL(URL(string:UIApplication.openSettingsURLString)!)
  }
  return true
}
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;
}

Anpassungsoptionen

Standard-WebView-Anpassung

Die Klasse Braze.WebViewController zeigt vom SDK geöffnete Web-URLs an, typischerweise wenn für einen Web-Deeplink „Open Web URL Inside App“ ausgewählt wurde.

Sie können den Braze.WebViewController über die Delegate-Methode BrazeDelegate.braze(_:willPresentModalWithContext:) anpassen.

Anpassung der Link-Handhabung

Das Protokoll BrazeDelegate kann verwendet werden, um die Handhabung von URLs wie Deeplinks, Web-URLs und universellen Links anzupassen. Um den Delegaten während der Initialisierung von Braze zu setzen, setzen Sie ein Delegate-Objekt auf die Braze-Instanz. Braze ruft dann die Implementierung von shouldOpenURL in Ihrem Delegaten auf, bevor es URIs verarbeitet.

Wenn eine Push-Benachrichtigung oder In-App-Nachricht Web-URL in der mobilen App öffnen verwendet, übergibt Braze context.useWebView == true an Braze.URLContext. Wenn die Nachricht die URL stattdessen im Systembrowser öffnet, ist useWebView false. Prüfen Sie context.useWebView in braze(_:shouldOpenURL:), um Ihre benutzerdefinierte Handhabung zu verzweigen – zum Beispiel, um einen In-App-WebViewController nur dann zu öffnen, wenn die Campaign die In-App-Anzeige angefordert hat.

Braze unterstützt universelle Links in Push-Benachrichtigungen, In-App-Nachrichten und Content Cards. Um die Unterstützung für universelle Links zu aktivieren, muss configuration.forwardUniversalLinks auf true gesetzt sein.

Wenn diese Funktion aktiviert ist, leitet Braze universelle Links über die Methode application:continueUserActivity:restorationHandler: an den AppDelegate Ihrer App weiter.

Ihre Anwendung muss ebenfalls für den Umgang mit universellen Links eingerichtet sein. Lesen Sie die Dokumentation von Apple, um sicherzustellen, dass Ihre Anwendung korrekt für universelle Links konfiguriert ist.

Beispiele

BrazeDelegate

Hier ist ein Beispiel mit BrazeDelegate. Weitere Informationen finden Sie in der Braze Swift SDK-Referenz.

1
2
3
4
5
6
7
8
func braze(_ braze: Braze, shouldOpenURL context: Braze.URLContext) -> Bool {
  if context.url.host == "MY-DOMAIN.com" {
    // Custom handle link here
    return false
  }
  // Let Braze handle links otherwise
  return true
}
1
2
3
4
5
6
7
8
- (BOOL)braze:(Braze *)braze shouldOpenURL:(BRZURLContext *)context {
  if ([[context.url.host lowercaseString] isEqualToString:@"MY-DOMAIN.com"]) {
    // Custom handle link here
    return NO;
  }
  // Let Braze handle links otherwise
  return YES;
}
New Stuff!