小程序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' }] }) }) 複製代碼這個接口也挺牛逼,ios特有的。經過設置wifiList,咱們在系統頁能夠直接看到已設置的wifi列表,點了就直接連上了。
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確認是否鏈接。