在iOS12下,有很多终端在接入公共场所WiFi(open SSID,未采用psk等加密方式)会发现半天不弹出认证页面(iOS称为CaptiveNetwork,强制网络)。
岭博科技技术和产品部门做了针对性的分析。以下原文来自岭博科技:
需要澄清的是,APP的确有可能对苹果iOS的无线弹窗认证产生负面影响。对于需要认证的开放无线网络(技术术语Captive Network),苹果iOS在用户选择网络后,会启动一个Evaluating过程,这个过程会调用一些APP挂载的钩子函数,可以实现对无线网络增加标记或说明文字等。此钩子机制iOS称之为Hotspot Helper。比如微信,支付宝,都支持这个Helper机制。
显而易见,参与Hotspot Helper的APP必须要保证钩子函数返回实时可靠,否则就会影响用户体验。苹果在官方开发网站中 ,也给出了如下Guidelines(参考 https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/Hotspot_Network_Subsystem_Guide/Contents/ImportantGuidelines.html#//apple_ref/doc/uid/TP40016639-CH5-SW1):

简而言之,参与Hotspot Helper的APP要保证响应及时(Efficient & Responsive),并且要提供界面给用户手动禁用Helper机制。
至于这个Guideline是否遵守,完全取决APP开发方。值得注意的是,我司在评估过程中,发现常用的几个参与HotspotHelper的APP都没有按Guidelines要求提供配置界面以禁用Hotspot Helpe功能。
作为一个最终手段,苹果iOS对这个HotspotHelper过程设置了最大等待时间为45秒。但是这45秒的等待时长太影响用户体验了,比如我们的测试人员就抱怨经常等得屏幕都暗了,要手工点亮继续等满45秒。
我司测试人员测了多个样本,包括弹窗正常的,和弹窗慢的。目前可以定位到的一个导致响应Wi-Fi弹窗慢的APP,竟然不是手机管家类APP,而是国内某知名OTA APP,着实令人意外。以下给出我司所处理的一个慢速弹窗手机的日志分析:
15:12:57时,用户点击LinkBroad-1000,iOS进入到Evaluting阶段->
Mar 11 15:12:57 iPhoneconfigd(CaptiveNetworkSupport)[34] <Notice>: en0: SSID ‘LinkBroad-1000’not making interface primary (no cache entry)
Mar 11 15:12:57 iPhoneconfigd[34] <Notice>: configd[34] SetInterfaceRank(en0) = Never (3)
Mar 11 15:12:57 iPhone configd(CaptiveNetworkSupport)[34]<Notice>: CNPluginHandler en0: Evaluating
…
iOS在1秒内确定LinkBroad-1000是Captive Network,需要强制转向->
Mar 11 15:12:57 iPhoneconfigd(CaptiveNetworkSupport)[34] <Notice>: en0: Probing’LinkBroad-1000′
Mar 11 15:12:58 iPhoneconfigd(CaptiveNetworkSupport)[34] <Notice>: en0: Redirect detected on’LinkBroad-1000′
之后某著名旅游APP开始记录各种Error和Notice->
Mar 11 15:12:58 iPhoneCTRIP_WIRELESS(CoreTelephony)[17765] <Notice>: Delegate set to<private>, found 4 implemented methods
Mar 11 15:12:58 iPhoneCTRIP_WIRELESS(CoreTelephony)[17765] <Notice>: Sending selectors toserver: <private>
Mar 11 15:12:58 iPhoneCTRIP_WIRELESS(CoreTelephony)[17765] <Error>: Signal strength queryreturned error: Error Domain=NSPOSIXErrorDomain Code=13, descriptor: <private>
… …
每秒都有,大量日志,直到15:13:20 ->
Mar 11 15:13:20 iPhoneCTRIP_WIRELESS(CoreTelephony)[17765] <Notice>: Delegate set to<private>, found 4 implemented methods
Mar 11 15:13:20 iPhoneCTRIP_WIRELESS(CoreTelephony)[17765] <Notice>: Sending selectors toserver: <private>
Mar 11 15:13:20 iPhoneCTRIP_WIRELESS(CoreTelephony)[17765] <Error>: Signal strength queryreturned error: Error Domain=NSPOSIXErrorDomain Code=13, descriptor:<private>
Mar 11 15:13:20 iPhoneCTRIP_WIRELESS(CoreTelephony)[17765] <Error>: Signal strength queryreturned error: Error Domain=NSPOSIXErrorDomain Code=13, descriptor:<private>
继续再来一轮,从15:13:38到15:13:41->
Mar 11 15:13:38 iPhoneCTRIP_WIRELESS(CoreTelephony)[17765] <Notice>: Delegate set to<private>, found 4 implemented methods
… …
Mar 11 15:13:41 iPhoneCTRIP_WIRELESS(CoreTelephony)[17765] <Notice>: Sending selectors toserver: <private>
Mar 11 15:13:41 iPhoneCTRIP_WIRELESS(CoreTelephony)[17765] <Error>: Signal strength queryreturned error: Error Domain=NSPOSIXErrorDomain Code=13, descriptor:<private>
终于Evaluating结束(iOS规定的45秒),在15:13:42时,Portal弹出->
Mar 11 15:13:42 iPhoneconfigd(CaptiveNetworkSupport)[34] <Notice>: CNPluginHandler en0:Authenticating (__BUILTIN__)
Mar 11 15:13:42 iPhoneconfigd(CaptiveNetworkSupport)[34] <Notice>: en0: LinkBroad-1000 updated
Mar 11 15:13:42 iPhoneconfigd(CaptiveNetworkSupport)[34] <Notice>: CNPluginHandler en0:PresentingUI (__BUILTIN__)
Mar 11 15:13:42 iPhoneconfigd(CaptiveNetworkSupport)[34] <Notice>: en0: Launching Websheet onSSID LinkBroad-1000 with URL “http://www.apple.com/”
实测卸载此APP后Wi-Fi弹窗恢复为秒弹。由于Hotspot Helper本身的机制问题,除了这个APP,仍然可能有其它APP对Wi-Fi弹窗造成影响。