Vinculación en profundidad de mensajes dentro de la aplicación
Aprende a establecer un vínculo profundo dentro de un mensaje dentro de la aplicación para el SDK de Braze.
Requisitos previos
Antes de poder utilizar esta característica, tendrás que integrar el SDK de Android Braze.
Crear un delegado universal
El SDK de Android ofrece la posibilidad de establecer un único objeto delegado para gestionar de forma personalizada todos los vínculos profundos abiertos por Braze a través de tarjetas de contenido, mensajes dentro de la aplicación y notificaciones push.
Tu objeto delegado debe implementar la interfaz IBrazeDeeplinkHandler
y configurarse mediante la función BrazeDeeplinkHandler.setBrazeDeeplinkHandler()
. En la mayoría de los casos, el delegado debe establecerse en la página Application.onCreate()
de tu aplicación.
A continuación se muestra un ejemplo de anulación del comportamiento predeterminado UriAction
con indicadores de intención personalizados y un comportamiento personalizado para las URL de YouTube:
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
34
35
36
37
38
public class CustomDeeplinkHandler implements IBrazeDeeplinkHandler {
private static final String TAG = BrazeLogger.getBrazeLogTag(CustomDeeplinkHandler.class);
@Override
public void gotoNewsFeed(Context context, NewsfeedAction newsfeedAction) {
newsfeedAction.execute(context);
}
@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
31
32
33
34
class CustomDeeplinkHandler : IBrazeDeeplinkHandler {
override fun gotoNewsFeed(context: Context, newsfeedAction: NewsfeedAction) {
newsfeedAction.execute(context)
}
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)
}
}
Vínculo profundo con la configuración de la aplicación
Para permitir que los vínculos profundos abran directamente la configuración de tu aplicación, necesitarás una página personalizada BrazeDeeplinkHandler
. En el siguiente ejemplo, la presencia de un par clave-valor personalizado llamado open_notification_page
hará que el vínculo profundo abra la página de configuración de la aplicación:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
}
}
@Override
public void gotoNewsFeed(Context context, NewsfeedAction newsfeedAction) {}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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)
}
}
override fun gotoNewsFeed(context: Context, newsfeedAction: NewsfeedAction) {}
})
Establecimiento de vínculos profundos con el canal de noticias
News Feed is being deprecated. We recommend migrating to our Content Cards messaging channel instead—it’s more flexible, customizable, and reliable. To get started, check out Migrating from News Feed.
Para establecer un vínculo profundo con el canal de noticias de Braze desde una notificación push, crea un vínculo profundo personalizado para tu actividad en el canal de noticias.
A continuación, cuando configures tu campaña de notificaciones push (ya sea a través del panel o de la API), configura la notificación para que navegue hasta el vínculo profundo de tu fuente de noticias.
Personalizar la actividad WebView
De forma predeterminada, cuando Braze abre vínculos profundos a sitios web dentro de la aplicación, los gestiona BrazeWebViewActivity
. Para cambiar esto:
- Crea una nueva Actividad que maneje la URL de destino de
Intent.getExtras()
con la clavecom.braze.Constants.BRAZE_WEBVIEW_URL_EXTRA
. Para ver un ejemplo, consultaBrazeWebViewActivity.java
. - Añade esa actividad a
AndroidManifest.xml
y estableceexported
enfalse
.1 2 3
<activity android:name=".MyCustomWebViewActivity" android:exported="false" />
- Configura tu Actividad personalizada en un objeto constructor de
BrazeConfig
. Construye el constructor y pásalo aBraze.configure()
en tuApplication.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)
Usar Jetpack Compose
Para gestionar los enlaces profundos al utilizar Jetpack Compose con NavHost:
- Asegúrate de que la actividad que gestiona tu enlace profundo está registrada en el Manifiesto de Android.
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>
- En NavHost, especifica qué enlaces profundos quieres que gestione.
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 ) }
- Dependiendo de la arquitectura de tu aplicación, puede que tengas que gestionar también la nueva intención que se envía a tu actividad actual.
1 2 3 4 5 6 7
DisposableEffect(Unit) { val listener = Consumer<Intent> { navHostController.handleDeepLink(it) } addOnNewIntentListener(listener) onDispose { removeOnNewIntentListener(listener) } }
guide/swift/deep_linking.md%} developer_