需求:微信小程序弹出权限询问前先弹出授权说明告知收集权限目的
权限判断封装到PermissionManager.js文件中:
const albumTips = "我们访问您的存储权限,为您提供使用与保存图片、视频、文件等服务。";
const audioTips = "我们访问您的麦克风权限,为您提供发送语音、视频问诊等服务。";
const locationTips = "我们访问您的位置信息,根据您的位置推荐最近医院就诊,以及为您提供医院导航、签到取号等服务。";
/**
* 授权说明文案
* @param {*} permissionName 微信小程序权限名称
* @returns
*/
function getTips(permissionName) {
if (permissionName == "scope.writePhotosAlbum" || permissionName == "uni.saveVideoToPhotosAlbum") {
return albumTips;
} else if (permissionName == "scope.record") {
return audioTips;
} else if (permissionName == "scope.userLocation") {
return locationTips;
}
}
/**
* 授权说明文案
* @param {*} permissionName 微信小程序权限名称
* @returns
*/
function getPermissionName(permissionName) {
if (permissionName == "scope.writePhotosAlbum" || permissionName == "uni.saveVideoToPhotosAlbum") {
return "存储权限";
} else if (permissionName == "scope.record") {
return "录音权限";
} else if (permissionName == "scope.userLocation") {
return "locationTips";
}
}
//授权说明弹窗
function showPermissionTips(content, callback) {
uni.showModal({
title: "授权说明",
content: content,
confirmText: "确定",
showCancel: false,
success: function(res) {
if (res.confirm) {
callback && callback();
}
},
});
}
//小程序判断授权
function judgePermission(permissionName, agreeCallback, refuseCallback) {
if (permissionName == "scope.userLocation") {
let systemInfo = uni.getSystemInfoSync();
console.log("systemInfo---", systemInfo);
if (!systemInfo.locationEnabled) {
//如果是定位权限并且系统设置未开启定位
uni.showModal({
title: "提示",
content: "系统设置未开启GPS服务,请开启!",
});
refuseCallback && refuseCallback();
return;
}
}
uni.getSetting({
success(res) {
console.log(res.authSetting)
if (res.authSetting[permissionName] == undefined) {
//1、首次授权
let tips = getTips(permissionName);
showPermissionTips(tips,
() => {
agreeCallback && agreeCallback();
})
} else if (res.authSetting[permissionName] == true) {
//2、之前同意了授权
agreeCallback && agreeCallback();
} else if (res.authSetting[permissionName] != undefined &&
res.authSetting[permissionName] != true) {
//3、之前拒绝了权限
uni.showModal({
title: '提示',
content: '您之前拒绝了' + getPermissionName(permissionName) + '权限,是否打开设置重新授权?',
success: function(res) {
if (res.confirm) {
//打开权限设置页
uni.openSetting({
success: function(res) {
console.log(res)
if (res.authSetting[permissionName] == true) {
//用户在设置页打开了权限
uni.showToast({
title: '授权成功',
icon: 'none'
})
agreeCallback && agreeCallback();
} else {
//用户在设置页未打开权限
uni.showToast({
title: '授权失败',
icon: 'none',
})
refuseCallback && refuseCallback();
}
}
})
} else if (res.cancel) {
refuseCallback && refuseCallback();
}
}
});
}
}
})
}
module.exports = {
judgePermission: judgePermission,
}
这里以 uni.saveImageToPhotosAlbum 这个api为例,在使用uni.saveImageToPhotosAlbum这个api前先判断权限:
permissionManager.judgePermission("scope.writePhotosAlbum", () => {
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: function () {
uni.showToast({
title: "保存成功",
icon: "none",
});
},
fail: function () {
uni.showToast({
title: "保存失败",
icon: "none",
});
},
});
},()=>{});