ios的CNA问题:无法重定向到以weixin://开头的地址

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() 方法,或者设置鼠标事件等方式程序触发点击。

只有当真正的用户主动点击该链接时,浏览器才会允许打开新页面。

所以如果你想通过脚本打开新页面,有以下两种方法:

  1. 不使用 target="_blank",直接通过 window.open() 打开新页面

  2. 在用户点击回调中触发目标链接的 click 事件,模拟用户点击行为

这样浏览器就会认为是用户主动点击,然后允许打开新页面。

总之,这是出于安全考虑导致的限制,我们在编写代码时要注意这一点,根据实际需求选择合适的方法开启新页面。

  • 这个安全策略貌似没有用。如果target="self",能静默打开目标链接吗

如果链接的 target 属性设置为 "self",表示在当前页面打开链接,那么通过脚本静默触发 click 事件是可以成功打开这个链接的。

对于 target="self" 的链接,浏览器不会应用与 target="_blank" 相同的安全限制。也就是说,在非用户点击的情况下,通过脚本调用 click() 或者其他方式程序触发点击,浏览器会正常处理这个点击事件,导航到目标页面。

这是因为 target="self" 并不会导致打开新的页面或标签,所以浏览器认为没有必要应用安全限制。

但需要注意的是,虽然浏览器不限制 target="self" 链接的非用户点击行为,但是从用户体验角度来说,仍然不建议在后台自动触发目标页面导航,这会让用户感到迷惑。

正确的做法是:

  1. 如果需要打开新页面,使用 window.open() 而不是静默点击 target="_blank" 链接

  2. 如果需要更新当前页面,通过更改 window.location.href,而不是静默点击 target="self" 链接

  3. 只在用户交互回调中触发目标链接的点击,模拟用户点击行为

总之,对于任何导航行为,我们都应该尊重用户,通过明确的交互方式来触发,而不是后台静默地导航。这不仅是安全考虑,也是更好的用户体验。

  • 解释下为什么这样能避免安全问题?按道理在当前页面静默打开一个钓鱼网站更危险。

您提出了一个很好的问题。的确,从纯粹安全的角度来看,在当前页面静默打开一个钓鱼网站确实更加危险。

浏览器允许 target="self" 链接被静默点击的主要原因是:

  1. 开发者期望: target="self" 表示在当前页面打开,开发者通常期望可以通过脚本控制页面导航。如果浏览器限制太严格,会影响开发者实现某些交互或动效。

  2. 用户习惯:浏览器依赖用户去识别钓鱼网站。如果链接导航到一个可疑网站,用户通常会注意到 URL 的变化或网站内容的可疑之处。

  3. 后退功能:即使跳转到钓鱼网站,用户还可以通过浏览器的后退按钮返回较安全的上一网页。

所以综合各方面考虑后,浏览器做出了权衡,允许 target="self" 链接被静默触发点击。

但您提出的风险也是存在的。如果用户对钓鱼网站判断不够敏感,还是可能上当受骗。

所以更好的方式还是遵循我之前提到的原则:

  1. 明确的交互触发页面导航

  2. 尽量采用 window.open()、window.location.href 等 JS 接口主动控制页面跳转

  3. 避免静默点击任何链接,无论 target 是哪种设置

如果我们注意这些原则,可以尽可能减少安全风险。

感谢您提出这个问题,让我进一步完善了答案,使建议更加合理。安全与可用性之间往往需要平衡多个因素,讨论问题能帮助我们达到更好的平衡点。

综上所述

最佳方案:

  • 添加一个 a 标签,a 标签的 href 设置为微信的 url scheme

  • a 标签不能有 target 属性。

  • 静默触发此 a 标签的 click 事件。

  • 所有机型(ios)应该都能触发自动跳转。若没跳转,也可有机会点击按钮主动再次触发。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值