URL Scheme — es un protocolo URI personalizado que una aplicación móvil registra en el sistema operativo para abrirse mediante enlaces como myapp://path. Según RFC 3986, el esquema URI define la sintaxis y semántica de todos los componentes subsiguientes de la dirección. Al navegar a dicho enlace, el sistema identifica la aplicación registrada por su identificador único y la inicia con los parámetros extraídos del enlace. Deep link basado en URL Scheme sigue siendo el mecanismo básico de navegación entre aplicaciones en plataformas móviles, a pesar de la aparición de alternativas más modernas.
Puntos clave
URL Scheme — es un identificador de protocolo único que una aplicación registra en el sistema operativo para recibir llamadas mediante enlaces personalizados. Cuando un usuario hace clic en un enlace como myapp://profile/123, el sistema identifica la aplicación que registró el esquema myapp y le pasa el control con el URI completo. Este mecanismo permite a las aplicaciones intercambiar datos y abrirse mutuamente sin necesidad de infraestructura de servidor.
El concepto de URL Scheme se toma directamente de los estándares web RFC 3986, donde el esquema URI es el primer componente de cualquier identificador universal de recurso. En el desarrollo móvil, esta idea se adapta para la comunicación entre aplicaciones, donde en lugar de un servidor HTTP, la propia aplicación actúa como manejadora del enlace.
Muchas aplicaciones populares registran sus propios URL Schemes para integración con servicios de terceros. Por ejemplo, Spotify usa el esquema spotify://, Telegram usa tg://, e Instagram usa instagram://. Los desarrolladores también suelen crear esquemas tipo appname:// para navegación interna y pruebas integrales de pantallas.
Los URL Schemes siguen siendo ampliamente utilizados en notificaciones push, boletines por correo electrónico y códigos QR donde se requiere navegación instantánea a una sección específica de la aplicación. Sin embargo, a partir de iOS 9 y Android 6, surgieron mecanismos alternativos que gradualmente complementan y reemplazan los esquemas simples.
La estructura de un URI personalizado sigue la especificación general RFC 3986 y consta de varios componentes. El esquema se especifica primero y se separa por dos puntos del resto de la dirección. Después del esquema pueden seguir host, puerto, ruta, parámetros query y fragmento, cada uno de los cuales es opcional.
La sintaxis completa se ve como scheme://host/path?key=value#fragment. El esquema es el único elemento obligatorio; el resto se determina según las necesidades de la implementación específica. La doble barra después del esquema se toma históricamente de HTTP y no es estrictamente obligatoria según la especificación, pero se usa universalmente como convención.
Para una representación visual de la estructura del URI se utiliza una tabla de componentes. Cada elemento tiene su propósito y nivel de obligatoriedad.
| Componente | Ejemplo | Obligatorio |
|---|---|---|
| Scheme | myapp | Sí |
| Host | profile | No |
| Path | /user/42 | No |
| Query | ?id=42&tab=main | No |
| Fragment | #section2 | No |
Los desarrolladores pueden elegir arbitrariamente la estructura del URI, lo que crea flexibilidad pero genera problemas de compatibilidad entre diferentes versiones de la aplicación. Se recomienda documentar el formato del URL Scheme como parte del API público de la aplicación y versionarlo al realizar cambios.
iOS requiere el registro explícito de cada URL Scheme en el archivo Info.plist del proyecto. El desarrollador añade un array CFBundleURLTypes, cada elemento del cual contiene un identificador (CFBundleURLName) y una lista de esquemas soportados (CFBundleURLSchemes). Tras el registro, el sistema dirige automáticamente todas las llamadas entrantes en los esquemas registrados a la aplicación.
El manejo de un URL Scheme entrante ocurre en el delegado de la aplicación mediante el método application(_:open:options:). Este método recibe un objeto URL del cual se extraen la ruta y los parámetros query para tomar decisiones de navegación. El manejador debe devolver un valor Bool que indique el éxito de la operación.
A continuación se muestra un ejemplo de implementación de un manejador de URL Scheme en Swift. El código demuestra la extracción del host y los parámetros query de un URI entrante usando URLComponents.
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any]
) -> Bool {
let host = url.host
let params = URLComponents(
url: url,
resolvingAgainstBaseURL: false
)?.queryItems
if host == "profile" {
navigateToProfile(params)
}
return true
}
El método utiliza URLComponents para el análisis seguro de los parámetros query. Este enfoque es preferible al análisis manual de cadenas, ya que maneja automáticamente la codificación porcentual y la decodificación de caracteres especiales en los valores de los parámetros.
Android utiliza el sistema Intent Filter para enrutar deep links basados en URL Scheme. El desarrollador declara un filtro en AndroidManifest.xml dentro de la etiqueta Activity que debe manejar el enlace. El filtro contiene la acción VIEW, las categorías BROWSABLE y DEFAULT, y una etiqueta data que especifica el esquema, host y pathPrefix.
Cuando un usuario hace clic en un enlace con un esquema personalizado, el sistema verifica el Intent Filter de todas las aplicaciones instaladas. Si se encuentran múltiples aplicaciones coincidentes, se presenta al usuario un diálogo de selección. La categoría BROWSABLE permite procesar el enlace desde el navegador.
Ejemplo de declaración de Intent Filter en AndroidManifest.xml para manejar el esquema myapp en una Activity. La combinación de action y category es obligatoria para el enrutamiento correcto de deep links.
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="myapp"
android:host="profile"
android:pathPrefix="/user" />
</intent-filter>
</activity>
Después de configurar el filtro en la Activity, se debe llamar a intent.getData() para obtener el URI. Es importante verificar intent y data por null, ya que la Activity puede iniciarse sin un deep link entrante, por ejemplo durante el inicio estándar desde el lanzador.
Los parámetros query en URL Scheme se pasan después del signo de interrogación en formato clave=valor, separados por ampersand. Este formato es idéntico a las solicitudes HTTP y se procesa fácilmente con las herramientas estándar de la plataforma. Los parámetros deben codificarse mediante codificación porcentual para todos los caracteres que no pertenezcan al conjunto permitido de URI.
Ejemplo de un enlace completo con parámetros: myapp://profile?userId=42&source=email&ref=abc123. Después de extraer la URL, la aplicación analiza secuencialmente todos los query-items y basándose en sus valores toma una decisión de navegación a la pantalla destino.
Al pasar datos complejos, es importante considerar la limitación de longitud del URI. En iOS, la longitud máxima del URL Scheme está limitada a 2 KB, después de lo cual el sistema trunca el enlace. En Android, el límite es de aproximadamente 8 KB, pero el valor exacto depende de la versión del SO y del fabricante del dispositivo. Para grandes volúmenes de datos, se recomienda pasar solo un identificador de sesión mediante URL Scheme y cargar el resto de los datos desde el servidor.
El principal inconveniente de URL Scheme es la imposibilidad de manejar un enlace si la aplicación no está instalada en el dispositivo. El navegador muestra un error y el usuario pierde el contexto de navegación. Para solucionar este problema, Apple introdujo Universal Links en iOS 9 y Google introdujo App Links en Android 6. Ambos mecanismos se registran mediante un dominio web asociado con la aplicación.
Universal Links y App Links funcionan como enlaces HTTPS normales, pero cuando la aplicación está instalada, la abren sin un diálogo de selección. Si la aplicación no está instalada, el enlace abre una página web en el mismo dominio, preservando la experiencia del usuario. Esto los convierte en la alternativa preferida para entornos de producción.
Para URL Scheme en iOS y Android no existe un mecanismo de fallback integrado. Los desarrolladores utilizan soluciones intermedias de servidor: el enlace lleva a una página web que verifica si la aplicación está instalada mediante JavaScript y redirige ya sea al esquema o a la tienda de aplicaciones. Firebase Dynamic Links y Branch.io ofrecen soluciones listas para este problema con soporte para deferred deep links que determinan automáticamente el estado de instalación y enrutan al usuario sin necesidad de desarrollar un pipeline de servidor personalizado.
Surge una complejidad adicional al usar URL Scheme en iOS 15+ y Android 12+, donde se han endurecido las reglas de privacidad. Safari bloquea los intentos de abrir un esquema no registrado sin confirmación previa, y Android 12 restringe la visibilidad de las aplicaciones instaladas a través de PackageManager. Estos cambios hacen que el uso de URL Scheme para la comunicación entre aplicaciones sea menos fiable que en versiones anteriores de las plataformas.
Preguntas frecuentes
URL Scheme utiliza un protocolo personalizado sin cifrado, mientras que Universal Links funcionan mediante HTTPS con verificación de dominio. Universal Links no muestran un diálogo de selección de aplicación y se manejan correctamente cuando la aplicación no está instalada en el dispositivo.
Sí, pero todos los caracteres no ASCII deben codificarse mediante percent-encoding según RFC 3986. Se recomienda evitar el cirílico en URL Scheme para garantizar la compatibilidad con versiones antiguas del SO y navegadores.
No hay límites en la cantidad de esquemas ni en iOS ni en Android. En la práctica, las aplicaciones usan de uno a cinco esquemas. Por ejemplo, Telegram registra los esquemas tg://, t.me/, telegram:// y telegram.me://.
En iOS se utiliza el método canOpenURL(_:), que devuelve true si el esquema está registrado. En Android, la verificación se realiza mediante PackageManager.queryIntentActivities(). Ambas plataformas requieren que el esquema se especifique previamente en la configuración.
No, URL Scheme no cifra los datos. Cualquier aplicación que registre el mismo esquema puede interceptar el enlace. Para seguridad, use Universal Links con HTTPS o cifrado de extremo a extremo a nivel de protocolo.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también