open linking link intent from custom app javascript ios safari mobile-safari deep-linking

javascript - linking - Descarga/ocultación/desenfoque de la página de Mobile Safari para enlaces profundos



open app from url android (1)

Estoy buscando un evento en un safari móvil que detectará cuándo se ha ocultado la página debido a una redirección. Quiero abrir mi aplicación directamente si un usuario la tiene instalada, luego intente facebook si está instalada, y si no, vaya a la página web para esa identificación.

  1. Si ''myapp'' está instalado, entonces myapp se abre. Pero la pestaña de safari todavía se redirige a facebook.com
  2. Si ''myapp'' no está instalado, pero facebook lo está, entonces se abre la aplicación ios de facebook. Pero la pestaña de safari todavía se redirige a facebook.com

He creado un enlace de prueba con el siguiente HTML / JS:

<!DOCTYPE html> <html> <head> <title>Redirect Test</title> <script type=''text/javascript'' src=''//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js''></script> <meta name=''viewport'' content=''initial-scale = 1.0,maximum-scale = 1.0'' /> </head> <body> <button>Open Oreo</button> <script type=''text/javascript''> jQuery(function(){ jQuery( ''button'' ).on( ''click'', function(){ var myid = null, fbid = null; // Watch for page leave to kill timers jQuery( window ).on( ''pagehide pageshow blur unload'', function(){ if ( myid ) { clearTimeout( myid ); } if ( fbid ) { clearTimeout( fbid ); } }); window.location = "myapp://fbprofile/oreo"; var myid = setTimeout(function(){ // My app doesn''t exist on device, open facebook window.location = "fb://profile/oreo"; fbid = setTimeout(function(){ // Facebook doesn''t exist on device, open facebook mobile window.location = "https://www.facebook.com/oreo"; }, 100); }, 100); }); }); </script> </body> </html>


Buen código.
EDITAR: (se eliminó la sugerencia de agregar return false; )

Intente establecer una verificación dentro de sus funciones de setTimeout en lugar de simplemente borrar los tiempos de espera. (Encuentro que la compensación es mucho más efectiva para intervalos en lugar de simples llamadas de tiempo de espera de setTimeout). Además, me aseguraría de que el usuario no esté en un navegador de escritorio antes de probar un protocolo de aplicación nativo como mi app:// o fb:// ya que esos navegadores intentarán seguir esa ubicación y terminarán mostrando un error.

Tratar:

<!DOCTYPE html> <html> <head> <title>Redirect Test</title> <script type=''text/javascript'' src=''//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js''></script> <meta name=''viewport'' content=''initial-scale = 1.0,maximum-scale = 1.0'' /> </head> <body> <button>Open Oreo</button> <script type=''text/javascript''> var mobileExp = /android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile|o2|opera mini|palm( os)?|plucker|pocket|pre//|psp|smartphone|symbian|treo|up/.(browser|link)|vodafone|wap|windows ce; (iemobile|ppc)|xiino/i; jQuery(function(){ jQuery( ''button'' ).on( ''click'', function(){ // Don''t give desktop browsers a chance to fail on a nativeapp:// protocol if(!mobileExp.test(navigator.userAgent)) { window.location = "https://www.facebook.com/oreo"; return; } var clicked = +new Date, timeout = 100; window.location = "myapp://fbprofile/oreo"; setTimeout(function(){ // If we''re still here after a (timeout), try native facebook app if (+new Date - clicked < timeout*2){ console.log(''clicked ''+ (+new Date - clicked) +'' ago- go to FB''); window.location = "fb://profile/oreo"; } else { console.log(''too late for facebook''); } setTimeout(function(){ // If we''re still here after another (timeout), try facebook web app if (+new Date - clicked < timeout*2){ console.log(''clicked ''+ (+new Date - clicked) +'' ago- go to browser''); window.location = "https://www.facebook.com/oreo"; } else { console.log(''too late for browser''); } }, timeout); }, timeout); }); }); </script> </body> </html>

Por supuesto, anule los comentarios de los registros de la consola y haga algunos experimentos con el valor del timeout de timeout . Este código exacto se probó con éxito en IOS 6.1 Safari y Safari 6.0.2 Mac. ¡Espero eso ayude!