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

需求

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

实现

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 = resif (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 () => {// 判断用户是否获取定位权限//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方法,再次进行判断。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/733878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java网络编程】TCP核心特性(下)

1. 拥塞控制 拥塞控制:是基于滑动窗口机制下的一大特性,与流量控制类似都是用来限制发送方的传送速率的 区别就在于:"流量控制"是从接收方的角度出发,根据接收方剩余接收缓冲区大小来动态调整发送窗口的;而…

深入分析Java线程池——ThreadPoolExecutor

文章目录 Java 线程池概述ThreadPoolExecutor 构造方法线程池拒绝策略工作流程并发库中的线程池CachedThreadPoolFixedThreadPoolSingleThreadExecutorScheduledThreadPool ThreadPoolExecutor 源码分析线程池状态表示获取 runState获取 workerCount生成 ctl 提交任务 execute(…

漫谈技术成长

引言 相信很多程序员在自己的技术成长之路上,总会遇到许许多多的难关,有些难关咬咬牙就过去了,而有点难关则需要有一定的能力,才能克服。因此,本文主要围绕“技术成长” 话题,为何会选择技术方向&#xff0…

开源的Java图片处理库介绍

在 Java 生态系统中,有几个流行的开源库可以用于图片处理。这些库提供了丰富的功能,如图像缩放、裁剪、颜色调整、格式转换等。以下是几个常用的 Java 图片处理库的介绍,包括它们的核心类、主要作用和应用场景,以及一些简单的例子…

Normalizer(归一化)和MinMaxScaler(最小-最大标准化)的区别详解

1.Normalizer(归一化)(更加推荐使用) 优点:将每个样本向量的欧几里德长度缩放为1,适用于计算样本之间的相似性。 缺点:只对每个样本的特征进行缩放,不保留原始数据的分布形状。 公式…

微分学<4>——微分中值定理

索引 微分中值定理极值定义4.1 极大(小)值定理4.1 Fermat引理定理4.2 Rolle定理 Lagrange中值定理定理4.3 Lagrange中值定理定理4.4 Cauchy中值定理 导数对函数性质的刻画Jensen不等式 微分中值定理 极值 定义4.1 极大(小)值 若存在 x 0 x_{0} x0​的邻域 U ( x 0 , δ ) U\…

C语言指针从入门到基础详解(非常详细)

1.内存和地址 我们知道电脑中的CPU在处理数据的时候需要在内存中读取数据处理后的数据也会放在内存中。把内存划分为一个个的内存单元每个单元的大小是一个字节。每个字节都有它对应的编号也就是它的地址,以便CPU可以快速的找到一个内存空间。C语言中我们把地址叫做…

MySQL-锁:共享锁(读)、排他锁(写)、表锁、行锁、意向锁、间隙锁,锁升级

MySQL-锁:共享锁(读)、排他锁(写)、表锁、行锁、意向锁、间隙锁 共享锁(读锁)、排他锁表锁行锁意向锁间隙锁锁升级 MySQL数据库中的锁是控制并发访问的重要机制,它们确保数据的一致性…

2024 年 React学习笔记(一)

MacOs 配置环境 brew 安装nvm 安装create-react-app 安装 代码配置如下 # 安装 nvm brew install nvm # 安装 create-react-app npm install -g create-react-app # 初始化项目 npx create-react-app react-basic

ELK日志中心搭建(六)- harbor镜像仓库

CentOS 搭建 Harbor 镜像仓库(图文详解)_centos harbor-CSDN博客

SQL中常见的DDL操作及示例,数据库操作及表操作

目录 一、数据库操作 1、创建数据库 2、查看所有数据库 3、使用数据库 4、删除数据库 二、表操作: 1、创建表 2、查看表结构 3、修改表结构 3.1 添加列 3.2 修改列数据类型 3.3 修改列名 3.4 删除列 3.5 修改表名 3.6 删除表 注意: 在数…

C语言指针面试习题详解

1.如下代码中,输出的内容是什么 int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1); printf("%d,%d", *(a 1), *(ptr - 1));return 0; } &a中,a代表整个数组吗,&a 1代表跳过一整个数组后的地址&a…

数字化解决方案的设计与实现:提升业务效率与用户体验

摘要:随着数字化时代的到来,越来越多的企业和组织开始寻求数字化解决方案来提升业务效率和改善用户体验。本文将探讨数字化解决方案的设计与实现过程,并介绍一些关键的技术和策略。 ## 引言 在当今竞争激烈的商业环境中,企业和组…

vue,pinia,state备忘

介绍 在大多数情况下,state 都是 store的核心,项目一般都是优先定义能代表他们APP的state,在pinia中,state 被定义为一个返回初始状态的函数,这使得Pinia可以同时支持服务端和客户端。 import { defineStore } from piniaconst …

安卓kotlin面试题 61-70

61. Kotlin中顶层函数、中缀函数、解构声明的实质原理?1、顶层函数 顶层文件会反编译成一个容器类。(类名一般默认就是顶层文件名+”Kt”后缀,注意容器类名可以自定义) 顶层函数会反编译成一个static静态函数,如代码中的formateFileSize和main函数 注意: 通过Kotlin中的@fil…

每日shell脚本之自动化备份数据库周期性灾备

每日shell脚本之自动化备份数据库周期性灾备 使用本脚本前在服务器安装 物理备份工具-xtrabackup #!/usr/bin/bash #CSDN :M乔木 #Email:2776617348qq.com #解释器:这是一个shell脚本 #数据库用户密码 user数据库用户 passwd数据库密码#检查备份情况 bm…

C++笔记之在成员函数中打印出对象名

C++笔记之在成员函数中打印出对象名 —— 杭州 2024-03-10 code review! MyClass.h #ifndef MYCLASS_H #define MYCLASS_H#include <string>// 类声明 class MyClass {private

Unity 轮转图, 惯性, 自动回正, 点击选择

简单的实现 2D 以及 3D 的轮转图, 类似于 Web 中无限循环的轮播图那样. 文中所有代码均已同步至 github.com/SlimeNull/UnityTests 3D 轮转图: Assets/Scripts/Scenes/CarouselTestScene/Carousel.cs2D 轮转图: Assets/Scripts/Scenes/CarouselTestScene/UICarousel.cs 主要逻…

华为OD机试真题-按身高和体重排序

华为OD机试真题-按身高和体重排序 题目描述&#xff1a; 某学校举行运动会&#xff0c;学生们按编号(1、2、3...n)进行标识&#xff0c;现需要按照身高由低到高排列&#xff0c;对身高相同的人&#xff0c;按体重由轻到重排列;对于身高体重都相同的人&#xff0c;维持原有的编…

HashMap的底层实现

1、1.7版本的底层实现 HashMap在1.7版本中数据结构是数组链表&#xff0c; 1.1 put方法 put方法中操作步骤&#xff1a; &#xff08;1&#xff09;、对key计算相应的hash值&#xff0c;然后通过hash & table.length-1计算可以获得到在hash表中中相应的桶位置&#xff…