Mobile Safari Página download / ocultar / desenfoque para Deep Linking

Estoy buscando un evento en safari mobile que detecte cuándo se ocultó la página debido a una networkingirección. Quiero abrir mi aplicación directamente si un usuario lo tiene instalado, luego bash Facebook si está instalado, y si no, entonces ve a la página web para ese ID.

  1. Si 'myapp' está instalado, entonces myapp se abre. Pero la pestaña de safari aún se networkingirige a facebook.com
  2. Si 'myapp' no está instalado, pero Facebook es, entonces se abre la aplicación facebook ios. Pero la pestaña de safari aún se networkingirige a facebook.com

He creado un enlace de testing 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: (sugerencia eliminada sobre la adición de return false; )

Intente configurar una verificación dentro de las funciones setTimeout en lugar de simplemente borrar los times de espera. (Me parece que la limpieza es mucho más efectiva para los intervalos en lugar de las llamadas simples setTimeout de 1 vez). Además, verifico que el usuario no esté en un browser de escritorio antes de probar un protocolo de aplicación nativo como mi app:// o fb:// ya que esos browseres intentarán seguir esa location 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, descomenta los loggings de la console y experimenta con el valor de timeout . Este código exacto se probó con éxito en IOS 6.1 Safari y Safari 6.0.2 Mac. ¡Espero eso ayude!