IOS不支持 location.href 的方式跳转 url scheme
-
此问题一般出现在 wifi portal 认证。因为这是CNA (Captive Network Assistant)环境的限制。
-
此问题,仅限制 url scheme,跳转 http 链接无此限制。
解决思路:
-
方案一:先用 http 跳转到系统Safari 中,再跳转 url scheme。
-
网上说可以通过添加 target="_system"。https://www.v2ex.com/t/445255
-
由于使用自动 trigger click 事件,这个方案暂未调通。懒得再测了,因为有更好方案,cna中直接跳转scheme url。
-
此方案目前测试结果:可正常跳转http,但仍然在 CNA 中跳转。
-
猜测:若由用户手动触发的话,或许可能跳转到 Safari 中。
-
-
方案二:用其他的方式跳转,如 js 脚本触发 click 事件。
-
可以在 CNA 中完成跳转微信。
-
但碰到个限制:click 事件,不能静默触发。即做不到:加载网页后自动跳转微信。
-
问题:click不能静默触发
不添加target属性
-
即a 标签中不添加: target="_blank" 或者 target="_system"
-
则:没有同步异步的限制,可以在网页加载后,静默自动触发。
添加target属性
-
必须在用户的点击回调中,调用目标a标签的click。
-
且必须同步调用 click,不能插入任何异步操作。
claude 的解释
原因是浏览器出于安全考虑,对于 target="_blank" 的链接,如果不是在用户主动点击的情况下通过脚本触发点击,是不会真正打开新页面的。
这是浏览器的一个安全防范机制,用来防止恶意脚本在后台静默打开新页面,从而进行钓鱼或其他攻击。
具体来说,当 target="_blank" 的链接在非用户主动点击的情况下被触发时,浏览器会阻止该次点击,不会打开新页面。这包括通过脚本调用 click() 方法,或者设置鼠标事件等方式程序触发点击。
只有当真正的用户主动点击该链接时,浏览器才会允许打开新页面。
所以如果你想通过脚本打开新页面,有以下两种方法:
不使用 target="_blank",直接通过 window.open() 打开新页面
在用户点击回调中触发目标链接的 click 事件,模拟用户点击行为
这样浏览器就会认为是用户主动点击,然后允许打开新页面。
总之,这是出于安全考虑导致的限制,我们在编写代码时要注意这一点,根据实际需求选择合适的方法开启新页面。
-
这个安全策略貌似没有用。如果target="self",能静默打开目标链接吗
如果链接的 target 属性设置为 "self",表示在当前页面打开链接,那么通过脚本静默触发 click 事件是可以成功打开这个链接的。
对于 target="self" 的链接,浏览器不会应用与 target="_blank" 相同的安全限制。也就是说,在非用户点击的情况下,通过脚本调用 click() 或者其他方式程序触发点击,浏览器会正常处理这个点击事件,导航到目标页面。
这是因为 target="self" 并不会导致打开新的页面或标签,所以浏览器认为没有必要应用安全限制。
但需要注意的是,虽然浏览器不限制 target="self" 链接的非用户点击行为,但是从用户体验角度来说,仍然不建议在后台自动触发目标页面导航,这会让用户感到迷惑。
正确的做法是:
如果需要打开新页面,使用 window.open() 而不是静默点击 target="_blank" 链接
如果需要更新当前页面,通过更改 window.location.href,而不是静默点击 target="self" 链接
只在用户交互回调中触发目标链接的点击,模拟用户点击行为
总之,对于任何导航行为,我们都应该尊重用户,通过明确的交互方式来触发,而不是后台静默地导航。这不仅是安全考虑,也是更好的用户体验。
-
解释下为什么这样能避免安全问题?按道理在当前页面静默打开一个钓鱼网站更危险。
您提出了一个很好的问题。的确,从纯粹安全的角度来看,在当前页面静默打开一个钓鱼网站确实更加危险。
浏览器允许 target="self" 链接被静默点击的主要原因是:
开发者期望: target="self" 表示在当前页面打开,开发者通常期望可以通过脚本控制页面导航。如果浏览器限制太严格,会影响开发者实现某些交互或动效。
用户习惯:浏览器依赖用户去识别钓鱼网站。如果链接导航到一个可疑网站,用户通常会注意到 URL 的变化或网站内容的可疑之处。
后退功能:即使跳转到钓鱼网站,用户还可以通过浏览器的后退按钮返回较安全的上一网页。
所以综合各方面考虑后,浏览器做出了权衡,允许 target="self" 链接被静默触发点击。
但您提出的风险也是存在的。如果用户对钓鱼网站判断不够敏感,还是可能上当受骗。
所以更好的方式还是遵循我之前提到的原则:
明确的交互触发页面导航
尽量采用 window.open()、window.location.href 等 JS 接口主动控制页面跳转
避免静默点击任何链接,无论 target 是哪种设置
如果我们注意这些原则,可以尽可能减少安全风险。
感谢您提出这个问题,让我进一步完善了答案,使建议更加合理。安全与可用性之间往往需要平衡多个因素,讨论问题能帮助我们达到更好的平衡点。
综上所述
最佳方案:
-
添加一个 a 标签,a 标签的 href 设置为微信的 url scheme
-
a 标签不能有 target 属性。
-
静默触发此 a 标签的 click 事件。
-
所有机型(ios)应该都能触发自动跳转。若没跳转,也可有机会点击按钮主动再次触发。