本篇文章給大家帶來了關于微信小程序的相關問題,其中主要介紹了微信小程序中的權限接口的相關內容,包括了用戶授權接口、獲取用戶權限設置接口、打開用戶權限設置接口等內容,下面一起來看一下,希望對大家有幫助。

1、權限接口
部分接口需要經過用戶授權統一才能調用。我們把這些接口按使用范圍分成多個scope,用戶選擇對scope進行授權,當授權給一個scope之后,其對應的所有接口都可以直接使用,此類接口調用時:
如果用戶未接受或拒絕此權限,會彈窗詢問用戶,用戶單擊統一后方可調用接口。
如果用戶已授權,可以直接調用接口。
如果用戶已拒絕授權,則不會出現彈窗,而會直接進入接口fail回調。
此類接口再權限中的對象scope的字段和接口的對應關系如下表所示。
| scope | 對應接口 | 描述 |
|---|---|---|
| scope.userLocation | wx.getLocation, wx.chooseLocation, wx.startLocationUpdate | 地理位置 |
| scope.userLocationBackground | wx.startLocationUpdateBackground | 后臺定位 |
| scope.record | wx.startRecord, wx.joinVoIPChat, RecorderManager.start | 麥克風 |
| scope.camera | camera組件, wx.createVKSession | 攝像頭 |
| scope.bluetooth | wx.openBluetoothAdapter, wx.createBLEPeripheralServer | 藍牙 |
| scope.writePhotosAlbum | wx.saveImageToPhotosAlbum, wx.saveVideoToPhotosAlbum | 添加到相冊 |
| scope.addPhoneContact | wx.wx.addPhoneContact | 添加到聯系人 |
| scope.addPhoneCalendar | wx.addPhoneRepeatCalendar, wx.addPhoneCalendar | 添加到日歷 |
| scope.werun | wx.getWeRunData | 微信運動步數 |
| scope.address | wx.chooseAddress | 通訊地址(已取消授權,可以直接調用對應接口) |
| scope.invoiceTitle | wx.chooseInvoiceTitle | 發票抬頭(已取消授權,可以直接調用對應接口) |
| scope.invoice | wx.chooseInvoice | 獲取發票(已取消授權,可以直接調用對應接口) |
| scope.userInfo | wx.getUserInfo | 用戶信息(小程序已回收,請使用頭像昵稱填寫,小游戲可繼續調用) |
小程序提供了三組接口對接口權限進行相應的操作:wx.getSetting()獲取用戶當前的授權狀態;wx.openSetting()打開設置界面以引導用戶開啟授權;wx.authorize()改變授權狀態。
1.1 用戶授權接口wx.authorize(Object object)
提前向用戶發起授權請求。該接口調用后會立刻彈窗詢問用戶是否同意授權小程序使用某項功能或獲取用戶的某些數據,但不會實際調用對應接口。如果用戶之前已經同意授權,則不會出現彈窗,直接返回成功。屬性如下表所示。
| 屬性 | 類型 | 默認值 | 必填 | 說明 |
|---|---|---|---|---|
| scope | string | 是 | 需要獲取權限的 scope,詳見 scope 列表 | |
| success | function | 否 | 接口調用成功的回調函數 | |
| fail | function | 否 | 接口調用失敗的回調函數 | |
| complete | function | 否 | 接口調用結束的回調函數(調用成功、失敗都會執行) |
官網的示例代碼:
// 可以通過 wx.getSetting 先查詢一下用戶是否授權了 "scope.record" 這個
scopewx.getSetting({
success(res) {
if (!res.authSetting['scope.record']) {
wx.authorize({
scope: 'scope.record',
success () {
// 用戶已經同意小程序使用錄音功能,后續調用 wx.startRecord 接口不會彈窗詢問
wx.startRecord()
}
})
}
}
})1.2 獲取用戶權限設置接口wx.getSetting(Object object)
該接口獲取用戶的當前設置。返回值中只會出現小程序已經向用戶請求過的權限。屬性如下:
| 屬性 | 類型 | 默認值 | 必填 | 說明 | 最低版本 |
|---|---|---|---|---|---|
| withSubscriptions | Boolean | false | 否 | 是否同時獲取用戶訂閱消息的訂閱狀態,默認不獲取。注意:withSubscriptions 只返回用戶勾選過訂閱面板中的“總是保持以上選擇,不再詢問”的訂閱消息。 | 2.10.1 |
| success | function | 否 | 接口調用成功的回調函數 | ||
| fail | function | 否 | 接口調用失敗的回調函數 | ||
| complete | function | 否 | 接口調用結束的回調函數(調用成功、失敗都會執行) |
object.success回調函數如下:
| 屬性 | 類型 | 說明 | 最低版本 |
|---|---|---|---|
| authSetting | AuthSetting | 用戶授權結果 | |
| subscriptionsSetting | SubscriptionsSetting | 用戶訂閱消息設置,接口參數withSubscriptions值為true時才會返回。 | 2.10.1 |
| miniprogramAuthSetting | AuthSetting | 在插件中調用時,當前宿主小程序的用戶授權結果 |
官網示例代碼:
wx.getSetting({
success (res) {
console.log(res.authSetting)
// res.authSetting = {
// "scope.userInfo": true,
// "scope.userLocation": true
// }
}
})1.3 打開用戶權限設置接口wx.openSetting(Object object)
該接口調用客戶端小程序設置界面,返回用戶設置的操作結果。設置界面只會出現小程序已經向用戶請求過的權限。
| 屬性 | 類型 | 默認值 | 必填 | 說明 | 最低版本 |
|---|---|---|---|---|---|
| withSubscriptions | Boolean | false | 否 | 是否同時獲取用戶訂閱消息的訂閱狀態,默認不獲取。注意:withSubscriptions 只返回用戶勾選過訂閱面板中的“總是保持以上選擇,不再詢問”的訂閱消息。 | 2.10.3 |
| success | function | 否 | 接口調用成功的回調函數 | ||
| fail | function | 否 | 接口調用失敗的回調函數 | ||
| complete | function | 否 | 接口調用結束的回調函數(調用成功、失敗都會執行) |
object.success回調函數如下:
| 屬性 | 類型 | 說明 | 最低版本 |
|---|---|---|---|
| authSetting | AuthSetting | 用戶授權結果 | |
| subscriptionsSetting | SubscriptionsSetting | 用戶訂閱消息設置,接口參數withSubscriptions值為true時才會返回。 | 2.10.3 |
注意:2.3.0 版本開始,用戶發生點擊行為后,才可以跳轉打開設置頁,管理授權信息。
官網示例代碼:
wx.openSetting({
success (res) {
console.log(res.authSetting)
// res.authSetting = {
// "scope.userInfo": true,
// "scope.userLocation": true
// }
}
})2、授權案例
本例使用獲取地理位置接口wx.getLocation()和開始錄音接口wx.startRecord()進行相關操作,而這兩個接口都需要設置操作權限。
Setting.wxml代碼如下:
<!--index.wxml-->
<view class="body" bindtap="location1">獲取地理位置</view><view class="body">{{context}}</view><view class="body" bindtap="location2">開始錄音</view>Setting.js代碼如下:
//index.js//獲取應用實例
const app = getApp()Page({
data: {
},
onLoad: function () {
context:''
},
location1:function(){ //獲取地理位置
var that=this
wx.getSetting({ //獲取用戶權限設置接口
success(res) {
console.log(res)
if (!res.authSetting['scope.userLocation']) {
wx.authorize({ //授權
scope: 'scope.userLocation', //地理位置權限,看線上面的scope對應的參數
success() {
wx.getLocation({ //獲取當前的地理位置
success: function(res) {
console.log(res)
that.setData({ context: "你所在的經度是" + res.latitude+"你所在的緯度是"+res.longitude})
},
})
}
})
}
}
})
},
location2: function () {
//錄音
var that = this
wx.getSetting({
success(res) {
console.log(res.authSetting)
if (!res.authSetting['scope.record']) {
wx.openSetting({
//打開用戶權限設置界面
success(res) {
console.log(res)
wx.startRecord({
//開始錄音
success(res) {
const tempFilePath = res.tempFilePath
console.log("錄音結束")
}
})
}
})
}
}
})
}
})location()1函數實現獲取地理位置的功能,該函數先調用wx.getSetting()接口獲取權限狀態,然后調用wx.authorize()接口修改地理位置權限scope.userLocation。
location2()函數實現錄音功能,該函數先調用wx.getSetting()接口獲取權限狀態,然后調用wx.openSetting()接口打開錄音權限設置界面來修改錄音權限。
從本例可以看出設置權限的時候應該先調用wx.getSetting()接口來修改權限狀態,在沒有權限打開的情況下可以調用wx.authorize()接口或者wx.openSetting()接口來修改權限狀態,wx.authorize()接口不出現修改權限的操作權限,而wx.openSetting()接口會出現修改權限的操作界面。
案例效果如下:

點擊獲取地理位置:

點擊允許之后會顯示當前所在的經緯度。

點擊開始錄音按鈕出現麥克風授權:







