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''));
});
}