uniapp项目APP端安卓ios权限检测教程

BitOrbit
• 阅读 832
导语:在 APP 的日常开发过程中,权限检测与授权是不可避免的一项重要的功能,下面就简单介绍一下如何检测和授权的方法。

目录

  • 原理
  • 方法
  • 实战

原理

此授权方法主要是依托于 HTML5 产业联盟的HTML5+规范实现的。

HTML5 产业联盟官网

获取当前操作系统名称

可以使用uni.getSystemInfoSync方法;

调用方法检测权限

安卓可以使用plus.android.requestPermissions方法来检测权限。

此方法接受三个参数:

  • permissions:权限 ID;
  • res:成功返回的数据;
  • err: 失败返回的数据;

ios 需要每个权限都调用不同的类型才可实现授权。

可以使用plus.ios.importClass来导入相应的权限名称,通过plus.ios.deleteObject来删除权限;

比如相机权限需要导入AVCaptureDevice类,然后调用authorizationStatusForMediaType('vide')方法来检测,如果值是3就是授权开启。

方法

操作系统名称

const os = uni.getSystemInfoSync().osName;
console.log(os); // android 或 ios

安卓权限检测

安卓常用权限

const androidPermissions = {
  camera: "android.permission.CAMERA", // 摄像头权限
  location: "android.permission.ACCESS_FINE_LOCATION", // 位置权限
  calendar: {
    read: "android.permission.READ_CALENDAR", // // 日历读取权限
    write: "android.permission.WRITE_CALENDAR", // // 日历写入权限
  },
  storage: {
    read: "android.permission.READ_EXTERNAL_STORAGE", // 存储读取权限
    write: "android.permission.WRITE_EXTERNAL_STORAGE", // 存储写入权限
  },
  record: "android.permission.RECORD_AUDIO", // 麦克风权限
  contact: {
    read: "android.permission.READ_CONTACTS", // 联系人读取权限
    write: "android.permission.WRITE_CONTACTS", // 联系人写入权限
  },
  sms: {
    read: "android.permission.READ_SMS", // 短信读取权限
    send: "android.permission.SEND_SMS", //短信发送权限
    receive: "android.permission.RECEIVE_SMS", // 短信接收权限
  },
  state: "android.permission.READ_PHONE_STATE", // 手机识别码权限
  phone: "android.permission.CALL_PHONE", // 拨打电话权限
  log: "android.permission.READ_CALL_LOG", // 通话记录权限
};

获取权限列表

function getPermissionList(permissionID) {
  const id = androidPermissions[permissionID];
  const list = [];
  if (typeof id == "string") {
    list[0] = id;
  } else {
    for (let key in id) {
      list.push(id[key]);
    }
  }
  return list;
}

安卓检测方法

function androidPermissionCheck(permissionID) {
  return new Promise((resolve, reject) => {
    if (plus) {
      let ids = getPermissionList(permissionID);
      plus.android.requestPermissions(
        ids,
        function (result) {
          let res = 0;
          for (let i = 0; i < result.granted.length; i++) {
            let permission = result.granted[i];
            console.log("已获取的权限:", permission);
            res = 1;
          }
          for (let i = 0; i < result.deniedPresent.length; i++) {
            let permission = result.deniedPresent[i];
            console.log("本次已拒绝的权限:", permission);
            res = 0;
          }
          for (let i = 0; i < result.deniedAlways.length; i++) {
            let permission = result.deniedAlways[i];
            console.log("永久拒绝的权限:", permission);
            res = -1;
          }
          resolve({
            code: 1,
            data: res,
          });
        },
        (error) => {
          reject({
            code: 2,
            data: `code:${error.code},msg:${error.message}!`,
          });
        }
      );
    }
  });
}

ios 权限检测

ios 权限方法

function iosPermissionCheck(permissionID) {
  return new Promise((resolve, reject) => {
    let res = iosPermissions[permissionID]();
    resolve({
      code: 1,
      data: res,
    });
  });
}

ios 权限列表

// ios权限列表
const iosPermissions = {
  camera: iosCamera, // 摄像头
  location: iosLocation, // 位置
  calendar: iosCalendar, // 日历
  storage: iosAlbum, // 相册
  record: iosRecord, // 麦克风
  contact: iosContact, // 通讯录
  memo: iosMemo, // 备忘录
  push: iosPush, // 推送
};

ios 权限实现

  • 摄像头权限
function iosCamera() {
  if (plus) {
    let result = 0,
      avCaptureDevice = plus.ios.importClass("AVCaptureDevice"),
      authStatus = avCaptureDevice.authorizationStatusForMediaType("vide");
    if (authStatus === 3) {
      result = 1;
    } else {
      result = 0;
    }
    plus.ios.deleteObject(avCaptureDevice);
    return result;
  } else {
    return null;
  }
}
  • 位置权限
