¿Cómo implementar Enlaces de aplicaciones de Android con dominios comodín?

Android tiene una guía sobre cómo implementar enlaces de aplicaciones. Es decir, si mi aplicación declara que maneja ciertos enlaces web, y trato de abrir este enlace en cualquier otra aplicación, el sistema intercepta esto y lleva al usuario directamente a mi aplicación, en lugar del navegador, para que pueda mostrar la información relevante Contenido directamente en mi aplicación. Muy útil.

Lo que me falta en la guía es dos cosas:

  1. Cómo implementar enlaces de aplicaciones con dominios comodín. Me gustaría que mi aplicación manejara enlaces a * .example.com, es decir, todos los enlaces a subdomains de example.com (test.example.com, something.example.com etc);

  2. Cómo implementar enlaces de aplicaciones sólo a rutas específicas de mi sitio. Por ejemplo, quiero interceptar test.example.com/something, pero no test.example.com/other. El primero debe venir a mi aplicación, el otro a mi navegador;

La guía correspondiente de iOS muestra que iOS maneja ambos escenarios (aunque la parte comodín no estaba clara de los documentos y tuve que aclarar con Apple Support que necesita colocar el archivo de asociación en el dominio raíz, no un subdominio).

¿Pueden los Enlaces de Aplicaciones de Android manejar dominios comodín y sólo un subconjunto de rutas?

  1. Desafortunadamente, parece que Android no puede manejar dominios comodín .

Si observa la guía de API para la etiqueta de datos ( https://developer.android.com/guide/topics/manifest/data-element.html ), puede ver que mencionan que el comodín está disponible para pathPattern y mimeType, pero No para el anfitrión.

La cosa es que, como explicó CommonsWare en otro post sobre el tema ( https://stackoverflow.com/a/34068591/4160079 ),

Los dominios se comprueban en el momento de la instalación y no hay ningún medio para agregar nuevos dominios, excepto por el envío de una nueva edición de la aplicación con un nuevo manifiesto.

Así que tendrás que listar manualmente todos los subdominios disponibles, y actualizar la aplicación cada vez que se lance un nuevo subdominio.

Así es como declara varios subdominios:

  <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="http" /> <data android:host="subdomain1.example.com" /> <data android:host="subdomain2.example.com" /> <data android:host="subdomain3.example.com" /> </intent-filter> </activity> 
  1. Sí, sólo puede manejar un subconjunto de rutas

Es la misma idea, basta con listar las rutas que desee usando el atributo path (de nuevo, vea la guía de API de etiqueta de datos arriba).

Si utiliza cadenas de consulta o parámetros de ruta, prefiera usar pathPrefix .

Si es necesario, puede utilizar comodines aquí, eligiendo pathPattern en su lugar.

La parte de ruta de un URI que debe comenzar con un /. El atributo path especifica una ruta completa que coincide con la ruta completa en un objeto Intent. El atributo pathPrefix especifica una ruta parcial que coincide sólo con la parte inicial de la ruta del objeto Intent. El atributo pathPattern especifica una ruta de acceso completa que coincide con la ruta completa del objeto Intent, pero puede contener los comodines siguientes: Un asterisco (' ') coincide con una secuencia de 0 a muchas ocurrencias del carácter inmediatamente anterior. Un período seguido de un asterisco (". ") Coincide con cualquier secuencia de 0 a muchos caracteres.

He aquí algunos ejemplos:

  <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="http" /> <data android:host="subdomain1.example.com" /> <data android:host="subdomain2.example.com" /> <data android:host="subdomain3.example.com" /> <data android:path="/path1" /> <!-- matches /path1 only --> <data android:pathPrefix="/test" /> <!-- matches /path2, /path2/something or also /path2?key=value etc... --> <data android:pathPattern="/wild.*" /> <!-- matches /wild, /wild3, /wilderness etc... --> </intent-filter> </activity> 

Android no puede manejar el dominio comodín como tal (como por su documentación de hoy), pero, esto responderá a su consulta sobre la inclusión y exclusión de ciertas / rutas .

Para implementar vínculos profundos para URL como-

 http://example.com/gizmos?1234, http://example.com/gizmos/1234, http://example.com/gizmos/toys/1234, etc. 

Su XML debe verse algo así:

 <activity android:name="com.example.android.GizmosActivity" android:label="@string/title_gizmos" > <intent-filter android:label="@string/filter_title_viewgizmos"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- Accepts URIs that begin with "example://gizmos” --> <data android:scheme="example" android:host="gizmos" /> </intent-filter> <intent-filter android:label="@string/filter_title_viewgizmos"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- Accepts URIs that begin with "http://example.com/gizmos” --> <data android:scheme="http" android:host="example.com" android:pathPrefix="/gizmos" /> </intent-filter> </activity> 

Ahora, considerando que fue capaz de lograr esto, aquí es cómo restringir el acceso a partes del contenido de su aplicación,

 <?xml version="1.0" encoding="utf-8"?> <search-engine xmlns:android="http://schemas.android.com/apk/res/android"> <noindex uri="http://example.com/gizmos/hidden_uri"/> <noindex uriPrefix="http://example.com/gizmos/hidden_prefix"/> <noindex uri="gizmos://hidden_path"/> <noindex uriPrefix="gizmos://hidden_prefix"/> </search-engine> 

Y el Manifiesto parte-

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.Gizmos"> <application> <activity android:name="com.example.android.GizmosActivity" android:label="@string/title_gizmos" > <intent-filter android:label="@string/filter_title_viewgizmos"> <action android:name="android.intent.action.VIEW"/> ... </activity> <meta-data android:name="search-engine" android:resource="@xml/noindex"/> </application> <uses-permission android:name="android.permission.INTERNET"/> </manifest> 

Para más detalles y explicación de este ejemplo, puede echar un vistazo a:

Android Deep Linking

Espero que ayude, codificación feliz

  • IOS y Android Algoritmo o biblioteca para embeber bordes de las imágenes similares a photoshop
  • En el teléfono móvil, detecte cuándo el usuario se desplaza "pasado" en la parte superior de la pantalla
  • Cómo abrir un servidor HTTP en reaccionar nativo
  • Alternativas de comunicación en tiempo real nativas a WebRTC
  • ¿Qué sucede con la ejecución de JavaScript (settimeout, etc.) cuando el iPhone / Android se va a dormir?
  • No se puede agregar la plataforma para ios y android (Error: ENOENT, ningún archivo o directorio)
  • Socket.io - ReferenceError: io no está definido
  • ¿Cuál es la utilidad de usar PhoneGap?
  • Eliminar la pantalla de bienvenida en el teléfono para ios y android
  • ¿Cómo regresar al mercado cuando no se maneja el esquema de URL personalizada de Android?
  • Combinación de servicio de Android, Cordova plugin de fondo y Skype O365 sdk no funciona después de pocas horas mientras se ejecuta en segundo plano?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.