?
1、權(quán)限接口說明
官方權(quán)限說明
??部分接口需要經(jīng)過用戶授權(quán)統(tǒng)一才能調(diào)用。我們把這些接口按使用范圍分成多個(gè)scope,用戶選擇對(duì)scope進(jìn)行授權(quán),當(dāng)授權(quán)給一個(gè)scope之后,其對(duì)應(yīng)的所有接口都可以直接使用。
此類接口調(diào)用時(shí):
- 如果用戶未接受或拒絕過此權(quán)限,會(huì)彈窗詢問用戶,用戶點(diǎn)擊同意后方可調(diào)用接口;
- 如果用戶已授權(quán),可以直接調(diào)用接口;
- 如果用戶已拒絕授權(quán),則不會(huì)出現(xiàn)彈窗,而是直接進(jìn)入接口 fail 回調(diào)。請(qǐng)開發(fā)者兼容用戶拒絕授權(quán)的場景。
獲取用戶授權(quán)設(shè)置
開發(fā)者可以使用 wx.getSetting 獲取用戶當(dāng)前的授權(quán)狀態(tài)。
打開設(shè)置界面
用戶可以在小程序設(shè)置界面(「右上角」 - 「關(guān)于」 - 「右上角」 - 「設(shè)置」)中控制對(duì)該小程序的授權(quán)狀態(tài)。
開發(fā)者可以調(diào)用 wx.openSetting 打開設(shè)置界面,引導(dǎo)用戶開啟授權(quán)。
提前發(fā)起授權(quán)請(qǐng)求
開發(fā)者可以使用 wx.authorize 在調(diào)用需授權(quán) API 之前,提前向用戶發(fā)起授權(quán)請(qǐng)求。
scope 列表
授權(quán)有效期
一旦用戶明確同意或拒絕過授權(quán),其授權(quán)關(guān)系會(huì)記錄在后臺(tái),直到用戶主動(dòng)刪除小程序。
最佳實(shí)踐
在真正需要使用授權(quán)接口時(shí),才向用戶發(fā)起授權(quán)申請(qǐng),并在授權(quán)申請(qǐng)中說明清楚要使用該功能的理由。
注意事項(xiàng)
wx.authorize({scope: “scope.userInfo”}),不會(huì)彈出授權(quán)窗口,請(qǐng)使用 wx.createUserInfoButton
需要授權(quán) scope.userLocation 時(shí)必須配置地理位置用途說明。
2、具體權(quán)限接口介紹
2.1 wx.authorize()
官方說明 wx.authorize
2.2 wx.openSetting()
官方說明 wx.openSetting()
3 、權(quán)限申請(qǐng)方式
- 通過 button 的 open-type 方式來獲取相應(yīng)的權(quán)限及信息。
- 通過 wx.authorize()和wx.openSetting() 兩個(gè)接口來申請(qǐng)相應(yīng)的權(quán)限。
特別注意的是:需要授權(quán) scope.userLocation、scope.userLocationBackground 時(shí)必須配置地理位置用途說明
通過button申請(qǐng)權(quán)限
通過button獲取權(quán)限對(duì)于開發(fā)者來說相對(duì)簡單一些,開發(fā)者只需要綁定相應(yīng)的回調(diào)函數(shù)即可,權(quán)限申請(qǐng)的成功和失敗都可以在回調(diào)函數(shù)中處理。
其實(shí)我們可以把通過button申請(qǐng)權(quán)限的方式當(dāng)作普通的信息獲取接口,只不過這個(gè)接口必須通過button組件來調(diào)用而已。
通過wx.authorize()來申請(qǐng)權(quán)限
通過wx.authorize()來申請(qǐng)權(quán)限的方式是比較繁瑣的。因?yàn)樗臓顟B(tài)比較多,大致可分為:
- 如果用戶未接受或拒絕過此權(quán)限,會(huì)彈窗詢問用戶,用戶點(diǎn)擊同意后方可調(diào)用接口;
- 如果用戶已授權(quán),可以直接調(diào)用接口;
- 如果用戶已拒絕授權(quán),則不會(huì)出現(xiàn)彈窗,而是直接進(jìn)入接口 fail 回調(diào)。請(qǐng)開發(fā)者兼容用戶拒絕授權(quán)的場景
針對(duì)這三種狀態(tài),開發(fā)者的處理方式也有所不同。
-
用戶未接受或拒絕過此權(quán)限,會(huì)彈窗詢問用戶,用戶點(diǎn)擊同意 —— 可調(diào)用相應(yīng)接口。
-
用戶未接受或拒絕過此權(quán)限,會(huì)彈窗詢問用戶,用戶點(diǎn)擊拒絕 —— 打開設(shè)置頁面。
-
如果用戶已授權(quán) —— 可調(diào)用相應(yīng)接口。
-
用戶已拒絕授權(quán) —— 打開設(shè)置頁面。
上述情況的2/4是需要開發(fā)者結(jié)合 wx.openSetting() 來幫助用戶進(jìn)行二次授權(quán)的。
就是這個(gè) openSetting 打開設(shè)置頁面的過程讓開發(fā)者比較抓狂。
2.3.0 版本開始,用戶發(fā)生點(diǎn)擊行為后,才可以跳轉(zhuǎn)打開設(shè)置頁。
也就是說 openSetting 只能通過 button 組件和點(diǎn)擊(bindtap)的回調(diào)函數(shù)里來調(diào)用。
然而我們?cè)谏暾?qǐng)權(quán)限的時(shí)候無法保證用戶一定會(huì)在第一次申請(qǐng)的時(shí)候同意,所以一定是需要配合openSetting來使用的。
那我們?cè)诿總€(gè)調(diào)用openSetting的地方都加一個(gè)button也是很不別扭的。
當(dāng)下來說我們最好的處理方案就是把wx.authorize()和wx.openSetting()結(jié)合起來使用,并把他們放在一個(gè)bindtap/catchtap(或其他手勢(shì)事件)的回調(diào)函數(shù)里。
接下來我們重點(diǎn)來整合一下這種方式的權(quán)限處理。
?
4、權(quán)限申請(qǐng)整合代碼
4.1 參考工具類代碼
以下是整合的工具類代碼,我們暫時(shí)命名其為 authorizer.js,可直接復(fù)制使用。
const authsName = {
"scope.userInfo": "用戶信息",// 請(qǐng)用button獲取該信息
"scope.userLocation": "地理位置",
"scope.userLocationBackground": "后臺(tái)定位",
"scope.address": "通訊地址",
"scope.invoiceTitle": "發(fā)票抬頭",
"scope.invoice": "獲取發(fā)票",
"scope.werun": "微信運(yùn)動(dòng)步數(shù)",
"scope.record": "錄音功能",
"scope.writePhotosAlbum": "保存到相冊(cè)",
"scope.camera": "攝像頭",
}
var scope = null;
var success = null;
var fail = null;
var denyBack = null;
var deniedFun = null;
/**
* 申請(qǐng)某個(gè)權(quán)限
* _scope 權(quán)限名稱
* _success 成功回調(diào)
* _fail 失敗回調(diào)
* _denyBack 申請(qǐng)權(quán)限時(shí)用戶 拒絕 后的回調(diào)
* _deniedFun 之前申請(qǐng)過該權(quán)限但被拒絕了,該情況下調(diào)用此函數(shù)
*/
function authorize(_scope, _success, _fail, _denyBack, _deniedFun) {
resetData();
scope = _scope;
success = _success;
fail = _fail;
denyBack = _denyBack;
deniedFun = _deniedFun;
if (!scope) {
return;
}
// 判斷權(quán)限狀態(tài)
wx.getSetting({
success: function(res) {
let currentScope = res.authSetting[scope];
if (currentScope == undefined || currentScope == null) {
// 之前沒有申請(qǐng)或該權(quán)限
wx.authorize({
scope: scope,
success: function(res) {
authSuccess(res);
},
fail: function(err) {
authDeny();
}
});
} else if (currentScope == false) {
// 之前申請(qǐng)過該權(quán)限但被拒絕了, 如果配置 deniedFun 函數(shù),則有執(zhí)行 deniedFun 方法,
// 由調(diào)用者決定改中情況下如何處理。
if (authDenied()) {
return;
}
// 如果沒有配置 deniedFun 函數(shù),走默認(rèn)邏輯,打開設(shè)置界面
wx.showModal({
title: '權(quán)限申請(qǐng)',
content: '點(diǎn)擊 “確定” 按鈕,打開 “' + authsName[scope] + '” 的權(quán)限設(shè)置界面',
cancelText: '取消',
confirmText: '確定',
success(res) {
if (res.confirm) {
wx.openSetting({
success: function(res) {
let cScope = res.authSetting[scope];
if (cScope) {
authSuccess();
} else {
authFail();
}
},
fail: function(res) {
authFail();
}
});
}
}
});
} else {
// 已經(jīng)獲得該權(quán)限
authSuccess();
}
},
fail: function() {
authFail();
}
});
}
/**
* 權(quán)限申請(qǐng)成功
*/
function authSuccess(res) {
if (success && typeof success == 'function') {
success(res);
}
resetData();
}
/**
* 權(quán)限申請(qǐng)失敗
*/
function authFail() {
if (fail && typeof fail == 'function') {
fail();
}
resetData();
}
/**
* 拒絕使用該權(quán)限
*/
function authDeny() {
if (denyBack && typeof denyBack == 'function') {
denyBack();
}
resetData();
}
/**
* 之前申請(qǐng)過該權(quán)限但被拒絕了
*/
function authDenied() {
if (deniedFun && typeof deniedFun == 'function') {
deniedFun();
resetData();
return true;
} else {
return false;
}
}
/**
* 重置參數(shù)
*/
function resetData() {
scope = null;
success = null;
fail = null;
denyBack = null;
deniedFun = null;
}
module.exports = {
authorize: authorize,
}
工具類的使用
wxml代碼:
<view bindtap="authApply">權(quán)限申請(qǐng)</view>
js代碼:
/**
* 權(quán)限申請(qǐng)--微信步數(shù)
*/
authApply(e) {
authorizer.authorize("scope.werun", function(res) {
console.log('success', res);
wx.getWeRunData({success: function(res){
console.log('WeRunData', res)
}});
}, function(err) {
console.log('denyback', err);
}, function(err) {
console.log('deniedBack', err);
});
},
4.2 實(shí)際代碼實(shí)現(xiàn)
data:{
authScope:"scope.werun",//要申請(qǐng)的權(quán)限
},
/**
* 申請(qǐng)權(quán)限
* _scope 權(quán)限名稱
* _authSuccess 成功回調(diào)
* _authFail 失敗回調(diào)
* _authDeny 申請(qǐng)權(quán)限時(shí)用戶 拒絕 后的回調(diào)
* _authDenied 之前申請(qǐng)過該權(quán)限但被拒絕了,該情況下調(diào)用此函數(shù)
*/
//授權(quán)成功
authSuccess(){
let that = this
console.log("授權(quán)成功")
that.setData({
hasWerun:true
})
that.getUserRun()
},
//授權(quán)失敗
authFail(){
console.log("授權(quán)失敗")
wx.showToast({
title: '授權(quán)失敗',
icon: 'none',
duration: 1000
})
},
//拒絕授權(quán)
authDeny(){
console.log("authorize調(diào)用失敗,引導(dǎo)重新吊起")
wx.showToast({
title: '您未授權(quán)微信運(yùn)動(dòng) 請(qǐng)點(diǎn)擊右上角設(shè)置 進(jìn)入列表手動(dòng)授權(quán)',
icon: 'none',
duration: 3000
})
},
//已被拒絕授權(quán)過的權(quán)限,重新吊起
authDenied(){
console.log("currentScope == false 已被拒絕授權(quán)過的權(quán)限,引導(dǎo)重新吊起")
wx.showToast({
title: '您未授權(quán)微信運(yùn)動(dòng) 請(qǐng)點(diǎn)擊右上角設(shè)置 進(jìn)入列表重新授權(quán)',
icon: 'none',
duration: 3000
})
},
authApply:function(){
let that = this
let scope = that.data.authScope
if (!scope) {
return;
}
// 判斷權(quán)限狀態(tài)
wx.getSetting({
success: function(res) {
console.log("當(dāng)前權(quán)限列表")
console.log(res)
let currentScope = res.authSetting[scope];
if (currentScope == undefined || currentScope == null) {
// 之前沒有申請(qǐng)或該權(quán)限
console.log("之前沒有申請(qǐng)或該權(quán)限")
wx.authorize({
scope: scope,
success: function() {
that.authSuccess();
},
fail: function(err) {
that.authDeny();
}
});
} else if (currentScope == false) {
// 之前申請(qǐng)過該權(quán)限但被拒絕了
that.authDenied()
return;
} else {
// 已經(jīng)獲得該權(quán)限
that.authSuccess();
}
},
fail: function() {
that.authFail();
}
});
},
//設(shè)置按鈕綁定權(quán)限列表
getOpenSetting: function () {
let that = this
wx.openSetting({
success(res) {
if (res.authSetting[that.data.authScope]) {
// 用戶在設(shè)置頁面開啟權(quán)限后,重新授權(quán)成功
// 可以調(diào)用相應(yīng)的 API 接口
that.setData({
hasWerun:true
})
console.log("openSetting已獲取到授權(quán)")
that.authSuccess()
} else {
// 用戶在設(shè)置頁面未開啟權(quán)限,授權(quán)失敗
that.authFail()
}
},
fail() {
console.log("openSetting拉起失敗")
// 調(diào)用 wx.openSetting 接口失敗
that.authFail()
}
})
},
wxml文章來源:http://www.zghlxwxcb.cn/news/detail-442415.html
<text class="info-text" bindtap="getOpenSetting">權(quán)限</text>
總結(jié)
微信小程序的權(quán)限申請(qǐng)有兩種方式;
分析了一下wx.authorize這種方式發(fā)生的幾種情況以及相應(yīng)的處理;
整理了一份wx.authorize使用的通用方法,且此方法須在某個(gè)手勢(shì)事件的回調(diào)函數(shù)中。文章來源地址http://www.zghlxwxcb.cn/news/detail-442415.html
到了這里,關(guān)于【微信小程序】 權(quán)限接口梳理以及代碼實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!