如何在iOS 7中从WebApp打开Safari

33
在之前的iOS版本中,<a>标签会打开Mobile Safari,而为了留在WebApp内部(用户在主屏幕上保存的HTML页面),您必须拦截这些标签。
从iOS 7开始,所有链接都将停留在WebApp内部。我无法弄清楚如何让它在我真正想要的情况下打开Safari。
我尝试使用window.opena target="_blank",但两者都不起作用。
这里是一个示例:https://s3.amazonaws.com/kaontest/testopen/index.html 如果在iOS 6中将其保存到主屏幕中,则链接会打开Safari。但在iOS 7中,不会。
请注意,这是每个人通常询问的相反问题(“如何不打开Safari”)。该行为似乎是新的默认设置,我无法弄清楚如何恢复旧的行为!

1
FYI:苹果开发者列表中的某个人说他认为这是一个错误。因此,也许我正在寻找一个巧妙的解决方法,直到苹果修复它? - Joshua Smith
确实是一个bug。尽管他们可能决定将其标记为“不修复”。你能跟着这个链接吗?移除那个“_blank”应该可以解决问题。 - Pedrom
2
我即将访问的页面是用户可能想要通过电子邮件、收藏夹或打印的内容,因此留在我的网络应用程序内部会有问题。他们确实需要浏览器的所有功能。 - Joshua Smith
1
我已确认在7.0.3中已修复此问题。 - Joshua Smith
11个回答

25

更新时间:2013年10月23日,已在iOS 7.0.3中修复此问题。要解决此问题,请在链接中添加target="xxx"属性。对mailto:及其相关内容同样有效。

iOS 7.0、7.0.1和7.0.2存在此bug,目前没有已知的解决方法。

这是iOS早期版本中链接可以正常在Safari中打开的一个退化。它似乎是围绕打开URL的一系列问题之一,在其中没有外部URL方案(例如,“mailto:”也无法使用)。

通常用于解决此类问题的方法不起作用(例如,使用一个表单并将其提交到一个"_new"目标)。

还有其他严重问题,例如警报和确认模态对话框根本不起作用。

向苹果提交这些问题可能会有所帮助,http://bugreport.apple.com


有没有一个我们可以观察进展的活跃错误报告? - scunliffe
@scunliffe 很不幸,Apple的错误报告并不是公开的。我已经提交了一些关于这个问题和其他问题的报告,并且如果有任何进展,我一定会报告,当然前提是遵守了苹果的保密协议(NDA)。 - thomasfuchs
1
我想补充一下,针对谷歌搜索的用户,通过Web应用程序安装企业应用程序的itms-services URL也出现了问题。 - xdumaine
只是想让任何关注此事的人知道,iOS 7.0.3似乎修复了这个问题。我一直保存独立的Web应用程序进行测试,今天发布的更新恢复了外部链接/应用程序的功能。 - JDubDev
1
我已确认这个问题在7.0.3中已经修复。 - Joshua Smith

7

在iOS 7.0.3上,带有目标为_blank的锚点标签可以使用,但使用window.open将无法正常工作,仍将在7.0.3中在Web视图中打开:

window.open('http://www.google.com/', '_blank');

1
这个对我在iOS 7.0.6上不起作用。只有这个答案对我有用。 - vanthome

6

在过去几个月的测试版中,这是一个已知问题。目前没有解决方法,从我所了解的情况来看,苹果公司甚至没有承认这是个漏洞,更没有给出修复的预计时间。已经提交了漏洞报告,但尚未更新/响应。

更多信息:http://www.mobilexweb.com/blog/safari-ios7-html5-problems-apis-review


1

目前我找到了两个解决方案,都明显地使用preventDefault在外部链接上。

如果你要链接到另一个网站或下载东西,我想唯一的选择是让用户讽刺性地警告他们按住链接以获取触摸提示。但是,在这种情况下,根据它是一个网站还是 PDF,指导他们复制链接或将其添加到阅读列表中。由于警告和确认模态框也已经损坏,您需要实现自己的模态通知。如果您已经有了,应该不会太麻烦。

更新[2013-10-25] 显然已在 iOS 7.0.3 中修复,链接可以在 Safari 中打开...

编辑[2013-10-05] 这里几乎是我用 jQuery UI 模态框的方法

// iOS 7 external link polyfill
$('a[rel=external], a[rel=blank], a[target=_blank], a[href$=".pdf"]').on('click', function(e) {

  if (navigator.standalone && /iP(hone|od|ad) OS 7/.test(navigator.userAgent)) {
    e.preventDefault(); e.stopPropagation();

    var href = $(this).attr('href');

    var $dialog = $('<div id="ios-copy"></div>')
      .html('<p>iOS 7 prevents us from opening external links in Safari, you can continue to the address and risk losing all navigation or you can copy the address to your clipboard by <strong>holding your finger on the link</strong> for a few seconds.</p><p><a style="background-color: rgba(0,0,0,.75); color: #fff; font-size: 1.25em; padding: 1em;" href="' + href + '">' + href + '</a></p>')
      .appendTo('body')
      .dialog({
        title: 'External link',
        modal: true,
        buttons: {
          Ok: function() {
            $( this ).dialog( "close" );
          }
        }
      });
  }
});

