最近用uniapp开发一个app,遇到一些权限问题,怎么说了,也是第一次一个人来开发完整的app,所以遇到很多以前没遇到过也没考虑过的问题,就做一个记录,同时也希望能对大家有点帮助,废话不多说
开发app的话,uniapp提供的获取权限的api就用不了了,所以大家可以直接去下面这个链接,这是uniapp官方推荐的权限获取插件,封装的挺好的
这个插件对安卓来说没什么问题,但在ios上会有一个问题,我在网上查找了一两天才知道原因
就拿我的做法来说,可能是我有点笨,我想调用相机拍照,我是先判断有没有调用相机的权限,如果没有就引导用户去权限列表设置,这在安卓手机上没有问题,但由于ios的机制问题,你只有用过该功能它的权限列表才会出现该权限的设置,而安卓的权限直接就在列表里
刚开始没有相机权限
所以我们可以直接调用相机,第一次的话会有个系统提示框给用户,看他授不授权,他同不同意都没关系,因为这时候设置里的权限列表已经有了该功能,下次用户要用相机可以引导用户去设置里开启该权限了
然后设置里就有了相机这个权限了,后面即使他关了也可以引导他去设置了
封装获取相机和相册是否授权,以及跳转到权限设置页面(前提是引入了上文的那个插件)
//手机权限,摄像头和图册
phoneAuthority(){
return new Promise(async (rel,rej)=>{
var platform = this.globalData.platform;
if(platform == 'ios'){
let camera = permision.judgeIosPermission("camera");//判断ios是否给予摄像头权限
//ios相册没权限,系统会自动弹出授权框
//let photoLibrary = permision.judgeIosPermission("photoLibrary");//判断ios是否给予相册权限
if(camera){
rel();
}else{
rej('需要开启相机使用权限');
}
}else{
let camera = await permision.requestAndroidPermission("android.permission.CAMERA");//判断安卓是否给予摄像头权限
let photoLibrary = await permision.requestAndroidPermission("android.permission.READ_EXTERNAL_STORAGE");//判断安卓是否给予相册权限
if(camera == 0 || photoLibrary == 0){
rej('请同时开启相机和相册的使用权限');
}else if(camera == -1 || photoLibrary == -1){
//永久拒绝
rej(false)
}else{
rel();
}
}
})
},
//跳转到手机开启权限的界面
permissionSetting(){
permision.gotoAppPermissionSetting();
}
使用页,platform是手机系统,可以通过API获取手机系统名称
//选取图片
selectImg(){
const isIosTrue = uni.getStorageSync('iosFirstCamera');//是不是第一次开启相机
//ios要先调用一下功能后,设置的权限列表里才会有该权限
if(getApp().globalData.platform == 'ios' && isIosTrue !== 'false'){
uni.setStorageSync('iosFirstCamera','false');//设为false就代表不是第一次开启相机
uni.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success(res) {
console.log('选取或者拍照');
}
})
}else{
getApp().phoneAuthority().then(e =>{
uni.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success(res) {
console.log('选取或者拍照');
}
})
}).catch(e =>{
console.log(e);
})
}
},
更多权限封装
// import {getCacheSync} from './cache.js'
//登录判断,没有第一个页面跳转登录页
// 拦截tabbar页面跳转
// uni.addInterceptor('switchTab', {
// invoke (e) {
// if (!getCacheSync('userInfo')) {
// uni.redirectTo({
// url: '/pages/login/index/index'
// });
// return false
// }else{
// return true
// }
// },
// success (e) {
// // console.log(e)
// }
// })
import permision from "@/js_sdk/wa-permission/permission.js"
/**
* 获取手机摄像头和图册权限
* */
const cameraAuthority = () =>{
return new Promise(async (rel,rej)=>{
var platform = getApp().globalData.mySystemInfo.osName || 'android';
// console.log(platform)
if(platform == 'ios'){
let camera = permision.judgeIosPermission("camera");//判断ios是否给予摄像头权限
//ios相册没权限,系统会自动弹出授权框
//let photoLibrary = permision.judgeIosPermission("photoLibrary");//判断ios是否给予相册权限
if(camera){
rel();
}else{
rej('需要开启相机使用权限');
}
}else{
let camera = await permision.requestAndroidPermission("android.permission.CAMERA");//判断安卓是否给予摄像头权限
let photoLibrary = await permision.requestAndroidPermission("android.permission.READ_EXTERNAL_STORAGE");//判断安卓是否给予相册权限
if(camera == 0 || photoLibrary == 0){
rej('请同时开启相机和相册的使用权限');
}else if(camera == -1 || photoLibrary == -1){
//永久拒绝
rej(false)
}else{
rel();
}
}
})
}
/**
* 限安卓
* 是否打开了手机定位
* */
const adressOpen = () =>{
return permision.checkSystemEnableLocation();
}
/**
* 限安卓
* 获取位置信息权限
* */
const adressAuthority = () =>{
return new Promise(async (rel,rej)=>{
let adress = await permision.requestAndroidPermission("android.permission.ACCESS_FINE_LOCATION");//判断安卓是否有获取位置信息权限
if(adress == 0){
rej('请开启定位权限');
}else if(adress == -1){
//永久拒绝
rej(false)
}else{
rel();
}
})
}
/**
* 限安卓
* 获取拨打电话权限
* */
const cellPhoneAuthority = () =>{
return new Promise(async (rel,rej)=>{
let adress = await permision.requestAndroidPermission("android.permission.CALL_PHONE");//拨打电话权限
if(adress == 0){
rej('请开启拨打电话权限');
}else if(adress == -1){
//永久拒绝
rej(false)
}else{
rel();
}
})
}
/**
* 跳转到手机开启权限的界面
* */
const permissionSetting = () =>{
permision.gotoAppPermissionSetting();
}
export{
cameraAuthority,
permissionSetting,
adressAuthority,
adressOpen,
cellPhoneAuthority
}