function iosLocation() {
  if (plus) {
    let result = 0,
      cLLocationManager = plus.ios.importClass("CLLocationManager"),
      authStatus = cLLocationManager.authorizationStatus(),
      enable = cLLocationManager.locationServicesEnabled();
    if (enable && authStatus != 2) {
      result = 1;
    } else {
      result = 0;
    }
    plus.ios.deleteObject(cLLocationManager);
    return result;
  } else {
    return null;
  }
}
  • 日历权限
function iosCalendar() {
  if (plus) {
    let result = 0,
      eKEventStore = plus.ios.importClass("EKEventStore"),
      authStatus = eKEventStore.authorizationStatusForEntityType(0);
    if (authStatus === 3) {
      result = 1;
    } else {
      result = 0;
    }
    plus.ios.deleteObject(eKEventStore);
    return result;
  } else {
    return null;
  }
}
  • 相册权限
function iosAlbum() {
  if (plus) {
    let result = 0,
      photoLibrary = plus.ios.importClass("PhotoLibrary"),
      authStatus = photoLibrary.authorizationStatus();
    if (authStatus === 3) {
      result = 1;
    } else {
      result = 0;
    }
    plus.ios.deleteObject(photoLibrary);
    return result;
  } else {
    return null;
  }
}
  • 麦克风权限
function iosRecord() {
  if (plus) {
    let result = 0,
      aVAudioSession = plus.ios.importClass("AVAudioSession"),
      aVAudio = aVAudioSession.sharedInstance(),
      authStatus = aVAudio.recordPermission();
    if ([1684369017, 1970168948].includes(authStatus)) {
      result = 0;
    } else {
      result = 1;
    }
    plus.ios.deleteObject(aVAudioSession);
    return result;
  } else {
    return null;
  }
}
  • 通讯录权限
function iosContact() {
  if (plus) {
    let result = 0,
      contactStore = plus.ios.importClass("CNContactStore"),
      authStatus = contactStore.authorizationStatusForEntityType(0);
    if (authStatus === 3) {
      result = 1;
    } else {
      result = 0;
    }
    plus.ios.deleteObject(contactStore);
    return result;
  } else {
    return null;
  }
}
  • 备忘录权限
function iosMemo() {
  if (plus) {
    let result = 0,
      eKEventStore = plus.ios.importClass("EKEventStore"),
      authStatus = eKEventStore.authorizationStatusForEntityType(1);
    if (authStatus === 3) {
      result = 1;
    } else {
      result = 0;
    }
    plus.ios.deleteObject(eKEventStore);
    return result;
  } else {
    return null;
  }
}
  • 推送权限
function iosPush() {
  if (plus) {
    let result = 0,
      application = plus.ios.importClass("UIApplication"),
      app = application.sharedApplication(),
      authStatus = 0;
    if (app.currentUserNotificationSettings) {
      let setting = app.currentUserNotificationSettings(),
        authStatus = setting.plusGetAttribute("types");
      if (authStatus === 0) {
        result = 0;
      } else {
        result = 1;
      }
    } else {
      authStatus = app.enabledRemoteNotificationTypes();
      if (authStatus === 0) {
        result = 0;
      } else {
        result = 1;
      }
    }
    plus.ios.deleteObject(eKEventStore);
    return result;
  } else {
    return null;
  }
}

导出方法

const permissionCheck = {
  android: androidPermissionCheck,
  ios: iosPermissionCheck,
};

const permission = permissionCheck[os];

export default permission;

实战

下面介绍一下使用的方法。

在需要的页面,引入permission.js文件,然后调用方法进行检测。

例如:检测摄像头权限的方法。

import permission from "./permission.js";

// 检测摄像头权限
async function checkCamera() {
  try {
    let checkResult = await permission("camera");
    console.log("检测信息:", checkResult);
    if (checkResult.code == 1) {
      let result = checkResult.data;
      if (res == 1) {
        console.log("授权成功!");
      }
      if (result == 0) {
        console.log("授权已拒绝!");
      }
      if (result == -1) {
        console.log("您已永久拒绝摄像机权限,请在应用设置中手动打开!");
      }
    }
  } catch (err) {
    console.log("授权失败:", err);
  }
}

下面是一些演示图。

  • 允许授权

uniapp项目APP端安卓ios权限检测教程

  • 拒绝授权

uniapp项目APP端安卓ios权限检测教程

  • 永久拒绝授权

uniapp项目APP端安卓ios权限检测教程

最后

好了,以上就是 uniapp 项目 APP 端安卓 ios 权限检测教程的主要内容,有不足之处,请多多指正。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
4年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这