微信小程序wx.opensetting廢棄之后的二次授權(quán)

最近要寫(xiě)小程序,發(fā)現(xiàn)很多api廢棄不能使用的情況。如現(xiàn)在模擬一個(gè)需求,獲取地理位置授權(quán),用戶(hù)首次進(jìn)入獲取其地理位置信息要先經(jīng)過(guò)授權(quán),如果用戶(hù)同意那么將成功獲取到其地理位置,然后頁(yè)面顯示一個(gè)‘獲取位置信息’按鈕,點(diǎn)擊后跳到地圖并標(biāo)識(shí)其當(dāng)前所在位置,如果開(kāi)始授權(quán)時(shí)用戶(hù)拒絕了,那么頁(yè)面會(huì)顯示一個(gè)‘授權(quán)并獲取位置信息’按鈕,用戶(hù)點(diǎn)擊后會(huì)跳到授權(quán)設(shè)置頁(yè)面,需要用戶(hù)手動(dòng)設(shè)置,設(shè)置后根據(jù)設(shè)置結(jié)果,如果設(shè)置了同意那么返回后顯示地圖上的其所在位置,如果沒(méi)有設(shè)置同意返回后還是顯示‘授權(quán)并獲取位置信息’按鈕。



注意這里有個(gè)問(wèn)題要注意,用戶(hù)第一次拒絕授權(quán)彈框后短期內(nèi)微信會(huì)認(rèn)為用戶(hù)拒絕該授權(quán)意愿并且不會(huì)再次吊起授權(quán)彈框,目前發(fā)現(xiàn)能夠吊起授權(quán)彈框的有wx.getLocation、 wx.authorize但是用戶(hù)拒絕后短期內(nèi)調(diào)用這些api也不會(huì)出現(xiàn)授權(quán)彈框了,這里我們需要讓用戶(hù)二次授權(quán),而二次授權(quán)就需要用戶(hù)主動(dòng)設(shè)置勾選(上圖)‘使用我的地理位置’,這是這個(gè)問(wèn)題的解決思路。那么看一下應(yīng)該怎么寫(xiě),調(diào)用這個(gè)“二次授權(quán)”設(shè)置頁(yè)之前使用的api是wx.opensetting,即打開(kāi)設(shè)置,這里引用別人的一段代碼:

//index.js
//獲取應(yīng)用實(shí)例
Page({
  data: { location: {} },
  onLoad: function () {
    var that = this
    wx.getLocation({//彈出授權(quán)用戶(hù)確認(rèn)后獲取其地理位置
      type: 'wgs84',
      success: function (res) {
        that.setData({
          location: {
            longitude: res.longitude,
            latitude: res.latitude
          }
        })
      }
    })
    //判斷是否獲得了用戶(hù)地理位置授權(quán)
    wx.getSetting({
      success: (res) => {
        if (!res.authSetting['scope.userLocation'])
          that.openConfirm()
      }
    })
  },

  openConfirm: function () {
    wx.showModal({
      content: '檢測(cè)到您沒(méi)打開(kāi)美團(tuán)外賣(mài)的定位權(quán)限,是否去設(shè)置打開(kāi)?',
      confirmText: "確認(rèn)",
      cancelText: "取消",
      success: function (res) {
        console.log(res);
        //點(diǎn)擊“確認(rèn)”時(shí)打開(kāi)設(shè)置頁(yè)面
        if (res.confirm) {
          console.log('用戶(hù)點(diǎn)擊確認(rèn)')
          wx.openSetting({
            success: (res) => { }
          })
        } else {
          console.log('用戶(hù)點(diǎn)擊取消')
        }
      }
    });
  },
})

當(dāng)然這段細(xì)節(jié)的需求跟我一開(kāi)始寫(xiě)的自己的需求有些不一樣,這段代碼要做的是進(jìn)頁(yè)面時(shí)獲取地理授權(quán)位置信息,然后判斷是否獲取了授權(quán),如果沒(méi)有那么彈出一個(gè)提示框主動(dòng)引導(dǎo)授權(quán),這里認(rèn)為如果是應(yīng)用是獲取地理位置是必須的如外賣(mài)小程序,那么引導(dǎo)用戶(hù)二次授權(quán)是必須的,如果本應(yīng)用對(duì)用戶(hù)的位置可需可不需那么可以做成我一開(kāi)始描述的那種需求。這里需注意到的是兩個(gè)API wx.getSetting和wx.openSetting,分別是用戶(hù)做了哪些授權(quán)設(shè)置和打開(kāi)設(shè)置頁(yè)面(我放的第一張圖)。注意現(xiàn)在由于1.wx.openSetting已經(jīng)廢棄,要用button去主動(dòng)觸發(fā)授權(quán)(這里可以去搜小程序文檔wx.openSetting),2.wx.getSetting也將要廢棄所以我修改后的代碼如下(根據(jù)我自己一開(kāi)始的需求)

<button wx:if="{{ldata}}" bindtap='btnTap'>獲取位置信息</button>
<button wx:else open-type="openSetting" bindopensetting='handler'>點(diǎn)擊授權(quán)并獲取位置信息</button>

