在iPhone上的全屏Web应用程序中启动移动版Safari

5

我用几种方式在谷歌上搜索了这个问题,但只能找到在使用PhoneGap或jQuery mobile的情况下的答案。然而,我既不使用PhoneGap也不使用jQuery mobile,只是使用普通的html和javascript。

我正在尝试使用window.open()从全屏web应用程序启动移动版Safari浏览器... 而不是内联锚点。无论我做什么,url都会在web应用程序中打开,而不是在Safari中打开。有人有什么建议吗?

谢谢。

6个回答

2

我花了一段时间才成功地拼凑出这个解决方案。在iOS独立的Web应用模式中,它使用jQuery创建一个链接元素,将其添加到页面主体,模拟单击操作,然后删除该链接。即使没有jQuery,也可以通过使用原生DOM方法来实现相同的功能,只是需要更多的代码。

if (window.navigator.standalone) {
  var $a = $('<a href="' + url + '" target="_blank"/>');
  $("body").append($a);

  var a = $a.get(0);

  var mouseEvent = a.ownerDocument.createEvent('MouseEvents');
  mouseEvent.initMouseEvent('click');
  a.dispatchEvent(mouseEvent);

  $a.remove();
}
else {
  window.open(url, '_blank');
}

1

从iOS 4.3开始,我所知道的唯一方法是将<div>转换为<a target="_blank">,并让默认浏览器来处理它。它会在外部Safari中打开新页面。


它对我不起作用...你能给我一个示例htmlString吗?我可以将其加载到我的Web视图中,当单击时它将打开Safari。 - user1010819
同时我正在模拟器上进行检查,希望这不会成为问题。 - user1010819

1
在PhoneGap中,默认情况下所有的URL都加载到WebView中。设置目标或使用JS不会将外部链接从WebView中分离出来。为了将外部URL加载到Safari中,而不是PhoneGap应用本身中,您需要修改应用程序委托处理URL的方式。
打开您的PhoneGap应用程序代码,并找到[projectname]AppDelegate.m...通常在[projectname]/Classes文件夹下。
按照您的喜好修改shouldStartLoadWithRequest。这里是一个示例实现,它将评估请求并处理HTTP或HTTPS方案以在Safari中加载(从http://solutions.michaelbrooks.ca/2011/02/15/open-external-links-in-safariapp/借鉴)。
- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL *url = [request URL];

    // Intercept the external http requests and forward to Safari.app
    // Otherwise forward to the PhoneGap WebView
    if ([[url scheme] isEqualToString:@"http"] || [[url scheme] isEqualToString:@"https"]) {
        [[UIApplication sharedApplication] openURL:url];
        return NO;
    }
    else {
        return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
    }
}

1
+1。完美地工作了。此外,对于那些在AppDelegate.m中寻找但没有成功的人,请注意,在较新版本的PhoneGap/Apache Cordova中(包括1.8.0),webView:shouldStartLoadWithRequest:navigationType:方法的生成覆盖已被注释并移动到MainViewController.m的底部。 - Daniel Trebbien

0
如果你无法创建一个标准的HTML链接,但是你必须通过编程方式(仅使用Javascript代码)打开Safari浏览器,以下是代码:
var a = document.createElement("a");
a.setAttribute('href', facebook);
a.setAttribute('target', '_blank');
a.click();

0

你不能使用一个普通的A HREF标签吗?这通常会在Web应用程序内部打开Safari。


如果您可以使用带有target="_blank"的<a>标签,那就没问题了。但是,如果您处于无法使用A标签的情况下,您将需要使用该解决方案。 - Marco Marsala
有许多情况下您不能使用<a>标签。例如: -通过编程方式打开链接 -HTML5移动应用程序(如Sencha Touch 2框架) - Marco Marsala

0

你尝试过使用window.openNative()吗?


当您尝试不同的URL方案选项时,会感到非常有趣。邮件链接可以启动邮件应用程序,地图链接可以启动地图应用程序等等。但是普通的http://www URL无法启动Safari浏览器。 - Vince

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接