最近要寫(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)兮,吾將上下而求索。。