如何从iOS 7中的WebApp打开Safari

在以前的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”)的反对问题。 这种行为似乎是新的默认,我不知道如何得到旧的行为!

具有目标_blank的定位标记可以在iOS 7.0.3中使用,但是使用window.open将不起作用,并将在7.0.3的webview中保持打开状态:

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

更新10/23/13:已在iOS 7.0.3中修复。 添加一个目标=“xxx”属性到你的链接来做到这一点。 也适用于mailto:和朋友。

这是iOS 7.0,7.0.1和7.0.2中的一个错误,并且没有已知的方法来执行此操作。

这是iOS早期版本的回归,在Safari中打开的链接工作得很好。 它似乎是围绕打开URL的一组问题的一部分,没有外部URLscheme的工作(例如“mailto:”也不起作用)。

通常的解决这个问题的怀疑是不幸的(例如使用一个表单并提交一个“_new”的目标)。

还有其他严重的问题,如警报和确认模式对话框根本不工作。

可能有助于将这些错误提交给Apple, http://bugreport.apple.com

这是过去几个月beta的一个已知问题。 没有解决办法,从我可以告诉苹果已经沉默的任何ETA修复,甚至认识到这是一个错误。 错误报告已经提交,但没有更新/回复。

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

更新只是想让任何人知道,iOS 7.0.3似乎解决了这个问题。 我已经保存独立的webappstesting和今天发布的更新恢复外部链接/应用程序的function。 所以我更新了我的代码,让客户知道更新手机,而不是删除并重新保存networking应用程序。


我只是想添加评论,但显然这太长了。

当苹果允许将无应用程序的webapps保存到设备的主屏幕时,苹果公司为WebApp世界设定了舞台。 这个“bug”感觉是向后退了一大步。 在最终的发行版中留下这样的缺陷并不是一个很好的方法。 至less没有一个人一旦意识到这一点,就不会公开说明他们正在为解决问题而努力,就像他们在锁屏旁边做的那样。 虽然似乎没有明确的理由,但我无法帮助,这是有意识的。

对于处理这个问题的开发者,我能find的唯一解决scheme是

1)将元标记apple-mobile-web-app-capable设置为“否” – 这将防止未来的用户处理该问题

第二)更新我们的webapp中的代码,以寻找“独立”和iOS版本7+。 当条件满足时,我提供了一个popup窗口,说明了这个问题,并添加了一个链接到该页面,并要求用户的原谅,并要求他们复制链接并粘贴在Safari浏览器。

我用上面和下面的换行符在边缘到边缘的标签中包装链接,以帮助使url的复制和粘贴过程更容易一些。

修正了这个问题,iOS7.7发布了10/22/13。

我发现两个解决scheme暂时解决这个问题,这两个显然在外部链接上使用preventDefault

如果您链接到另一个网站或要下载的东西,我唯一的select是讽刺地提醒用户在链接上握住他们的手指以获得触摸标注提示。 然后再根据是网站还是PDF,指示他们复制链接,或者在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); }); } 
 window.open('http://www.google.com/'); // stays in web app view <a href='http://www.google.com/' target='_blank'>Click Here</a> // opens in safari 

如果你想打开Safari,但是使用这样的锚点标记是不可能的, 这个问题的JavaScript解决scheme也将在Safari中打开 。

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

这将打开本地的Safari应用程序,即使在最新版本的iOS …

快乐的编码!

它看起来像一个故意的错误,以限制networking应用程序提供广告的能力。 也许你可以尝试在iframe中打开新页面。

编辑:对不起,我误解你原来的问题。 这个解决scheme是打开一个外部网站。 基本的一个href标签用于打开链接,并停止在iOS7中工作。 这是我能够打开外部链接的唯一方法。


以下是我如何通过在iOS7中保存到桌面的webapp进行sorting。

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

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

但问题是,它似乎忽略了目标选项,它将在同一个全屏桌面Web应用程序中打开它,没有办法导航回来,我可以看到。