重复申请权限原因:
我的app项目有定位功能,每次首页加载完成会自动获取定位信息,导致app频繁调用权限
解决思路:
首先需要关闭自动获取定位的方法,解决每次进入申请权限问题。利用本地存储,当用户第一次拒绝以后,将拒绝当前时间存储到本地,每次进入app获取本地存储的时间与当前时间对比,来判断要不要再次申请权限。利用uniapp插件手动调起获取权限弹窗,获取定位授权后再手动调用定位方法。
解决方案:
1.关闭首页获取定位方法
我的调用获取位置信息函数在onload里,先注释掉,由于没有用到位置权限,app每次打开不会去申请权限,再使用uniapp插件市场中手动调用权限方法,插件链接App权限判断和提示 - DCloud 插件市场
2.利用插件方法手动调起权限申请
把插件导入项目,项目中会多出permission.js文件,该文件为插件封装的判断权限和一些调起权限申请的方法
在项目首页中引入:
import permision from "@/js_sdk/wa-permission/permission.js"
自己试了一下发现permision中的requestAndroidPermission方法可以调起权限申请,在首页的methods中引入requestAndroidPermission方法
methods: {
async requestAndroidPermission(permisionID) {
var result = await permision.requestAndroidPermission(permisionID)
var strStatus
if (result == 1) {
strStatus = "已获得授权"
//这里判断,如果用户已经定位授权,去调用自己获取位置的方法
this.locations = true;
this.get_area();
} else if (result == 0) {
strStatus = "未获得授权"
//用户拒绝授权,将本次拒绝时间存储到本地
uni.setStorageSync('expirationTime', Date.parse(new Date()) / 1000)
} else {
strStatus = "被永久拒绝权限"
}
this.$refs.popup.close()
}
}
3.每次进入页面检查权限
onReady() {
//获取本地存储
let stor = uni.getStorageSync('expirationTime')
if (stor) {
//超过48小时,移除本地存储
if ((stor + (3600 * 24 * 2)) < Date.parse(new Date()) / 1000) { //过期了
uni.removeStorageSync('expirationTime')
console.log('存储过期了,调用权限');
//插件方法,调起权限权限授权弹窗
this.requestAndroidPermission('android.permission.ACCESS_FINE_LOCATION')
//这个是我自定义的权限使用说明弹窗
this.$refs.popup.open('top')
} else {
//没超过48小时,不做操作
console.log('存储没过期,我还不能调用权限');
}
} else {
console.log('没用检测到本地存储,调用权限');
this.requestAndroidPermission('android.permission.ACCESS_FINE_LOCATION')
this.$refs.popup.open('top')
}
},
实现
1.首次进入app,检查本地存储,没有本地存储,就去发起权限申请,用户同意就手动调用获取位置的方法
2.首次进入app,检查本地存储,没有本地存储,发起权限申请,用户点击拒绝,将拒绝时间存入本地,此时app没有获取定位权限
3.再次进入app,检查本地存储,本地存储存在并且时间没有超过48小时,不调用权限申请,此时app没有获取定位权限
4.再次进入app,检查本地存储,本地存储存超过48小时,删除本地存储,距离上次手动拒绝超过48小时,利用uniapp插件手动发起权限申请,重复第一步操作。实现功能!