2011-02-10 7 views
13

Estoy tratando de crear un enlace que pueda enviarse por correo electrónico que, cuando se abra en un dispositivo Android con mi aplicación instalada, abrirá automáticamente la página correcta en mi aplicación.Enlace profundo de Android en una aplicación

He trabajado parcialmente de diferentes maneras pero he encontrado algunos problemas que me preguntaban si alguien tiene soluciones.

Intento 1: Uso de un esquema personalizado: myapp: // someItem. Esto funciona, pero algunas aplicaciones de correo electrónico no lo tratan como un enlace, ya que no es http. ¿Hay alguna manera de obligar a las aplicaciones a tratarlo como un enlace válido? gmail por ejemplo.

Intento 2: Usando un enlace http con un host: http://com.myapp/someItem. Esto también funciona, pero mi aplicación termina registrada para manejar todos los enlaces http que no es ideal.

Intento 3: Usando un enlace http con el host y el puerto: http://com.myapp:2345/someItem. Esta es mi solución actual con el único inconveniente de que, cuando se abre el enlace, todavía se ofrece la opción de abrir el enlace en un navegador. ¿Hay alguna forma de evitar que el navegador intente abrir mis enlaces?

¿Alguien tiene una forma de hacer enlaces que serán tratados como enlaces por todas las aplicaciones y también serán ignorados por el navegador al abrirlos?

+0

¿Me podría apuntar a algunos recursos que me ayuda a - "cómo habilitar enlaces profundos para App contenido" - El enlace profundo debe llevar a los usuarios directamente con el contenido, sin más consultas, páginas intersticiales, o inicios de sesión . – user2056563

Respuesta

4

Esta técnica realidad parece estar funcionando en Android de lo que puedo decir:

http://mobile.dzone.com/news/custom-url-schemes-phonegap

no lo han intentado en una aplicación de producción real todavía, por lo que su millaje puede variar. Lo que he hecho es usar esa técnica de crear un iframe oculto e intentar establecer la ubicación en el esquema de url personalizado, y llamar a la función de onload para el documento. Lo que he visto hasta ahora (solo lo he probado en dispositivos 2.2 y 2.3) es que si tengo una aplicación instalada que maneje el esquema personalizado, la aplicación se ejecutará, y si no, la página se procesará.

URL única relativamente limpia para cubrir ambos casos, y no arruina cosas como los recursos compartidos de Twitter de la URL. Una versión de producción real solo podría hacer la sonda oculta iframe si la solicitud proviene de algo que parece una plataforma que podría admitir la aplicación para reducir el riesgo de un comportamiento de escritorio incompatible.

+1

He conseguido este 90% de trabajo. Lo único que no me gusta es que deja una página en el navegador. Me gustaría retroceder 1 página en cuanto al éxito y permanecer donde está cuando no se muestra un enlace de descarga. ¿Has encontrado alguna forma de comprobar si el redireccionamiento funcionó? – skorulis

+1

Disculpe, pero no me he divertido tanto como para optimizar el historial y cosas por el estilo, simplemente probé lo básico. Normalmente, puede iniciarse sin bandera de historial con la intención de solucionar el problema al dejar una página en el navegador. Pero como "algo más" lo está iniciando, no estoy seguro de cómo encontrar una solución. ¡Buena suerte! Feliz lo básico está funcionando al menos. – mikerowehl

0

Si puede usar algo del lado del servidor, ¿podría tener una página común que salta al enlace de esquema personalizado desde el navegador cuando se visita? Esto tiene la ventaja adicional de poder posiblemente saber si la aplicación no está instalada y solicitar la instalación.

No soluciona el problema de la apertura de enlaces en el navegador. La única solución verdadera que se me ocurre es un manejador de enlaces que salta a la aplicación adecuada. Entonces el problema sería que permite al usuario cambiar el navegador preferido ...

+0

¿Cómo verifico desde el navegador si la aplicación fue instalada? – skorulis

+0

Oh, no pensé en eso. No sé si hay una forma fácil de hacerlo. Al menos, una página de clic sería posible. ; editar: ¿Tal vez podría ejecutar un servicio de servidor HTTP en la aplicación y luego usarlo para detectar la presencia de la aplicación? Eso es todo lo que puedo pensar en este momento. –

4

Para responder a sus preguntas, a continuación se muestra un filtro de intención de muestra en el manifiesto.

<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:host="www.example.com" 
     android:pathPrefix="/home" 
     android:scheme="https"/> 
</intent-filter> 

Así que, básicamente, cuando alguien hace clic en cualquier enlace a partir de http://www.example.com/home, él/ella se le dará la opción de abrir con su aplicación, junto con las aplicaciones de navegador. Tiene que manejar la intención en la actividad

También el esquema podría ser cualquier cosa, pero el esquema http es recomendado por google, para que tanto su aplicación como la aplicación del navegador puedan escuchar los clics en la URL interconectada.

Nota: No olvide agregar la aplicación android: // el nombre de su paquete/http/www.example.com/home/... en sus páginas web, si desea vincular la aplicación.

1
1:-set Custom URL schemes like http://example.com. 
    For example, the URL http://example.com/?id=95 , 
    will open up the relevant FAQ and the URL 
    http://example.com/?sectionid=8 
    (where sectionid is the publish id of any Section), 
    will open up relevant section. 
2:- <activity android:name="com.example.shilpi.deeplinkingsample.DeepLinkActivity"> 
      <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" android:host="example.com"/> 
      </intent-filter> 
     </activity> 
3:-   @Override 
      protected void onResume() { 
       super.onResume(); 

       Intent in = getIntent(); 
       Uri data = in.getData(); 
       System.out.println("deeplinkingcallback :- "+data); 
      } 
+2

Aunque esta respuesta puede ser técnicamente correcta, valdría la pena rellenar su respuesta explicando lo que hace. Esto ayudará tanto al OP como a los futuros visitantes. Tal como está, esto es solo un volcado de código. – Bugs

Cuestiones relacionadas