微信小程序 Wi-Fi 功能使用及遇到的問題

微信小程序提供了支持 Wi-Fi 功能的多個(gè) Api 接口窝稿。查看 Api 接口詳情楣富,請移步:微信小程序 Wi-Fi

最近在做物聯(lián)網(wǎng)項(xiàng)目,項(xiàng)目中需要使用 Wi-Fi 相關(guān)功能伴榔。由于項(xiàng)目接近尾聲纹蝴,所以總結(jié)一下微信小程序 Wi-Fi 的使用方法庄萎,以及遇到的一些問題耀怜。

使用方法

一扮超、 若已知要連接 Wi-Fi 的賬號密碼距淫,需要兩步

初始化 Wi-Fi -> 連接 Wi-Fi
wx.startWifi() -> wx.connectWifi()

二呜袁、 若要獲取 Wi-Fi 列表略步,Android 與 iOS 有所不同
  • iOS 需要四步
    初始化 Wi-Fi -> 請求獲取 Wi-Fi 列表 -> 監(jiān)聽獲取到 Wi-Fi 列表數(shù)據(jù)事件 -> 連接 Wi-Fi
    wx.startWifi() -> wx.getWifiList() -> wx.onGetWifiList() -> wx.connectWifi()

  • Android 需要五步
    初始化 Wi-Fi -> 授權(quán)用戶地理位置 -> 請求獲取 Wi-Fi 列表 -> 監(jiān)聽獲取到 Wi-Fi 列表數(shù)據(jù)事件 -> 連接 Wi-Fi
    wx.startWifi() -> scope.userLocation -> wx.getWifiList() -> wx.onGetWifiList() -> wx.connectWifi()

三捂蕴、實(shí)現(xiàn)代碼
const app = getApp();
var platform;
var wifiList = [];
var callBackFunc;

// 僅 Android 6 與 iOS 11 以上版本支持
function checkPlatform() {
  return new Promise((resolve, reject) => {
    // 檢測手機(jī)型號
    wx.getSystemInfo({
      success: function(res) {
        var system = '';
        if (res.platform == 'android') system = parseInt(res.system.substr(8));
        if (res.platform == 'ios') system = parseInt(res.system.substr(4));
        if (res.platform == 'android' && system < 6) {
          reject();
        }
        if (res.platform == 'ios' && system < 11) {
          reject();
        }

        platform = res.platform
        resolve(res.platform);
      },
      fail: function(res) {
        wx.showToast({
          title: '請求失敗',
          icon: "none",
          duration: 3000
        })
      }
    })
  })
}

// 1. 可直接使用該方法去連接 Wi-Fi
function startConnectWifi(account, password) {
  return new Promise((resolve, reject) => {
    wx.startWifi({
      success(res) {
        connectWifi(account, password).then(() => {
          resolve()
        }).catch((res) => {
          reject(res)
        })
      },
      fail(res) {
        wx.showToast({
          title: '初始化WiFi失敗',
          icon: "none",
          duration: 3000
        })
        reject()
      }
    })
  })
}

// 2. 可直接使用該方法去搜索 Wi-Fi
function startSearchWifi(func) {
  callBackFunc = func
  startWifi()
}

// 初始化 WiFi 模塊
function startWifi() {
  wx.startWifi({
    success(res) {
      getWifiListFunc();
    },
    fail(res) {
      wx.showToast({
        title: '初始化WiFi失敗',
        icon: "none",
        duration: 3000
      })
    }
  })
}

// 請求獲取 WiFi 列表
function getWifiListFunc() {
  if (platform == 'ios') {
    getWifiList();
  } else {
    wx.getSetting({
      success(res) {
        //地理位置
        if (!res.authSetting['scope.userLocation']) {
          wx.authorize({
            scope: 'scope.userLocation',
            success(res) {
              getWifiList();
            },
            fail(res) {
              wx.showModal({
                title: '提示',
                content: '定位失敗形葬,您未開啟定位權(quán)限唇辨,點(diǎn)擊開啟定位權(quán)限',
                success: function(res) {
                  if (res.confirm) {
                    wx.openSetting({
                      success: function(res) {
                        if (res.authSetting['scope.userLocation']) {
                          getWifiList();
                        } else {
                          wx.showToast({
                            title: '用戶未開啟地理位置權(quán)限',
                            icon: "none",
                            duration: 3000
                          })
                        }
                      }
                    })
                  }
                }
              })
            }
          })
        } else {
          getWifiList();
        }
      }
    })
  }
}

function getWifiList() {
  wx.getWifiList({
    success: function(res) {
      // 監(jiān)聽獲取到 WiFi 列表數(shù)據(jù)事件
      wx.onGetWifiList(function(res) {
        wifiList = []
        let tmpList = []
        if (res && res.wifiList) {
          res.wifiList.map(item => {
            if (tmpList.indexOf(item.SSID) == -1) {
              tmpList.push(item.SSID)
              wifiList.push(item)
            }
          })
          callBackFunc(wifiList)
        }
      })
    },
    fail: function(res) {
      wx.showToast({
        title: '獲取 Wi-Fi 列表數(shù)據(jù)失敗',
        icon: "none",
        duration: 3000
      })
    }
  })
}