另一种解决方法是使用ajax或iframe加载外部内容,但除非您的应用程序具有良好的子浏览器或其他功能,否则它会显得不可靠。以下是类似这些解决方案的示例。
// iOS 7 external link polyfill
if (/iP(hone|od|ad) OS 7/.test(navigator.userAgent) && window.navigator.standalone) {
  $('a[rel=external], a[href$=".pdf"]').on('click', function(e) {
    e.preventDefault(); e.stopPropagation();

    var link = this;
    var href = $(link).attr('href');

    var frameContainer = $('<div></div>').css({
      position: 'absolute',
      left: 10,
      top: $(link).position().top,
      opacity: 0,
      overflow: 'scroll',
      '-webkit-overflow-scrolling': 'touch',
      height: 520,
      transition: 'opacity .25s',
      width: 300
    });

    var iosFrame = $('<iframe class="iosFrame" seamless="seamless" width="1024" height="5000"></iframe>')
      .attr('src', href)
      .css({
        height: 5000,
        'max-width': 1024,
        width: 1024,
        overflow: 'scroll !important',
        '-webkit-overflow-scrolling': 'touch !important'
      });

    var iosFrameClose = $('<a href="#"><i class="icon-cancel icon-remove icon-3x"></i></a>').css({
      position: 'absolute',
      left: -10,
      top: $(link).position().top - 20,
      'text-shadow': '1px 1px 1px #000',
      transition: 'opacity .25s',
      opacity: 0,
      '-webkit-transform': 'translate3d(0, 0, 0)',
      width: '3em',
      height: '3em'
    }).on('click', function(e) {
      e.preventDefault();
      setTimeout( function() {
        $(frameContainer).remove();
        $(iosFrameClose).remove();
      }, 250);
    });

    iosFrame.appendTo(frameContainer);
    frameContainer.appendTo('body');
    iosFrameClose.appendTo('body');

    iosFrame.contents().css({
      '-webkit-transform': 'translate3d(0, 0, 0)'
    });

    // Show this thing
    setTimeout( function() {
      $(frameContainer).css({ opacity: 1 });
      $(iosFrameClose).css({ opacity: 1 });
    }, 1);
  });
}

1

我可以确认第二个选项在iOS 7.0.6上有效。 - vanthome

1

iOS v7.0.3于10/22/13发布,修复了该问题。


1

更新 只想让任何关注此事的人知道,iOS 7.0.3似乎修复了这个问题。我一直保存着独立的Web应用程序进行测试,今天发布的更新恢复了外部链接/应用程序功能。因此,我已经更新了我的代码,让客户知道要更新他们的手机,而不是删除并重新保存Web应用程序。


我本来只想添加一条评论,但显然这太长了。
当苹果允许将无边框Web应用程序保存到设备的主屏幕时,他们为WebApp世界铺平了道路。这个“漏洞”感觉像是一个重大的倒退。在最终发布版本中留下这样一个漏洞似乎不太符合苹果的作风。至少不像那些锁屏绕过问题一样,一旦他们意识到这个问题,他们就不会公开表示他们正在修复它。虽然我不能帮助这种感觉是有意的,但似乎没有明显的原因。
对于遇到这个问题的开发人员,我唯一找到的解决方案是:
1)将meta标签apple-mobile-web-app-capable设置为“no”-这可以防止未来用户遇到该问题
2)更新我们Web应用程序中的代码以查找“独立运行”和iOS版本7+。当满足条件时,我提供了一个弹出窗口,说明了问题,并添加了一个链接到该页面,并要求用户原谅并请求他们复制链接并将其粘贴到Safari中。
我用边缘到边缘的标记包装了链接,并在上下两侧插入了换行符,以帮助使URL的复制和粘贴过程变得更加容易。

-1
window.open('http://www.google.com/', '_system');

这将在最新版本的iOS上打开原生Safari应用程序...

编程愉快!


5
在当前的iOS系统中,这种方法不可行。它会像“_blank”一样在本地打开链接。我没有找到任何关于“_system”目标的文档,除了在Cordova中,所以我猜这是他们添加的一个扩展。我们讨论的是“保存到主屏幕”的Web应用程序,而不是类似PhoneGap封装的应用程序。 - Joshua Smith

-1

编辑:抱歉,我误读了您原来的问题。这个解决方案是为了打开外部网站。基本的A href标签用于打开链接,在iOS7中停止工作。这是我唯一能让它打开外部链接的方法。


以下是我如何使其在iOS7中通过保存到桌面的Web应用程序中基本工作的方法。

function openpage()
{
window.open('http://www.yourlinkhere.com', '_blank');
}

...

<a ontouchstart="openpage();" onclick="openpage();">LINKED TEXT</a>

问题在于它似乎忽略了目标选项,直接在相同的全屏桌面 Web 应用程序中打开它,并且我看不到任何返回的方式。

3
这并没有解决我的问题,因为我的问题恰好就是您列出的“问题是…” - Joshua Smith

-1
看起来这很像一个故意的错误,限制了网络应用程序投放广告的能力。也许你可以尝试通过 iframe 在新页面中打开。

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