- 代码逻辑:
目的: 因为扫码连 Wifi (按照官方的步骤, startWIfi => connectWifi 且在 iOS 11+上测试; iOS 11-上的报错:"connectWifi:fail the api is only supported in iOS 11 or above; 直接被忽略)经测试发现错误率很高, 达到了 50%甚至 60%, 因此我打算在错误的回调中埋点进行错误上报, 逐个优化;
前提: 因为社区中有人反馈和实际验证后得知, iOS connectWifi API 走到 success 后, 此时可能并未连接上 Wifi, 因此此时进行下一步的操作不可靠, 因此 connectWIfi 的触发 succss 回调后, 我会用 setTimeout 延迟 100ms, 调用 getNetworkType API 进行网络状态检测, 当发现为不是 wifi 类型的时候, 上报埋点错误信息;
有人建议我监听 onWifiConnected 状态; iPhone 可行, 但是为非官方建议, 不可靠;
另外安卓机型在 wifi 连接成功后, 会多次触发 onWifiConnected 回调, 前几次回调 BSSID 和 SSID 会为空, 最终触发该回调才会有值, 奇葩;
- 当前 Bug 的表现(可附上截图)
onConnect success 回调的时候, 并未连接上 wifi, 100ms 后检测 wifi 类型,仍然是非 wifi 状态, 而且此现象在iPhone的各种机型上(从iPhone6~iPhone X Max)复现率高达 98%, 目前100个中只看到两个 iPhone 7 是正常的(即connectWifi 的 success 后 100ms 检测wifi 状态是 wifi;
- 预期表现
connectWifi 的 success 回调调用的时候, 即代表 wifi 连接成功;
请告知, connectWifi success 回调触发的时候, 多久才能真正连上wifi(不要欺骗开发者)
- 复现路径
暂无
- 提供一个最简复现 Demo
wx.startWifi({ success() { console.log( '初始化wifi成功' ); wx.connectWifi({ BSSID: '随便' , SSID: wifiName, password: wifiPwd, success(res) { console.log( '连接wifi可能成功' , res); setTimeout(() => { wx.getNetworkType({ success(res) { console.log( '网络状态:' , res); if (res.networkType !== 'wifi' ) { if (hasTryConnect) { // 微信返回连接成功, 但是检测 wifi 状态后发现未成功则上报错误 } } else { } } }); }, 100); }, fail(err) { } }); }, fail(res) {} |
请告知, connectWifi success 回调触发的时候, 多久才能真正连上wifi(不要欺骗开发者)
===============================
iOS上,connectWifi 是调用系统发起连接 WiFi 请求行为,返回的是发起这个行为的结果。连接上 WiFi 的耗时,取决于你的手机与你的路由器之间连接的速度,不同设备是不一样的。
之前我一般建议开发者,调用 connectWifi 后,监听 onWiFiConnected 事件看是否能成功,并加一个超时的 timeout 来判定连接失败事件。
如果是以 (不要欺骗开发者) 的角度来讲,我也不理解我们有什么理由要欺骗开发者,小程序硬件相关接口都是尽可能系统 api 的调用与返回结果的,尽可能不因为小程序中间层的封装问题导致硬件开发者的开发不便。
另附 iOS 系统对于 connectWifi 有可能返回的错误情况,有兴趣可以看看。
* @const NEHotspotConfigurationErrorInvalid The Wi-Fi configuration is invalid
* @const NEHotspotConfigurationErrorInvalidSSID The given SSID string is invalid.
* @const NEHotspotConfigurationErrorInvalidWPAPassphrase The given WPA/WPA2 Personal passphrase is invalid.
* @const NEHotspotConfigurationErrorInvalidWEPPassphrase The given WEP passphrase is invalid.
* @const NEHotspotConfigurationErrorInvalidEAPSettings Invalid EAP Settings.
* @const NEHotspotConfigurationErrorInvalidHS20Settings Invalid Hotspot 2.0 Settings.
* @const NEHotspotConfigurationErrorInvalidHS20DomainName The given Hotspot 2.0 domain name is invalid.
* @const NEHotspotConfigurationErrorUserDenied Failed to get the user’s approval to add a new configuration.
* @const NEHotspotConfigurationErrorInternal An internal error was encountered.
* @const NEHotspotConfigurationErrorPending Previous request by the calling application is pending.
* @const NEHotspotConfigurationErrorSystemConfiguration The calling application cannot modify the System(MDM/Carrier) configuration.
* @const NEHotspotConfigurationErrorUnknown An unknown configuration error occurred.
* @const NEHotspotConfigurationErrorJoinOnceNotSupported JoinOnce option is not support for EAP configuration.
* @const NEHotspotConfigurationErrorAlreadyAssociated Wi-Fi is already associated.
* @const NEHotspotConfigurationErrorApplicationIsNotInForeground The application is not in the foreground.