// 連接 WiFi免都。若已知 WiFi 信息锉罐,可以直接利用該接口連接。僅 Android 與 iOS 11 以上版本支持
function connectWifi(account, password) {
  return new Promise((resolve, reject) => {
    let wifiCount = 0
    let wifiTimer = setInterval(() => {
      wifiCount++
      if (wifiCount >= 30) {
        clearInterval(wifiTimer)
        reject()
      }
    }, 1000)

    // 獲取當(dāng)前網(wǎng)絡(luò)的名稱
    getConnectedWifi().then((res) => {
      if (res.SSID == account) {
        clearInterval(wifiTimer)
        resolve()
      } else {
        // 值得注意的是:ios 無論連網(wǎng)成功還是失敗绕娘,都會走 success 方法脓规,所以 ios 需要特別判斷一下
        wx.connectWifi({
          SSID: account,
          password: password,
          success(res) {
            // ios 判斷當(dāng)前手機(jī)已連網(wǎng)賬號與要連網(wǎng)的賬號是否一致,來確定是否連網(wǎng)成功
            if (platform == 'ios') {
              // 6.監(jiān)聽連接上 WiFi 的事件
              wx.onWifiConnected(function(res) {
                clearInterval(wifiTimer)
                if (res.wifi.SSID == account) {
                  resolve()
                } else {
                  reject()
                }
              })

              // wx.getConnectedWifi({
              //   success: res => {
              //     clearInterval(wifiTimer)
              //     if (res.wifi.SSID == account) {
              //       console.log('ios getConnectedWifi成功..........', account)
              //       resolve()
              //     } else {
              //       console.log('ios getConnectedWifi失敗..........', account)
              //       reject()
              //     }
              //   },
              //   fail: res => {
              //     clearInterval(wifiTimer)
              //     reject(res)
              //   }
              // })

            } else {
              clearInterval(wifiTimer)
              resolve()
            }
          },
          fail(res) {
            clearInterval(wifiTimer)
            reject(res)
          }
        })
      }
    }).catch((res) => {
      clearInterval(wifiTimer)
      reject(res)
    })
  })
}

// 獲取當(dāng)前網(wǎng)絡(luò)的名稱
function getConnectedWifi() {
  return new Promise((resolve, reject) => {
    wx.getConnectedWifi({
      success: res => {
        resolve(res.wifi)
      },
      fail: res => {
        reject(res)
      }
    })
  })
}

export default {
  checkPlatform: checkPlatform, // 檢測平臺是否支持
  startConnectWifi: startConnectWifi, // 開始連接已知網(wǎng)絡(luò)
  startSearchWifi: startSearchWifi, // 開始搜索周邊網(wǎng)絡(luò)
  connectWifi: connectWifi, // 連接網(wǎng)絡(luò)
  getConnectedWifi: getConnectedWifi // 獲取當(dāng)前網(wǎng)絡(luò)的名稱
}

遇到的問題

  • wx.connectWifi() 方法
    iOS 無論連網(wǎng)成功還是失敗险领,都會走 success 方法侨舆,所以 iOS 需要加一層判斷。目前是使用了 wx.onWifiConnected() 方法判斷绢陌,這個(gè)方法有個(gè)問題挨下,只有成功的時(shí)候才會走回調(diào),失敗的時(shí)候沒有回調(diào)脐湾。本來是想用 wx.getConnectedWifi() 方法判斷的臭笆,但是用這個(gè)方法也有問題,就是手機(jī)網(wǎng)絡(luò)在切換的時(shí)候秤掌,會有短時(shí)間的無網(wǎng)絡(luò)狀態(tài)愁铺,而這個(gè)時(shí)候如果調(diào)用這個(gè)方法,會彈出無法連接網(wǎng)絡(luò)的彈框闻鉴。

  • 小程序連網(wǎng) Api 沒有對部分安卓手機(jī)做好兼容
    測試的時(shí)候發(fā)現(xiàn)茵乱,部分華為 mate30 和 小米5X 在調(diào)用 wx.connectWifi() 方法的時(shí)候,會報(bào)連接超時(shí)的錯(cuò)誤孟岛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓶竭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子渠羞,更是在濱河造成了極大的恐慌斤贰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件次询,死亡現(xiàn)場離奇詭異腋舌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)渗蟹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門块饺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雌芽,你說我怎么就攤上這事授艰。” “怎么了世落?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵淮腾,是天一觀的道長。 經(jīng)常有香客問我屉佳,道長谷朝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任武花,我火速辦了婚禮圆凰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘体箕。我一直安慰自己专钉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布累铅。 她就那樣靜靜地躺著跃须,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娃兽。 梳的紋絲不亂的頭發(fā)上菇民,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音投储,去河邊找鬼第练。 笑死,一個(gè)胖子當(dāng)著我的面吹牛轻要,可吹牛的內(nèi)容都是我干的复旬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼冲泥,長吁一口氣:“原來是場噩夢啊……” “哼驹碍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凡恍,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤志秃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嚼酝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浮还,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年闽巩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钧舌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片担汤。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖洼冻,靈堂內(nèi)的尸體忽然破棺而出崭歧,到底是詐尸還是另有隱情,我是刑警寧澤撞牢,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布率碾,位于F島的核電站,受9級特大地震影響屋彪,放射性物質(zhì)發(fā)生泄漏所宰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一畜挥、第九天 我趴在偏房一處隱蔽的房頂上張望仔粥。 院中可真熱鬧,春花似錦砰嘁、人聲如沸件炉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斟冕。三九已至,卻和暖如春缅阳,著一層夾襖步出監(jiān)牢的瞬間磕蛇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工十办, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秀撇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓向族,卻偏偏與公主長得像呵燕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子件相,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345