source example ejemplos close cordova phonegap-plugins ionic inappbrowser

example - Cordova, ¿por qué se necesitaría el complemento InAppBrowser para abrir enlaces en el navegador del sistema?



ionic 2 install inappbrowser (1)

Tengo una aplicación Cordova, es una aplicación de una sola página con un solo archivo HTML.

Todos los enlaces deben abrirse en el navegador del sistema. No quiero un InAppBrowser "incrustado" pero realmente el sistema nativo / navegador externo.

En todas partes podemos encontrar ejemplos de código usando InAppBrowser con algo como:

window.open(''http://apache.org'', ''_system'');

Pero, ¿por qué necesitamos instalar InAppBrowser, incluso si ni siquiera planeamos usar un navegador integrado?

¿Puede alguien realmente expandir lo que se supone que es el comportamiento de un WebView, con respecto al objetivo de un enlace? No está claro qué se supone que debe hacer con un target=_blank , pero no veo nada más que pueda hacer, excepto abrir una nueva ventana del navegador.

Tenga en cuenta que el problema parece ser solo con iOS porque con Android (con el complemento Crosswalk) usando target=_blank parece que siempre funciona bien y se abre en una nueva ventana del navegador nativo.


Entonces estoy respondiendo mi propia pregunta con lo que he descubierto. Tenga en cuenta que solo estoy tratando con iOS y Android (con el complemento Crosswalk) en Cordova 5.1.1 , y es posible que no se aplique a otras plataformas / versiones.

Se requiere InAppBrowser

Incluso si no necesita un navegador integrado, se requiere el complemento InAppBrowser. Esto hace que _system disponible el destino _system que activa el código de complemento nativo para abrir el sistema / navegador externo.

Por lo tanto, parece que el complemento es de alguna manera un complemento "2 en 1": permite usar un navegador incrustado + permite forzar de forma segura el navegador del sistema externo para que se abra.

No está claro cuál debería ser el comportamiento predeterminado de WebView en relación con los enlaces _blank (ni si está estandarizado de alguna manera para WebViews), pero no he encontrado ninguna manera de abrir el navegador externo en iOS sin este complemento o código nativo.

Abrir _self en WebView y _blank en el navegador nativo

Si, como yo, no le importa el navegador incrustado, pero solo desea abrir todos los objetivos _blank al navegador externo nativo en una aplicación existente, sin demasiados problemas (especialmente si la aplicación también es un sitio web móvil ...), puede ejecutar el siguiente código al comienzo de su aplicación:

function openAllLinksWithBlankTargetInSystemBrowser() { if ( typeof cordova === "undefined" || !cordova.InAppBrowser ) { throw new Error("You are trying to run this code for a non-cordova project, " + "or did not install the cordova InAppBrowser plugin"); } // Currently (for retrocompatibility reasons) the plugin automagically wrap window.open // We don''t want the plugin to always be run: we want to call it explicitly when needed // See https://issues.apache.org/jira/browse/CB-9573 delete window.open; // scary, but it just sets back to the default window.open behavior var windowOpen = window.open; // Yes it is not deleted ! // Note it does not take a target! var systemOpen = function(url, options) { // Do not use window.open becaus the InAppBrowser open will not proxy window.open // in the future versions of the plugin (see doc) so it is safer to call InAppBrowser.open directly cordova.InAppBrowser.open(url,"_system",options); }; // Handle direct calls like window.open("url","_blank") window.open = function(url,target,options) { if ( target == "_blank" ) systemOpen(url,options); else windowOpen(url,target,options); }; // Handle html links like <a href="url" target="_blank"> // See https://issues.apache.org/jira/browse/CB-6747 $(document).on(''click'', ''a[target=_blank]'', function(event) { event.preventDefault(); systemOpen($(this).attr(''href'')); }); }