apicloud (YonBIP)开发 app 统一校验设备权限

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'
          }
        })
      })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值