小程序wifi能力解讀與實踐

背景

小程序wifi系列接口爲系統原生能力。早在2015年,微信就推出了「微信連Wi-Fi」,微信連Wi-Fi是爲商家的線下場所提供一套完整和便捷的微信連Wi-Fi的方案。如今已是一套完整的,便捷的解決方案。顧客經過掃碼的方式鏈接wifi,同時微信還能夠向用戶下發消息。方案在官方文檔已經闡述得很詳細,本文就再也不贅述。本文重點在於講解小程序中使用wifi能力遇到的問題和心得。html

【微信連wifi】傳送門android

wifi能力解讀

wifi能力簡介

在小程序中,使用wifi模塊都須要先調用wx.startWifi()來初始化wifi模塊。如下能力的使用均須要在wx.startWifisuccess回調中使用。ios

鏈接wifi

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

獲取當前已經鏈接的wifi

wx.getConnectedWifi({
    success(WifiInfo){
        // WifiInfo
    }
})
複製代碼

從社區中獲取的信息得知:signalStrength表示信號強度,iOS 是系統返回的,取值 0-1,安卓通過轉換,取值 0-100。數值與信號強度爲正比例關係。小程序

獲取wifi列表

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接口需獲取用戶位置信息受權後使用安全

設置AP相關信息

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 列表數據事件。

安卓鏈接wifi

鏈接指定 Wi-Fi 接口調用時序:bash

Android:startWifi —> connectWifi —> onWifiConnected
複製代碼

連周邊 Wi-Fi 接口調用時序:微信

Android:startWifi —> getWifiList —> onGetWifiList —> connectWifi —> onWifiConnected
複製代碼

IOS鏈接wifi

鏈接指定 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 參數容許爲 {IP}:{PORT}/${PATH} 的格式,當且僅當 IP 與手機 IP 處在同一網段且不與本機 IP 相同(通常來講,就是同一局域網,如鏈接在同一個 wifi 下)時,請求/鏈接纔會成功。 在這種狀況下,不會進行安全域的校驗,不要求必須使用 https/wss,也可使用 http/ws。

局域網通訊中,不會進行安全域校驗,所以,無需在mp後臺添加安全域域名。

總結

藉助小程序提供的硬件能力(wifi,藍牙,NFC),小程序有了更加廣闊的場景。好比【摩拜單車】小程序,有的車須要用戶開一下藍牙,小程序提供的操做原生系統的藍牙功能便爲咱們賦能。經過小程序,咱們也能夠實現與物聯網設備通訊,經過鏈接設備熱點,利用http/wss/udp傳輸數據。固然,如今wifi能力仍是存在着問題,好比兼容問題,可能有部分安卓手機在鏈接時會莫名其妙的報錯。此時須要對着官方提供的errcode查看具體的緣由。

踩過的坑

  1. 安卓部分機型,已經鏈接wifi,使用connectWifi從新鏈接,即便傳錯密碼,仍是能連上。
    A:這個問題目前尚未解決的辦法。
  2. ios在getWifiList會跳到系統設置頁,在connectWifi會出現modal確認是否鏈接。
    A:沒法避免。ios系統的限制
  3. 調試wifi功能時,沒法在開發者工具中調試wifi能力。
    A: 目前開發者工具沒法進行模擬。而且真機調試時,鏈接設備熱點後會報錯。(畢竟真機調試時須要可以訪問網絡,通常設備熱點都不具有訪問網絡的能力)。目前能夠經過 預覽+ vconsole解決,仍是比較麻煩。
  4. 能夠主動斷開wifi嗎?
    A: 從文檔上看,沒有提供這個能力。可是能夠嘗試鏈接一個不存在的wifi。
  5. 來自文檔的注意事項:

Reference

相關文章
相關標籤/搜索