Cordova,为什么需要InAppBrowser插件在系统浏览器中打开链接

Cordova,为什么需要InAppBrowser插件在系统浏览器中打开链接,cordova,phonegap-plugins,ionic,inappbrowser,Cordova,Phonegap Plugins,Ionic,Inappbrowser,我有一个Cordova应用程序,它是一个带有单个HTML文件的单页应用程序 所有链接都应在系统浏览器中打开。我不想在AppBrowser中使用“嵌入式”浏览器,但实际上是本机系统/外部浏览器 在任何地方,我们都可以找到使用InAppBrowser的代码示例,例如: window.open('http://apache.org', '_system'); 但为什么我们需要安装InAppBrowser,即使我们甚至不打算使用嵌入式浏览器 有人真的可以解释什么是网络视图的行为,关于链接的目标。现在还

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

所有链接都应在系统浏览器中打开。我不想在AppBrowser中使用“嵌入式”浏览器,但实际上是本机系统/外部浏览器

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

window.open('http://apache.org', '_system');
但为什么我们需要安装InAppBrowser,即使我们甚至不打算使用嵌入式浏览器

有人真的可以解释什么是网络视图的行为,关于链接的目标。现在还不清楚它应该如何处理
target=_blank
,但除了打开一个新的浏览器窗口,我看不到它还能做什么


请注意,问题似乎只出现在iOS上,因为Android(带有Crosswalk插件)使用
target=\u blank
似乎总是可以正常工作,并在新的本机浏览器窗口中打开。

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

需要应用浏览器 即使您不需要嵌入式浏览器,也需要InAppBrowser插件。这使得系统目标可用,触发本机插件代码以打开系统/外部浏览器

因此,该插件似乎是一个“二合一”插件:它允许使用嵌入式浏览器+它允许安全地强制外部系统浏览器打开

目前还不清楚默认的WebView行为相对于
\u blank
链接应该是什么(也不清楚是否以任何方式对WebView进行了标准化),但如果没有此插件或本机代码,我无法在iOS上打开外部浏览器

在WebView中打开
\u self
,在本机浏览器中打开
\u blank
如果像我一样,你不关心嵌入式浏览器,只想在现有应用程序中打开本地外部浏览器的所有
\u blank
目标,而不需要太多痛苦(特别是如果应用程序也是移动网站…),你可以在应用程序开始时运行以下代码:

函数openalllinkswithblanktargetsystembrowser(){
if(cordova的类型==“未定义”| |!cordova.InAppBrowser){
抛出新错误(“您试图为非cordova项目运行此代码,”+
“或未安装cordova InApp浏览器插件”);
}
//目前(出于可追溯性原因),插件自动包装window.open
//我们不希望插件总是运行:我们希望在需要时显式地调用它
//看https://issues.apache.org/jira/browse/CB-9573
delete window.open;//很可怕,但它只是设置回默认的window.open行为
var windowOpen=window.open;//是,未删除!
//注意,它不需要一个目标!
var systemOpen=函数(url、选项){
//不要使用window.open,因为InAppBrowser open不会代理window.open
//在插件的未来版本中(参见文档),因此直接调用InAppBrowser.open更安全
打开(url,“_系统”,选项);
};
//处理直接调用,如window.open(“url”,“_blank”)
window.open=函数(url、目标、选项){
如果(目标==“_blank”)系统打开(url,选项);
else windowOpen(url、目标、选项);
};
//处理html链接就像
//看https://issues.apache.org/jira/browse/CB-6747
$(文档)。在('click','a[target=_blank]'上,函数(事件){
event.preventDefault();
systemOpen($(this.attr('href'));
});
}

据我所知,您始终处于网络视图中。现在要查询主系统浏览器。现在,普通的目标空白可能并不总是有效,尤其是在cordova支持的所有平台上。为了克服这个问题,我们使用经过本机层的inappbrowser来调用浏览器。通过这种方式,我们可以保证在所有受支持的平台上都有一个有效的解决方案。@SaniYusuf但是为什么不创建一个插件,它不是“InAppBrowserPlugin”,并且在系统浏览器中打开所有带有_blank的链接?我觉得该插件试图解决两个不同的问题,其中一个没有在插件名称中明确说明(但不太确定,因为它没有真正解释)@jcesarmobile,我做到了,事实上,据我所知,它使所有Ajax请求在Android上都失败了。此外,此处未记录该选项:@jcesarmobile您还可以在源代码插件中看到,该选项仅对Android本机代码有效,根据config.xml中的警告日志:
发现,不推荐使用
允许访问。请改用。
抱歉,在评论之前没有尝试过,我现在已经尝试过了,你是对的。问题是,cordova是一个创建移动应用程序的框架,因此,所有资源都应该是本地的,外部链接没有任何实际意义(至少对我来说)。如果您需要它们,那么您就有了InApp浏览器插件,它允许您在InApp浏览器或系统浏览器上打开链接。确实有点奇怪,你必须安装一个“inAppBrowser”插件才能启动外部浏览器,但你可以创建自己的插件来启动浏览器而不使用inAppBrowser iOS webview上的默认行为是在同一个webview上打开链接,无论你在iOS8上使用的Cordova 5.3.3的目标是什么,window.open以目标“\u blank”在InApp浏览器中打开我的本地pdf,而不是在本机浏览器中打开。@RémyDAVID您是否正确执行了我的
openalllinkswithblanktargetsystembrowser
功能?因为它在iOS8Yep中对我们很好,但我的PDF是本地的(即file://... 抱歉,我是爱奥尼亚公司的新员工…把这个鳕鱼放在哪里