小工具知识网

当前位置: 首页 > 行业知识 > uniapp小程序获取位置权限(不允许拒绝)

行业知识

uniapp小程序获取位置权限(不允许拒绝)

2026-11-07 12:48:26 来源:互联网转载

需求

小程序上如果需要一些定位功能,那么我们需要提前获取定位权限。我们页面的所有功能后续都需要在用户同意的前提下进行,所以一旦用户点了拒绝,我们应该给予提示,并让用于修改为允许。

实现

1.打开手机GPS

经过测试发现即使手机GPS没有打开,小程序依旧可以获取定位信息。

const { locationEnabled } = uni.getSystemInfoSync()if (!locationEnabled) {  uni.showToast({    title: '该功能需要手机定位,请打开手机定位后重新进入!',  })  return}

2.获取小程序定位权限

  1. 首先我们检查用户是否开启了该权限
    //传一个权限key,则返回true,false判断是否有该权限//传一个权限key的数组,返回没有打开的权限列表export async function authIsPass (authValue: string | string[]) {  try {    const res = await new Promise((resolve, reject) => {      uni.getSetting({        success: (res) => {          resolve(res)        },        fail: (err) => {          reject(err)        },      })    })    const { authSetting }: any = res    if (typeof authValue === 'string') {      if (authSetting[authValue]) {        return true      } else {        return false      }    }    if (Array.isArray(authValue)) {      let noPassList: string[] = authValue.filter((key: string) => !authSetting[key])      if (noPassList.length > 0) {        return noPassList      } else {        return []      }    }  } catch (err) {    return false  }}
    因为抽离成了公共方法,所以会复杂一些,主要就是调用uni.getSetting获取到所有的设置权限,然后判断自己所需要的权限是否开启。

3.进行权限获取

uni.authorize({  scope: 'scope.userLocation',  fail: (res) => {    uni.showModal({      title: '使用该功能必须允许位置服务,是否重新授权?',      showCancel: false,      success: ({ confirm }) => {        if (confirm) {          uni.openSetting({            success() {              //重新获取权限并判断              console.log('开启权限成功')            },            fail() {              console.log('开启权限失败')            },          })        }      },    })  },  success: () => {    //重新获取权限并判断  },})

上面代码主要依靠uni.showModal方法进行权限获取,如果你之前拒绝过该权限,则直接走fail回调,如果同意则走success回调。拒绝之前使用uni.showModal进行权限提示,并且在确定按钮绑定uni.openSetting方法重新进行权限设置。

完整逻辑

const setLocationAuth = async () => {  const { locationEnabled } = uni.getSystemInfoSync()if (!locationEnabled) {  uni.showToast({    title: '该功能需要手机定位,请打开手机定位后重新进入!',  })  return}  // 判断用户是否获取定位权限  //authIsPass方法就是上面步骤2的方法  const flag = await authIsPass('scope.userLocation')  if (!flag) {    uni.authorize({      scope: 'scope.userLocation',      fail: (res) => {        uni.showModal({          title: '使用该功能必须允许位置服务,是否重新授权?',          showCancel: false,          success: ({ confirm }) => {            if (confirm) {              uni.openSetting({                success() {                  setLocationAuth()                  console.log('开启权限成功')                },                fail() {                  console.log('开启权限失败')                },              })            }          },        })      },      success: () => {        setLocationAuth()      },    })    return  }  //获取到定位权限后的操作}setLocationAuth()

上面方法,是在vue3 + ts的环境执行的。进入页面就会立即执行setLocationAuth方法,然后走获取权限的逻辑。如果用户点击拒绝则会弹出提醒,用户点击确定按钮后会跳到权限设置页面进行重新设置。无论他选择了允许还是不允许,重新回到页面都会重新执行setLocationAuth方法,再次进行判断。

上一篇:打印服务器的格式怎么更改?

下一篇:代码怎么放到云服务器?