//index.js
//獲取應(yīng)用實(shí)例
const app = getApp()
Page({
  data: {
    ldata:false
  },
  onLoad: function () {
// 獲取位置
var that=this;
    wx.getLocation({
      type: 'gcj02',
      success: function (res) {
        var latitude = res.latitude
        var longitude = res.longitude
        that.setData({
          ldata:true,
          latitude: latitude,
          longitude: longitude
        })
      },
      fail:function(res){
        console.log('拒絕授權(quán)')
        that.setData({
          ldata:false
        })
      }
    }) 
  },
  btnTap(e){
    wx.openLocation({
      latitude: this.data.latitude,
      longitude: this.data.longitude,
      scale: 28
    })
  },
  handler:function(e){
    var that = this;
    if (!e.detail.authSetting['scope.userLocation']){
      that.setData({
        ldata:false
      })
       }else{
          that.setData({
            ldata: true,
          })
          wx.getLocation({
            type: 'gcj02',
            success: function (res) {
              var latitude = res.latitude
              var longitude = res.longitude

              that.setData({
                latitude: latitude,
                longitude: longitude
              })
              wx.openLocation({
                latitude: latitude,
                longitude: longitude,
                scale: 28
              })
            }
          })
    }
    // wx.getSetting({
    //   success(res) {
    //     console.log('獲取已授權(quán)列表', res);
    //     if (!res.authSetting['scope.userLocation']) {
    //       console.log('無(wú)位置授權(quán)')
    //       that.setData({
    //         ldata: false
    //       })
    //     }
    //     else {
    //       console.log('有位置授權(quán)')
    //       that.setData({
    //         ldata: true,
    //       })
    //       wx.getLocation({
    //         type: 'gcj02',
    //         success: function (res) {
    //           var latitude = res.latitude
    //           var longitude = res.longitude
    //           that.setData({
    //             latitude: latitude,
    //             longitude: longitude
    //           })
    //           wx.openLocation({
    //             latitude: latitude,
    //             longitude: longitude,
    //             scale: 28
    //           })
    //         }
    //       })
    //     }
    //   }
    // })
  }
})

注意的地方就是頁(yè)面根據(jù)授權(quán)情況顯示不同的按鈕,由頁(yè)面ldata參數(shù)控制,用戶(hù)首次進(jìn)入通過(guò)onload 中的 wx.getLocation彈框授權(quán),如果同意ldata設(shè)置為true并保存位置信息,這時(shí)頁(yè)面直接顯示“獲取位置信息”按鈕,點(diǎn)擊后通過(guò)btnTap事件直接打開(kāi)地圖,通過(guò)開(kāi)始同意授權(quán)后保存的經(jīng)緯度顯示當(dāng)前位置。 當(dāng)我們?cè)俅芜M(jìn)入后已經(jīng)。
如果用戶(hù)第一次拒絕了授權(quán)那么ldata設(shè)置為false,顯示的是“點(diǎn)擊授權(quán)并獲取位置信息”按鈕,注意這個(gè)button按鈕的設(shè)置方式open-type=”openSetting” bindopensetting=’handler’,用按鈕的open-type發(fā)起打開(kāi)授權(quán)設(shè)置頁(yè),bindopensetting是設(shè)置用戶(hù)設(shè)置授權(quán)之后的回調(diào),我們可在回調(diào)里判斷用戶(hù)勾沒(méi)勾選同意授權(quán),如果判斷同意了那么ldata設(shè)置為true,之后顯示的都是“獲取位置信息”,不必授權(quán)直接顯示地圖。如果沒(méi)有勾選同意那么ldata當(dāng)然設(shè)置是false,之后再經(jīng)過(guò)這個(gè)頁(yè)面還是顯示“點(diǎn)擊授權(quán)并獲取位置信息”。
最后注意的是在回調(diào)里我一開(kāi)始用wx.getSetting判斷用戶(hù)在設(shè)置頁(yè)設(shè)置的授權(quán)結(jié)果,以為即將廢棄我們可以用回調(diào)函數(shù)的參數(shù)來(lái)判斷e.detail.authSetting,還有別的參數(shù)可以打印出來(lái)看一下。
感觸:剛接觸查到很多資料也是廢棄之前的東西,路漫漫其修遠(yuǎn)兮,吾將上下而求索。。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 給提問(wèn)的開(kāi)發(fā)者的建議:提問(wèn)之前先查詢(xún) 文檔、通過(guò)社區(qū)右上角搜索搜索已經(jīng)存在的問(wèn)題。 寫(xiě)一個(gè)簡(jiǎn)明扼要的標(biāo)題,并且...
    極樂(lè)叔閱讀 14,615評(píng)論 0 3
  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,172評(píng)論 3 119
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,789評(píng)論 25 709
  • 工作日 1)面試 2)年中總結(jié) 3)盯微服務(wù)項(xiàng)目測(cè)試的進(jìn)度 4)解決nexus無(wú)法上傳docker鏡像問(wèn)題。 晚上...
    灼灼2015閱讀 227評(píng)論 0 0
  • 前幾天我騎著摩拜晃晃悠悠路過(guò)沈北的天橋,邊聽(tīng)著歌邊思考著過(guò)幾天去成都的行程安排。想到成都的大熊貓、據(jù)說(shuō)辣到...
    JIAHUIG閱讀 543評(píng)論 0 1

友情鏈接更多精彩內(nèi)容