iPhone connectWifi 的 success 回调触发错误
发布于 5 年前 作者 kangxia 4368 次浏览 来自 问答
  • 代码逻辑:
  1. 目的: 因为扫码连 Wifi (按照官方的步骤, startWIfi => connectWifi 且在 iOS 11+上测试; iOS 11-上的报错:"connectWifi:fail the api is only supported in iOS 11 or above; 直接被忽略)经测试发现错误率很高, 达到了 50%甚至 60%, 因此我打算在错误的回调中埋点进行错误上报, 逐个优化;

  2. 前提: 因为社区中有人反馈和实际验证后得知, iOS connectWifi API 走到 success 后, 此时可能并未连接上 Wifi, 因此此时进行下一步的操作不可靠, 因此 connectWIfi 的触发 succss 回调后, 我会用 setTimeout 延迟 100ms, 调用 getNetworkType API 进行网络状态检测, 当发现为不是 wifi 类型的时候, 上报埋点错误信息;

  3. 有人建议我监听 onWifiConnected 状态; iPhone 可行, 但是为非官方建议, 不可靠;

  4. 另外安卓机型在 wifi 连接成功后, 会多次触发 onWifiConnected 回调, 前几次回调 BSSID 和 SSID 会为空, 最终触发该回调才会有值, 奇葩;

  • 当前 Bug 的表现(可附上截图)
  1. onConnect success 回调的时候, 并未连接上 wifi, 100ms 后检测 wifi 类型,仍然是非 wifi 状态, 而且此现象在iPhone的各种机型上(从iPhone6~iPhone X Max)复现率高达 98%, 目前100个中只看到两个 iPhone 7 是正常的(即connectWifi 的 success 后 100ms 检测wifi 状态是 wifi;

  • 预期表现
  1. connectWifi 的 success 回调调用的时候, 即代表 wifi 连接成功;

  2. 请告知, 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) {}
3 回复

遇到同样的问题了,现在这个问题怎么处理的

请告知, 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.



回到顶部