> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Deep Linking

> Configure deep linking para dirigir a los usuarios desde notificaciones push, correos electrónicos y mensajes in-app a pantallas específicas en su aplicación Android o iOS usando Universal Links, App Links o esquemas de URI personalizados.

## Descripción general

El deep linking dirige a los usuarios a una pantalla específica en su aplicación cuando tocan un enlace, ya sea desde un correo electrónico, SMS, sitio web, notificación push o mensaje in-app. Si la aplicación no está instalada, el sistema operativo puede redirigir a los usuarios a la tienda de aplicaciones o a una página web de respaldo.

Esta guía cubre:

* **Tipos de deep links** y cuándo usar cada uno
* **Configuración de plataforma** para Android e iOS
* **Manejo de deep links** en su aplicación con el SDK de OneSignal
* **Comportamiento por canal** para push, correo electrónico y mensajes in-app

<Info>
  Para la configuración general de URL y enlaces (URLs de lanzamiento, parámetros UTM, URLs dinámicas, seguimiento de enlaces), consulte [URLs, enlaces y deep links](./links).
</Info>

***

## Requisitos previos

Antes de configurar deep links, necesita:

* Una [cuenta de OneSignal](https://dashboard.onesignal.com) con una aplicación configurada
* El [SDK de OneSignal](./mobile-sdk-setup) instalado en su aplicación móvil
* Un dominio que controle, alojado en **HTTPS**, para Universal Links o App Links
* Acceso al código fuente y la configuración de compilación de su aplicación (Xcode para iOS, Android Studio para Android)

***

## Tipos de deep links

Existen tres mecanismos comunes de deep linking. Cada uno tiene un comportamiento diferente según si la aplicación está instalada.

| Tipo                            | Plataforma    | Formato                       | Aplicación no instalada                  |
| ------------------------------- | ------------- | ----------------------------- | ---------------------------------------- |
| **Universal Links**             | iOS 9+        | `https://yourdomain.com/path` | Abre la URL en Safari                    |
| **App Links**                   | Android 6.0+  | `https://yourdomain.com/path` | Abre la URL en el navegador              |
| **Esquemas URI personalizados** | iOS y Android | `myapp://path`                | Falla silenciosamente o muestra un error |

**Recomendación:** Use Universal Links (iOS) y App Links (Android) para la experiencia más confiable. Utilizan URLs `https://` estándar, funcionan en todos los canales (push, correo electrónico, SMS) y proporcionan comportamiento de respaldo cuando la aplicación no está instalada. Los esquemas URI personalizados (`myapp://`) son más simples de configurar, pero no proporcionan comportamiento de respaldo y puede que no funcionen en todos los contextos (por ejemplo, clientes de correo electrónico).

<Warning>
  Universal Links y App Links requieren alojar un archivo de verificación en su dominio. Sin este archivo, el SO trata el enlace como una URL web normal.
</Warning>

***

## Configuración de Android (App Links)

Use el [App Links Assistant](https://developer.android.com/training/app-links) de Android Studio para generar la configuración necesaria.

### Configurar filtros de intent

Añada un filtro de intent a la Activity que debe manejar el deep link:

```xml theme={null}
<activity android:name=".DeepLinkActivity" android:exported="true">
  <intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="https" android:host="yourdomain.com" />
  </intent-filter>
</activity>
```

### Manejar el intent entrante

```java theme={null}
Intent appLinkIntent = getIntent();
String appLinkAction = appLinkIntent.getAction();
Uri appLinkData = appLinkIntent.getData();
```

### Alojar el archivo Digital Asset Links

Genere el archivo `assetlinks.json` usando el App Links Assistant de Android Studio y alójelo en:

```
https://yourdomain.com/.well-known/assetlinks.json
```

Consulte la documentación de Google [Verify App Links](https://developer.android.com/training/app-links/verify-android-applinks) para el formato completo del archivo y los pasos de verificación.

***

## Configuración de iOS (Universal Links)

Los [Universal Links](https://developer.apple.com/documentation/xcode/supporting-universal-links-in-your-app) de Apple abren su aplicación cuando un usuario toca una URL `https://` coincidente. Para casos de uso más simples donde se garantiza que la aplicación está instalada, puede usar [Esquemas de URL](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app) en su lugar.

### Habilitar Associated Domains

1. En Xcode, seleccione su target → **Signing & Capabilities** → agregue **Associated Domains**
2. Añada su dominio: `applinks:yourdomain.com`

### Manejar el Universal Link en su aplicación

<CodeGroup>
  ```swift Swift theme={null}
  func application(_ application: UIApplication,
                   continue userActivity: NSUserActivity,
                   restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
          let url = userActivity.webpageURL else {
      return false
    }
    // Route to the correct screen based on the URL path
    return true
  }
  ```

  ```objectivec Objective-C theme={null}
  - (BOOL)application:(UIApplication *)application
      continueUserActivity:(NSUserActivity *)userActivity
      restorationHandler:(void (^)(NSArray *))restorationHandler {
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
      NSURL *url = userActivity.webpageURL;
      // Route to the correct screen based on the URL path
      return YES;
    }
    return NO;
  }
  ```
</CodeGroup>

### Alojar el archivo Apple App Site Association

Cree un archivo `apple-app-site-association` (AASA) y alójelo en:

```
https://yourdomain.com/.well-known/apple-app-site-association
```

Reemplace `TEAMID` con su Apple Team ID y `com.example.app` con su identificador de bundle:

```json theme={null}
{
  "applinks": {
    "apps": [],
    "details": [{
      "appID": "TEAMID.com.example.app",
      "paths": ["/path/*", "/another-path"]
    }]
  }
}
```

Consulte la documentación de Apple [Supporting Associated Domains](https://developer.apple.com/documentation/xcode/supporting-associated-domains) para la especificación completa.

### Comportamiento de la URL de lanzamiento en iOS

El SDK de iOS de OneSignal usa `openURL` para manejar la URL de lanzamiento (propiedad `url`). Esto hace que el enlace se abra primero en el navegador y luego redirige de vuelta a la aplicación, lo que puede ser una mala experiencia de usuario.

Para evitar esto, use uno de estos enfoques:

1. **Use `data` en lugar de `url`** en el payload de la API y maneje el deep link en su [Listener de clic de notificación push](./mobile-sdk-reference#addclicklistener-push)
2. **Suprima las URLs de lanzamiento** añadiendo `OneSignal_suppress_launch_urls` a su `Info.plist` como Boolean con valor `YES`, luego maneje toda la navegación en el listener de clic

<Tip>
  El enfoque 1 (usar `data` + listener de clic) es recomendado porque le da control total sobre la navegación sin depender del SO para resolver la URL.
</Tip>

***

## Manejar deep links con el SDK de OneSignal

La forma más confiable de manejar deep links de mensajes de OneSignal es usar los listeners de clic del SDK en lugar de depender de la resolución de enlaces a nivel del SO. Esto le da control total sobre la navegación en su aplicación.

### Listener de clic de notificación push

Use `addClickListener` para interceptar clics en notificaciones y enrutar al usuario según la URL del deep link o datos adicionales:

<CodeGroup>
  ```kotlin Kotlin theme={null}
  OneSignal.Notifications.addClickListener { event ->
    val url = event.notification.launchURL
    val data = event.notification.additionalData
    // Route to the correct screen based on url or data
  }
  ```

  ```swift Swift theme={null}
  class AppDelegate: UIResponder, UIApplicationDelegate, OSNotificationClickListener {
    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
      OneSignal.Notifications.addClickListener(self)
      return true
    }

    func onClick(event: OSNotificationClickEvent) {
      let url = event.notification.launchURL
      let data = event.notification.additionalData
      // Route to the correct screen based on url or data
    }
  }
  ```

  ```javascript React Native theme={null}
  OneSignal.Notifications.addEventListener('click', (event) => {
    const url = event.notification.launchURL;
    const data = event.notification.additionalData;
    // Route to the correct screen based on url or data
  });
  ```

  ```dart Flutter theme={null}
  OneSignal.Notifications.addClickListener((event) {
    final url = event.notification.launchUrl;
    final data = event.notification.additionalData;
    // Route to the correct screen based on url or data
  });
  ```

  ```csharp Unity (C#) theme={null}
  OneSignal.Notifications.Clicked += (sender, e) => {
    var url = e.Notification.LaunchURL;
    var data = e.Notification.AdditionalData;
    // Route to the correct screen based on url or data
  };
  ```
</CodeGroup>

Para la referencia completa de la API, incluidos Java, Objective-C y Cordova/Ionic, consulte [`addClickListener()` Push](./mobile-sdk-reference#addclicklistener-push).

### Listener de clic de mensaje in-app

Use el listener de clic de mensaje in-app para manejar deep links de botones y acciones de mensajes in-app:

<CodeGroup>
  ```kotlin Kotlin theme={null}
  OneSignal.InAppMessages.addClickListener { event ->
    val actionId = event.result.actionId
    // Route based on the action ID (your deep link URI)
  }
  ```

  ```swift Swift theme={null}
  func onClick(event: OSInAppMessageClickEvent) {
    let actionId = event.result.actionId
    // Route based on the action ID (your deep link URI)
  }
  ```

  ```javascript React Native theme={null}
  OneSignal.InAppMessages.addEventListener('click', (event) => {
    const actionId = event.result.actionId;
    // Route based on the action ID (your deep link URI)
  });
  ```

  ```dart Flutter theme={null}
  OneSignal.InAppMessages.addClickListener((event) {
    final actionId = event.result.actionId;
    // Route based on the action ID (your deep link URI)
  });
  ```
</CodeGroup>

Para la referencia completa de la API, consulte [`addClickListener()` In-App](./mobile-sdk-reference#addclicklistener-in-app).

***

## Notificaciones push

Incluya el deep link de una de estas dos formas:

| Método                              | Propiedad de API                    | Comportamiento                                                                                 |
| ----------------------------------- | ----------------------------------- | ---------------------------------------------------------------------------------------------- |
| **URL de lanzamiento**              | `url` (o `app_url` solo para móvil) | El SO abre la URL directamente. En iOS, esto abre el navegador primero a menos que se suprima. |
| **Datos adicionales** (recomendado) | `data`                              | La URL se pasa a su listener de clic. Usted controla la navegación completamente.              |

### Comportamiento por plataforma

* **Android**: Abre la Activity coincidente directamente a través de App Links
* **iOS**: Abre Safari, luego la aplicación (a menos que [suprima las URLs de lanzamiento](#comportamiento-de-la-url-de-lanzamiento-en-ios) y maneje la navegación en el listener de clic)

Consulte [URLs, enlaces y deep links](./links) para detalles sobre `url`, `web_url` y `app_url`.

***

## Correos electrónicos

De forma predeterminada, OneSignal reescribe los enlaces de correo electrónico para el seguimiento de clics. Esto cambia la URL, lo que rompe el deep linking porque el SO ya no reconoce el dominio como coincidente con el Associated Domain de su aplicación.

### Habilitar deep links en correo electrónico

Para preservar los deep links, deshabilite el seguimiento de clics usando uno de estos métodos:

* **Panel de control**: Desmarque **Track link clicks** en el editor de correo electrónico
* **API**: Establezca `disable_email_click_tracking: true`
* **Por enlace**: Agregue el atributo `disable-tracking=true` a la etiqueta de ancla (`<a href="https://yourdomain.com/path" disable-tracking=true>…</a>`) para deshabilitar el seguimiento en enlaces individuales mientras lo mantiene habilitado para otros

<Frame caption="Track link clicks deshabilitado en el editor de correo electrónico.">
  <img src="https://mintcdn.com/onesignal/jBdBk5XvQR5eKOks/images/docs/787e21d-Screenshot_2024-05-29_at_2.21.43_PM.png?fit=max&auto=format&n=jBdBk5XvQR5eKOks&q=85&s=f7e1079f4860ecf34fd95375a4332573" alt="Editor de correo electrónico de OneSignal con la casilla Track link clicks desmarcada" width="1756" height="492" data-path="images/docs/787e21d-Screenshot_2024-05-29_at_2.21.43_PM.png" />
</Frame>

<Warning>
  Deshabilitar el seguimiento de clics significa que pierde las métricas de clics en los [Informes de correo electrónico](./email-message-reports). Considere usar exclusiones de seguimiento por enlace para preservar los análisis en URLs que no son deep links.
</Warning>

### Comportamiento de deep links en correo electrónico

| Escenario                                                 | Resultado                                         |
| --------------------------------------------------------- | ------------------------------------------------- |
| iOS + Safari + Universal Link + Seguimiento deshabilitado | Abre la aplicación directamente                   |
| iOS + Safari + Universal Link + Seguimiento habilitado    | Abre Safari, solicita abrir la aplicación         |
| iOS + cliente de correo no-Safari + Universal Link        | Abre App Store si la aplicación no está instalada |
| Android + App Link + Seguimiento deshabilitado            | Abre la aplicación directamente                   |
| Android + App Link + Seguimiento habilitado               | Abre el navegador primero, luego la aplicación    |

***

## Mensajes in-app

Los deep links en mensajes in-app usan el patrón de listener de clic. Usted establece un identificador de acción personalizado en el editor de mensajes y luego lo maneja en el código de su aplicación.

### Editor de arrastrar y soltar

1. Añada un botón o elemento clicable
2. Establezca la acción de clic como [Custom Action ID](./iam-click-actions#custom-action-id)
3. Ingrese su URI de deep link como **Action Name** (por ejemplo, `https://yourdomain.com/promo` o `myapp://promo`)

### Editor HTML

Use el método [`openUrl`](./in-app-message-api#click-name) en la biblioteca JS In-App para activar deep links desde HTML personalizado.

### Manejar el clic

Use el [listener de clic de mensaje in-app](#listener-de-clic-de-mensaje-in-app) para interceptar la acción y navegar al usuario en su aplicación.

***

## Probar deep links

### Android

Use `adb` para probar App Links sin enviar una notificación:

```bash theme={null}
adb shell am start -a android.intent.action.VIEW \
  -d "https://yourdomain.com/path" \
  com.your.package
```

Verifique que su `assetlinks.json` sea accesible:

```bash theme={null}
curl -I https://yourdomain.com/.well-known/assetlinks.json
```

### iOS

Use la [herramienta de validación de Associated Domains](https://search.developer.apple.com/appsearch-validation-tool/) de Apple para verificar su archivo AASA. También puede probar Universal Links:

1. Pegando el enlace en la aplicación Notas
2. Manteniendo presionado el enlace para confirmar que aparece la opción "Abrir en \[App]"
3. Tocando el enlace para verificar que abre su aplicación

<Note>
  Los Universal Links no funcionan cuando se escriben directamente en la barra de direcciones de Safari — deben tocarse desde otra aplicación (Notas, Correo, Mensajes, etc.).
</Note>

### Mensajes de prueba de OneSignal

1. Envíe un push de prueba desde el panel de control de OneSignal con una URL de deep link como URL de lanzamiento o en Datos adicionales
2. Verifique que la notificación abra la pantalla correcta en su aplicación
3. Revise los registros de su listener de clic para confirmar que se recibió la URL o los datos

***

## Resolución de problemas

### El deep link de iOS abre Safari en lugar de la aplicación

Este es el problema más común. Posibles causas:

* **Archivo AASA no alojado correctamente** — Verifique que esté en `https://yourdomain.com/.well-known/apple-app-site-association` con `Content-Type: application/json` y sin redirecciones
* **Associated Domains no configurado** — Verifique en Xcode → Signing & Capabilities → Associated Domains que incluye `applinks:yourdomain.com`
* **Comportamiento de la URL de lanzamiento** — El SDK de iOS de OneSignal usa `openURL` para la propiedad `url`, lo que activa el comportamiento de apertura con el navegador primero. Use `data` + listener de clic o [suprima las URLs de lanzamiento](#comportamiento-de-la-url-de-lanzamiento-en-ios)
* **Pruebas en Safari** — Los Universal Links no se activan desde la barra de direcciones de Safari. Pruebe desde Notas, Correo u otra aplicación.

### El deep link de Android abre el navegador

* **`autoVerify` faltante** — Asegúrese de que su filtro de intent incluya `android:autoVerify="true"`
* **`assetlinks.json` no encontrado** — Verifique que el archivo esté en `https://yourdomain.com/.well-known/assetlinks.json` y devuelva HTTP 200
* **Discrepancia de huella SHA256** — La huella en `assetlinks.json` debe coincidir con el certificado de firma de su aplicación. Las compilaciones de depuración y de lanzamiento usan certificados diferentes.

### El deep link funciona en push pero no en correo electrónico

El seguimiento de clics de correo electrónico reescribe las URLs, rompiendo la verificación del dominio. [Deshabilite el seguimiento de clics](#habilitar-deep-links-en-correo-electrónico) para correos electrónicos que contengan deep links.

### Se recibió el deep link pero la aplicación no navega

* Verifique que su listener de clic esté registrado temprano en el ciclo de vida de la aplicación (por ejemplo, en `Application.onCreate()` o `AppDelegate.didFinishLaunchingWithOptions`)
* Compruebe que la URL o el ID de acción coincida con lo que espera su lógica de enrutamiento
* En iOS, confirme que no está confiando en `url` sin suprimir las URLs de lanzamiento — el navegador puede consumir el enlace antes de que se active su listener

***

## Preguntas frecuentes

### ¿Qué sucede si la aplicación no está instalada?

Con Universal Links (iOS), la URL se abre en Safari como una página web normal. Con App Links (Android), la URL se abre en el navegador predeterminado. En ambos casos, puede configurar su página web para redirigir a la tienda de aplicaciones apropiada. Los esquemas URI personalizados (`myapp://`) fallan silenciosamente o muestran un error si la aplicación no está instalada.

### ¿Debo usar URL de lanzamiento o Datos adicionales para deep linking?

Los Datos adicionales (`data`) son recomendados para deep links móviles porque le dan control total sobre la navegación a través del listener de clic. La URL de lanzamiento (`url`) es más simple pero tiene limitaciones en iOS (redirección del navegador) y no permite lógica de enrutamiento personalizada.

### ¿Puedo personalizar los deep links con datos del usuario?

Sí. Use [URLs dinámicas](./links#dynamic-urls) con sintaxis Liquid para inyectar propiedades del usuario, etiquetas o datos personalizados en sus URLs de deep link. Por ejemplo: `https://yourdomain.com/profile/{{subscription.external_id}}`.

### ¿Puedo usar deep links con esquemas URI personalizados?

Sí. Establezca su esquema personalizado (por ejemplo, `myapp://screen`) como valor de URL de lanzamiento o Datos adicionales. Los esquemas personalizados funcionan bien para push y mensajes in-app, pero puede que no funcionen en clientes de correo electrónico. Tampoco proporcionan respaldo si la aplicación no está instalada.

### ¿Los deep links funcionan con OneSignal Journeys?

Sí. Al configurar un paso de mensaje en un Journey, establezca la URL de lanzamiento o los Datos adicionales con su deep link. El comportamiento es el mismo que en un push o mensaje in-app independiente.

***

<Columns cols={2}>
  <Card title="URLs, enlaces y deep links" icon="link" href="./links">
    URLs de lanzamiento, parámetros UTM, URLs dinámicas y configuración de seguimiento de enlaces.
  </Card>

  <Card title="Referencia del SDK móvil" icon="code" href="./mobile-sdk-reference">
    Referencia completa de la API para listeners de clic y manejo de eventos de notificación.
  </Card>

  <Card title="In-App Click Actions" icon="hand-pointer" href="./iam-click-actions">
    Configure acciones de clic para botones y elementos de mensajes in-app.
  </Card>

  <Card title="Configuración de push móvil" icon="mobile" href="./mobile-push-setup">
    Configuración de notificaciones push específica de plataforma para Android e iOS.
  </Card>
</Columns>
