Phonegap 2.9.0在默认浏览器中不打开外部链接

时间:2013-07-29 14:10:04

标签: cordova phonegap-plugins phonegap-build

我想要做的是超级简单,在设备浏览器上打开一个链接,但它显示出比我想象的更难。

我创建项目并添加ios和android平台:

$ phonegap create project_name
$ phonegap build ios
$ phonegap build android
我有;在config.xml内部(尝试不同的方式,没有工作)和“stay-in-webview”设置为false。

我在www / index.html文件中做的唯一更改是添加链接,页面包含所有默认脚本(phonegap.js,js / index.js和对app.initialize()的调用)。

我尝试了所有这些链接,都在webview中打开了:

<a href="#" onclick="window.open('http://www.google.com', '_blank', 'location=yes');">_blank</a>
<a href="#" onclick="window.open('http://www.google.com', '_system', 'location=yes');">_system</a>
<a href="#" onclick="window.open('http://www.google.com', '_system');">_system</a>
<a href="http://www.google.com" target="_blank">target _blank</a>
<a href="http://www.google.com">no target</a>

明确我在ios模拟器和android模拟器中完成的所有测试。

我搜索了很多,尝试了我发现的一切,但没有任何效果。谢谢你的帮助

7 个答案:

答案 0 :(得分:11)

要在设备的默认浏览器中打开Cordova / PhoneGap App中的链接,您必须确保使用window.open(<url>, '_system');来访问它。为了实际工作 - 可能有点反直觉 - 你需要启用'InAppBrowser'插件。

在Cordova版本2.9.0中,“InAppBrowser”插件是内置的,您只需要确保它在Cordova的config.xml中没有注释掉。从版本3.0.0开始,您必须通过从项目目录运行此命令来安装插件:

cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser.git

来自Cordova文档,了解'InAppBrowser'如何在其覆盖实现中使用window.open()的第二个参数target

目标:加载网址的目标,默认为_self的可选参数。 (字符串

  • _self:如果URL在白名单中,则在Cordova WebView中打开,否则在InAppBrowser中打开。
  • _blank:在InAppBrowser中打开。
  • _system:在系统的网络浏览器中打开。

为了区分问题并防止我忘记在默认浏览器中向我要打开的每个onclick添加<a/>属性,我喜欢通过JavaScript动态附加该行为。下面是一个使用jQuery的示例,其中在通过XHR重新加载所涉及的HTML之后,还将重新附加行为。它只会附加到外部链接,因此也会阻止将其附加到mailto:链接。

$('#idContentwrapper').on('click', '.colofon-text a', function(event) {
    var href = $(this).attr('href');
    if (typeof href !== 'undefined' &&
        href.substr(0, 7) === 'http://')
    {
        event.preventDefault();
        // Open in default browser App (on desktop: open in new window/tab)
        window.open(this.href, '_system', 'location=no');
    }
});

答案 1 :(得分:3)

我也遇到过这个问题。

似乎大多数回答与问题完全相反,人们通常会回答如何在inAppBrowser中打开,我不知道为什么。

就像你一样,我尝试了各种方法,但没有人工作。 最后,我必须转向本土方式。 幸运的是,本地方式只花了不到10分钟,比尝试人们的手机答案要短得多。

在Android中,

  1. 在onCreate方法中添加一行,将对象绑定到网页的窗口对象。
  2. 在绑定对象上添加一个方法,该方法接受一个url字符串并表现出开放的浏览器行为。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        super.appView.addJavascriptInterface(this, "nativeInterface");
    }
    
    public void openInDeviceBrowser(String url) {
        Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(i);
    }
    
  3. 在html中

    <a href="#" onclick="window.nativeInterface.openInDeviceBrowser('http://www.google.com/')">Google</a>
    

    对于iOS
      1.将委托添加到MainViewController.h(在我的项目中是这个名字)

    @interface MainViewController : CDVViewController<UIWebViewDelegate>  
    

    2。将MainViewController设置为webView的委托,在- (void)webViewDidFinishLoad:(UIWebView*)theWebView{

    中添加以下行
        theWebView.delegate = self;  
    

    3。实现“ - (BOOL)webView:shouldStartLoadWithRequest:navigationType:”method:

    - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
    if(navigationType==UIWebViewNavigationTypeLinkClicked)
    {
        NSURL* url = [request URL];
        if ([[url scheme] isEqualToString:@"http"]) {
            [[UIApplication sharedApplication] openURL:url];
            return NO;
        }
    }
    return YES;
    }
    

    最后,更改您的html调用,如下所示:

    <a href="http://www.google.com/" onclick="window.nativeInterface.openInDeviceBrowser('http://www.google.com/')" target="_blank">Google</a></li>
    

    就是这样。 它比我想象的更容易并为我工作。 而且我认为这可以防止将来再次发生手机短信改变。

    希望这对你也有用。

答案 2 :(得分:2)

我不确定这是否仍然相关,但是要给我的5c:我刚刚对我的 Cordova 3.3 (非PhoneGap Build)应用进行了一些重新配置,并遇到了同样的问题问题。 你并不真的需要这个插件 - 请确保链接:

<a href="#" onclick="window.open('http://www.google.com', '_system');">_system</a>

...正如您在项目/ xml / config.xml

中发布的那样重要
<access origin="http://127.0.0.1*"/>

我还禁用了应用内浏览器:

<!--
 <feature name="InAppBrowser">
  <param name="android-package" value="org.apache.cordova.InAppBrowser"/>
</feature>    
--> 

...现在再次正常工作;)

答案 3 :(得分:2)

让我们回答,但也许可以帮助别人。

navigator.app.loadUrl('https://google.com/', { openExternal:true });

Cordova 3.3.1

答案 4 :(得分:0)

我努力让PhoneGap的inappbrowser在Android上工作,但从来没有运气。话虽如此,我只是利用了Android的原生功能(系统浏览器和设备的后退按钮)。我在config.xml文件中注释掉了以下 <access origin="*" /> ,并添加了 rel =“external” 到链接: 这项工作被罚款,链接在设备的浏览器中打开,设备的后退按钮返回到用户所在应用程序中的相同位置。不管设备是否连接到网络,系统也处理这个问题。

我的iOS版应用程序可以正常使用inappbrowser。

答案 5 :(得分:0)

在iOS中(至少使用PhoneGap 2.9),这可以正常工作

<a href="http://www.google.com" onclick="window.open(this.href,'_system'); return false;">Open</a>

答案 6 :(得分:-2)

如果要连接到外部链接,请使用rel属性。像<a rel="external" href="">一样,一切都会正常工作。