微信小程序獲取用戶當前位置有三個方式:html
1. wx.getLocation(多與wx.openLocation一塊兒用)
獲取當前的精度、緯度、速度。不須要受權。當type設置爲gcj02 返回可用於wx.openLocation的座標
2. wx.chooseLocation
須要受權,打開地圖選擇位置小程序
第一次調用方法時先出現微信小程序
容許權限以後以後再出現微信
若是第一次就不容許,則一直調用wx.chooseLocation的fail方法app
3. wx.openLocation函數
須要受權,使用微信內置地圖查看位置。多半用於查看起點到終點的路線怎麼走測試
受權方法有三種:this
1. wx.getSetting
獲取用戶的當前設置,返回值中只會出現小程序已經向用戶請求過的權限,相似下面的樣子spa
2. wx.openSetting3d
調起權限設置選擇界面,設置界面只會出現小程序已經向用戶請求過的權限,相似下面的樣子
3. wx.authorize
提早向用戶發起受權請求。調用後會馬上彈窗詢問用戶是否贊成受權小程序使用某項功能或獲取用戶的某些數據,但不會實際調用對應接口。若是用戶以前已經贊成受權,則不會出現彈窗,直接返回成功。,相似下面的樣子
這就是wx.authorize出現的內容
問題來了:假如我第一次使用wx.chooseLocation()獲取權限被拒絕,而後使用wx.getSetting()來從新獲取權限該怎麼作呢?
思路:wx.chooseLocation()有fail方法,若是第一次拒絕以後,之後調用選擇地圖都是觸發的這個,那麼我能夠在fail方法裏面,使用wx.getSetting(),這樣就每次都能判斷是否已經給與了權限了。
第一步:因爲有可能會屢次使用定位的方法,因此我把定位的方法寫到App.js中,方便調用
App({ //獲取用戶地理位置權限 getPermission:function(obj){ wx.chooseLocation({ success: function (res) { obj.setData({ addr: res.address //調用成功直接設置地址 }) }, fail:function(){ wx.getSetting({ success: function (res) { var statu = res.authSetting; if (!statu['scope.userLocation']) { wx.showModal({ title: '是否受權當前位置', content: '須要獲取您的地理位置,請確認受權,不然地圖功能將沒法使用', success: function (tip) { if (tip.confirm) { wx.openSetting({ success: function (data) { if (data.authSetting["scope.userLocation"] === true) { wx.showToast({ title: '受權成功', icon: 'success', duration: 1000 }) //受權成功以後,再調用chooseLocation選擇地方 wx.chooseLocation({ success: function(res) { obj.setData({ addr: res.address }) }, }) } else { wx.showToast({ title: '受權失敗', icon: 'success', duration: 1000 }) } } }) } } }) } }, fail: function (res) { wx.showToast({ title: '調用受權窗口失敗', icon: 'success', duration: 1000 }) } }) } }) },
})
第二步:在須要獲取地址的頁面中:
var app = getApp(); Page({ data:{ addr:'請選擇位置' }, //選擇獲取地理位置 getAddress:function(){ var that=this; app.getPermission(that); //傳入that值能夠在app.js頁面直接設置內容
}, })
最終效果圖:
最終在手機上獲取到的位置誤差不太大。
更新 wx.openSetting 的注意事項。
2.3.0 版本開始,用戶發生點擊行爲後,才能夠跳轉打開設置頁,管理受權信息
即2.3.0版本以後,我經過上面的wx.showModal的回調函數來調用wx.openSetting 會發生下面的錯誤:
openSetting:fail can only be invoked by user TAP gesture.
可是我測試 2.2.4 開始 到2.3.1 都會出現上面這種錯誤。
2.3.2及以上又不會出現這種問題。。。。。。。。
並且當我測試2.0.8 到 2.2.3 會出現下面的錯誤。。。。。。
其它的就沒有這問題了。搞不懂。。。