cordova,为什么会要求InAppBrowser插件打开系统浏览器中的链接

我有一个Cordova应用程序,它是一个带有单个HTML文件的单页应用程序。

所有的链接都应该在系统浏览器中打开。 我不想要一个“embedded”InAppBrowser,但真正的本地系统/外部浏览器。

我们可以在任何地方find使用InAppBrowser的代码示例,例如:

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

但为什么我们需要安装InAppBrowser,即使我们甚至不打算使用embedded式浏览器?

有人可以真正扩展什么应该是一个WebView的行为,关于链接的目标。 目前还不清楚它应该怎样处理target=_blank ,但除了打开一个新的浏览器窗口,我没有看到任何其他的东西。

请注意,问题似乎只在iOS上,因为使用target=_blank Android(使用Crosswalk插件)似乎总能正常工作,并在新的本机浏览器窗口中打开。

所以我用我发现的问题来回答我自己的问题。 注意我只处理Cordova 5.1.1上的iOS和Android (带有Crosswalk插件),它可能不适用于其他平台/版本。

InAppBrowser是必需的

即使您不需要embedded式浏览器,也需要InAppBrowser插件。 这使得_system目标可用,触发本地插件代码来打开系统/外部浏览器。

所以看起来这个插件是一个“二合一”插件:它允许使用embedded式浏览器+它允许安全地强制外部系统浏览器打开。

目前还不清楚默认的WebView行为应该与_blank链接有什么关系(如果WebViews是以任何方式进行标准化的话),但是我没有办法在没有这个插件或者本地代码的情况下在iOS上打开外部浏览器。

在WebView中打开_self ,在本机浏览器中打开_blank

如果像我一样,你不关心embedded式浏览器,只是想打开所有_blank目标到现有的应用程序本地外部浏览器,没有太多的痛苦(特别是如果该应用程序也是一个移动网站…)您可以在应用程序的开始处运行以下代码:

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