微信、企微小程序使用taro对位置权限进行处理

1.功能

当用户未授权地理位置权限时,引导用户开启地理位置权限,区别于之前的uni处理,uni的处理 的处理没有手机系统关闭位置权限的处理,但是uni文章中对于打开位置权限后重新返回小程序有做权限重获取,当前文章未做处理

==========后续补充
最好不要使用自定义弹窗,而是使用微信的原生弹窗,而且这个提示不属于业务层面提示,属于系统提示,使用官方弹窗看起来更正式一些(除非一定要保持弹窗风格一致,这样就要接受 ui暂停执行以及canvas层级最高遮盖弹窗问题)
否则安卓小程序存在 打开设置执行后,小程序的代码会暂停执行,从设置页返回小程序的时候会出现弹窗闪一下(即弹窗的关闭在从设置页返回后才继续执行,即在进入设置页哪一刻 代码执行未暂停,但是ui更新是暂停了的),并且打开设置的代码由于之前有人恶意打开导致微信修改规则必须用户点击后才能打开设置(只能同步执行,不能延时,延时会被判定用户未点击小程序
并且如果在弹窗使用地方有canvas图表则会有覆盖到弹窗遮罩增问题
ios并不会出现这个问题是因为ios打开设置时有一个过渡动画,从app跳转的设置页的过渡过程还未暂停ui执行,当彻底切换到设置里面时ui会暂停执行,可以自己用轮播图或者一个gif图片进行测试,如果切换后台到其他app进行任务预览可以发现轮播图不轮播,gif图片不执行

安卓ui执行暂停图
image

2.无授权情况分为(截图示例为iphone手机)

2.1 手机系统未开启位置授权 无法通过代码跳转到该设置页面

image

2.2 微信、企微App未授权 可以通过代码跳转设置页面

image
image

2.3 小程序未授权 可以通过代码跳转设置页面

image

3.代码

其中$dialog为提示框,具有确认取消按钮,点击后会执行对应逻辑可以换成对应项目的组件

async function checkAndAuthLocationAuth(): Promise<boolean> {
return new Promise(async (resolve, reject) => {
const systemRes = await taro.getSystemInfo()
if (!systemRes.locationEnabled) {
$dialog({
title: '提示',
render: () => '当前系统,未开启定位权限,请在设置中开启系统定位权限!',
cancelButton: true,
confirmButton: true,
handleConfirm: async () => {
}
})
return reject(false)
} else {
const appAuthorizeSetting = await taro.getAppAuthorizeSetting()
const appAuthObj = {
title: '提示',
render: () =>
'当前App未开启定位权限,请在设置中开启App定位权限!',
cancelButton: true,
confirmButton: true,
handleConfirm: async () => {
taro.openAppAuthorizeSetting({})
}
}
switch (appAuthorizeSetting.locationAuthorized) {
case 'authorized':
const wxMiniSetting = await taro.getSetting()
if (wxMiniSetting.authSetting['scope.userLocation']) {
// 成功获取后你可以直接根据项目业务需求决定此处是否直接获取经纬度等
return resolve(true)
}else if (wxMiniSetting.authSetting['scope.userLocation'] === undefined) {
const authRes = await taro.authorize({ scope: 'scope.userLocation' })
if (authRes.errMsg === 'authorize:ok') {
// 成功获取后你可以直接根据项目业务需求决定此处是否直接获取经纬度等
resolve(true)
} else {
// 拒绝后这里可以直接再次提示以及一些业务逻辑处理
}
}
else {
$dialog({
title: '提示',
render: () =>
'您的账号尚未获取或已拒绝“获取位置信息”,暂时无法使用该功能,是否确认授权?',
cancelButton: true,
confirmButton: true,
handleConfirm: async () => {
taro.openSetting({})
},
})
}
return reject(false)
case 'denied':
$dialog(appAuthObj)
return reject(false)
case 'not determined':
$dialog(appAuthObj)
return reject('')
default:
break;
}
}
})
}

使用示例

await checkAndAuthLocationAuth()
// 业务逻辑 如果未成功获取则不会走到业务逻辑代码中
...
...
// 业务逻辑结束
posted @   story.Write(z)  阅读(160)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示