apiCloud 开发 app 统一校验设备权限,没有权限提示开启
效果图
实现
permissionConfig.js
const allPermissions = {
'camera': '相机',//相机/拍照/录像
'contacts': '联系人',//联系人读取/写入
'contacts-r': '联系人读取',//仅联系人读取
'contacts-w': '联系人写入',//仅联系人写入
'microphone': '麦克风',//使用麦克风录制音频
'photos': '访问相册', //访问相册|本地存储空间。Android上等同storage权限
'location': '定位',//定位
'locationAlways': '后台定位',//后台定位,只支持iOS
'notification': '状态栏通知',//状态栏通知
'calendar': '日历',//日历读取/写入。只支持Android
'calendar-r': '日历读取',//仅日历读取
'calendar-w': '日历写入',//仅日历写入
'phone': '电话',//直接拨打电话/获取手机号码|IMEI。只支持Android
'phone-call': '拨打电话',//仅直接拨打电话
'phone-r': '获取手机号码|IMEI',//仅获取手机号码|IMEI
'phone-r-log': '取通话记录',//读取通话记录
'phone-w-log': '入通话记录',//写入通话记录
'sensor': '传感器',//传感器.只支持Android
'sms': '短信',//读取短信/后台发送短信。只支持Android
'sms-s': '发送短信',//仅后台发送短信
'sms-r': '读取短信',//仅读取短信
'storage': '存储空间',//读取/写入|相册|多媒体|本地存储空间。只支持Android
'storage-r': '读取存储',//仅读取|相册|多媒体|文件|本地存储空间
'storage-w': '写入存储'//仅写入|相册|多媒体|文件|本地存储空间
}
const needPermissions = { // 需要的权限
'photos': '存储空间',
'camera': '相机',
'location': '位置信息',
'phone': '电话'
}
export { allPermissions, needPermissions }
permission.js
import { needPermissions } from './permissionConfig'
function hasPermission(needPerms) {// 权限判断
return new Promise((resolve, reject) => {
// 权限数组
let perms = needPerms
let permCode = []
let noPermsName = []
let noPerms = []
for (let i in perms) {
permCode.push(i)
}
console.log('检查权限', permCode)
//获取需要判断的权限
let status = true
let ret = api.hasPermission({
list: permCode
})
console.log('权限检查结果:', ret)
for (let i=0;i<ret.length;i++) {
let obj = i
let granted = ret[obj].granted
let code = ret[obj].name
if (!granted) {// 找出没有授权的权限
noPerms.push(code)
noPermsName.push(perms[code])
if (status) status = false
}
}
let res = { 'status': status, 'perms': noPerms, 'names': noPermsName, 'all': needPerms }
console.log('权限对比结果:', status, res)
if (status) {
resolve(res)
} else {
reject(res)
}
})
}
function confirmPermission(perm) {
return new Promise((resolve, reject) => {
api.confirm({
title: '提醒',
msg: '没有获得 ' + perm.names.join(',') + ' 权限\n是否前往设置?',
buttons: ['去设置', '取消']
}, function(ret, err) {
console.log('权限确认结果', ret)
if (1 == ret.buttonIndex) {
resolve()
} else {
reject()
}
})
})
}
function requirePermission(perms) {
console.log('准备请求权限', perms.perms)
return new Promise((resolve) => {
api.requestPermission({
list: perms.perms
}, function(ret) {
console.log('权限请求结果', ret)
resolve(ret)
})
})
}
function checkSysPermission() {
return new Promise((resolve, reject) => {
hasPermission(needPermissions).then(resolve).catch(function(ret) {
// 缺少权限 确认并获取
confirmAndRequire(ret).then(resolve).catch(reject)
})
})
}
async function confirmAndRequire(perm) {
await confirmPermission(perm)
await requirePermission(perm)
}
export { checkSysPermission, hasPermission, confirmPermission, requirePermission, confirmAndRequire }
使用
vue 项目中,在 main.js 中使用,或者登录页使用
import { checkSysPermission } from '@/assets/js/permission'
checkSysPermission()
.then(() => {
Vue.prototype.$api = window.$api // api.js 里面自己封装的方法
Vue.prototype.$apiCloud = window.api //apicloud 内置api
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
})
.catch(() => {
// 取消则退出 app
window.api.closeWidget({
id: window.api.appId,
silent: true,
animation: {
type: 'none'
}
})
})