标题挺长,踩过坑的应该看的明白。不过限于目前所做产品流程的限制,我并没有解决掉这个问题,只是简单说一下相应的思路。
iOS 的系统浏览器是 Safari,用于 Portal 认证的则是 CNA(Captive Network Assistant),二者的区别在于前者可以打开 wachat: 这种私有协议头网址,后者无法打开并且限制很多,比如无法使用 alert()、无法正常使用 window.open()(只能做跳转)等等。
问题的症结在于在新版的 CNA 中是不认 wechat: 这样的私有协议头的,所以自然也就拉不起来微信。解决时需要引导用户点击 a 标签 <a target=”_system”></a> 触发 Safari,然后再在 Safari 拉起微信就行了。
我目前的 portal 触发逻辑是,客户端连到 wifi 上回触发 landing,首先返回码设定为 401 用于触发客户端的 portal 页面,同时判断客户端 UA,如果是部分安卓或 iOS 就渲染 landing 实体页(landing.ejs),页面的 title 和 body 均为“Success”以作为 iOS 欺骗(并且会加快从连接到弹出 portal 的响应时间);js 部分,ios 是直接打开认证 URL,针对部分安卓则是加了判断 document.visibilityState == ‘visible’ 时触发跳转的事件,用来解决不弹 portal 的问题。但由于点击按钮之后就直接进到 js 拉微信认证的流程了(少一步引导拉起微信),所以其实需要部分变更产品流程才行(这个版本暂时没戏)。
参考链接:
iOS: Open a Welcome Page in Safari, not CNA
微信连 WI-Fi 解决 ios 无法呼出微信