小程序wifi系列接口为系统原生能力。早在2015年,微信就推出了「微信连Wi-Fi」,微信连Wi-Fi是为商家的线下场所提供一套完整和便捷的微信连Wi-Fi的方案。如今已是一套完整的,便捷的解决方案。顾客经过扫码的方式链接wifi,同时微信还能够向用户下发消息。方案在官方文档已经阐述得很详细,本文就再也不赘述。本文重点在于讲解小程序中使用wifi能力遇到的问题和心得。html
【微信连wifi】传送门android
在小程序中,使用wifi模块都须要先调用wx.startWifi()
来初始化wifi模块。如下能力的使用均须要在wx.startWifi
的success
回调中使用。ios
wx.connectWifi({ SSID: 'mx 的iphone', // Wi-Fi 设备 SSID BSSID: '', // Wi-Fi 设备 BSSID password: 'xxxxxxxx', success(){}, fail(){}, complete(){} }) 复制代码
connectWifi
为咱们提供了直连wifi的能力, 仅 Android 与 iOS 11 以上版本支持,须要基础库1.6.0以上。这个通常是咱们使用wifi功能的核心API了。在ios中,会出现系统弹框,询问用户是否要链接wifi,只有用户点击肯定,connectWifi
才会继续进行,不然就走fail回调了。在安卓(以小米note3为例,Anroid9)中则会出现微信连一连
的toast。web
wx.getConnectedWifi({
success(WifiInfo){
// WifiInfo
}
})
复制代码
从社区中获取的信息得知:signalStrength
表示信号强度,iOS 是系统返回的,取值 0-1,安卓通过转换,取值 0-100。数值与信号强度为正比例关系。小程序
wx.getWifiList({
success(e) {
wx.onGetWifiList((res) {
// res.wifiList:wifiInfo[]
})
}
})
复制代码
获取周围的wifi列表,须要先使用getWifiList
后使用onGetWifiList
进行监听。在ios中,getWifiList会跳到ios系统界面,这是因为ios系统的限制, 目前是没法避免的(其实这么作也无可厚非,wifi信息原本就是敏感的,可是对用户体验有必定的影响)。在安卓中,getWifiList须要获取用户的位置信息,由于能够利用小程序嗅探周边Wi-Fi热点来推断用户所在的位置信息。为了确保用户的隐私不受侵犯,自微信android客户端 7.0.4 起,须要先获取用户地理位置(scope.userLocation)。详情请见wx.getWifiList接口需获取用户位置信息受权后使用安全
wx.onGetWifiList(function(res) { wx.setWifiList({ wifiList: [{ SSID: res.wifiList[0].SSID, BSSID: res.wifiList[0].BSSID, password: '123456' }] }) }) 复制代码
wx.stopWifi
关闭wifi模块wx.onWifiConnected(function callback)
监听链接上 Wi-Fi 的事件wx.offWifiConnected
取消监听链接上 Wi-Fi 的事件wx.offGetWifiList(function callback)
取消监听获取到 Wi-Fi 列表数据事件。链接指定 Wi-Fi 接口调用时序:bash
Android:startWifi —> connectWifi —> onWifiConnected
复制代码
连周边 Wi-Fi 接口调用时序:微信
Android:startWifi —> getWifiList —> onGetWifiList —> connectWifi —> onWifiConnected
复制代码
链接指定 Wi-Fi 接口调用时序:(与安卓一致)websocket
iOS(仅iOS 11及以上版本支持):startWifi —> connectWifi —> onWifiConnected
复制代码
连周边 Wi-Fi 接口调用时序:markdown
iOS(iOS 11.0及11.1版本因系统缘由暂不支持): startWifi —> getWifiList —> onGetWifiList —> setWifiList —> onWifiConnected 复制代码
笔者在项目中接触到了使用小程序提供的硬件(wifi)能力的场景。利用wifi与socket的能力,咱们能够为物联网设备链接wifi。流程以下:
wx.request/wx.connectSocket/wx.uploadFile/wx.downloadFile 的 url 参数容许为
{PORT}/${PATH} 的格式,当且仅当 IP 与手机 IP 处在同一网段且不与本机 IP 相同(通常来讲,就是同一局域网,如链接在同一个 wifi 下)时,请求/链接才会成功。 在这种状况下,不会进行安全域的校验,不要求必须使用 https/wss,也可使用 http/ws。
局域网通讯中,不会进行安全域校验,所以,无需在mp后台添加安全域域名。
借助小程序提供的硬件能力(wifi,蓝牙,NFC),小程序有了更加广阔的场景。好比【摩拜单车】小程序,有的车须要用户开一下蓝牙,小程序提供的操做原生系统的蓝牙功能便为咱们赋能。经过小程序,咱们也能够实现与物联网设备通讯,经过链接设备热点,利用http/wss/udp传输数据。固然,如今wifi能力仍是存在着问题,好比兼容问题,可能有部分安卓手机在链接时会莫名其妙的报错。此时须要对着官方提供的errcode查看具体的缘由。
connectWifi
从新链接,即便传错密码,仍是能连上。getWifiList
会跳到系统设置页,在connectWifi
会出现modal确认是否链接。