微信小程序:用户拒绝小程序获取当前位置后的处理办法

embedded/2025/3/23 18:39:58/

【1】问题描述:

  • 小程序在调用 wx.getLocation() 获取用地理位置时,如果用户选择拒绝授权,代码会直接抛出错误。如果再次调用 wx.getLocation() 时,就不会在弹窗询问用户是否允许授权。导致用户想要重新允许获取地理位置时,没有途径。

【2】前提准备:

  • 小程序已经 申请过 wx.getLocation() :获取当前的地理位置 的服务权限
  • 小程序的根目录下的 app.json 中配置 requiredPrivateInfos 进行声明启用
    • 在调用 wx.getLocation() 时需要在 app.json 配置 permission 字段,同时使用 scope.userLocation 声明收集用户选择的位置信息的目(wx.chooseLocation() 接口不需要配置该字段,可以直接进行调用)
    
    {"requiredPrivateInfos": ["getLocation"],"permission": {"scope.userLocation": {"desc": "获取用户位置信息用于填写收货地址"}}
    }
    

【3】解决思路:

  • 与直接调用 wx.getLocation()不同, 我们需要优化授权的流程:

    1. 用户进入到需要授权地理位置的页面,首先使用 wx.getSetting() 获取用户所有的授权信息,查询是否已经授权地理位置信息。wx.getSetting() 返回一个 authSetting 对象,对象只会包含小程序已经向用户请求过的权限,以及授权结果。
    2. 在 authSetting 对象 中,authsetting['scope.userLocation'] 的返回值表示是否已经授权获取地理位置的信息:
      • 返回 true:用户之前已经允许小程序获取用户的地理位置信息,直接用 wx.getLocation() 获取用户位置信息即可
      • 返回 false:用户已经拒绝授权访问地理位置信息
      • 返回 undefined:用户即没有同意也没有拒绝,可以用 wx.getLocation() 方法,微信小程序将会显示弹框,询问用户是否允许小程序获取地理位置
    3. 如果用户之前已经拒绝获取地理位置信息,现在小程序需要该信息时,可以使用 wx.showModal() 弹出一个弹框,询问用户是否进行授权
    4. 当用户允许授权是,通过 wx.openSetting() 调起微信客户端小程序设置界面,用户可以进行设置权限。

注意事项:

  1. 如果希望用户再次授权,就需要让用户进行 手动开启授权
  2. wx.openSetting() 必须用户发生点击行为后,才可以跳转到设置页进行授权信息管理。

【4】代码:

  1. index.wxml

    <button type="primary" bind:tap="getUserPosition">获取用户地理位置信息</button>
    
  2. index.js

    // index.js
    Page({async getUserPosition() {const {  authSetting } = await wx.getSetting()if (authSetting['scope.userLocation'] === false) {// 用户之前已经拒绝授权,现在希望能够再次授权// 使用对话框提示用户进行授权wx.showModal({title: '授权提示',content: '需要获取地理位置信息,请确认授权',complete: async ({ confirm, cancel }) => {if (confirm) {const {authSetting} = await wx.openSetting()// 用户再次拒绝授权if (!authSetting['scope.userLocation']) {wx.showToast({icon: 'none',title: '授权失败'})return}// 已经允许获取位置信息const res = await wx.getLocation()console.log(res);} else {wx.showToast({icon: 'none',title: '您已拒绝授权'})}},})} else {try {const res = await wx.getLocation()console.log(res);} catch (error) {console.log(error);wx.showToast({icon: 'none',title: '您已拒绝授权获取位置信息'})}}}
    })
    

http://www.ppmy.cn/embedded/174585.html

相关文章

WPF 中的 GridSplitter 详解

1. 什么是 GridSplitter&#xff1f; GridSplitter 是 WPF 提供的一个控件&#xff0c;用于调整 Grid 布局的行或列的大小。它可以让用户在运行时拖动分隔线&#xff0c;以改变相邻的行或列的大小&#xff0c;而不需要修改 XAML 代码。 2. GridSplitter 的基本用法 &#xff…

maven使用install将jar包编译到本地仓库管理

要install的jar包 mvn install:install-file -DgroupIdcn.qiufeng -DartifactIdDJGenHsmAPI -Dversion3.1.0d -Dpackagingjar -DfileDJGenHsmAPI-3.1.0d.jar 重点是版本号必须使用编译后的版本号 发布成功后

gitlab将本地项目提交到远程dev分支

获取Git路径 首先从远程获取到git路径&#xff0c;将给的git地址进行克隆到本地文件&#xff1b; git clone http:************.git 按照git地址的文件路径将本地项目&#xff0c;拷贝到目标文件中 在该路径中&#xff0c;初始化命令&#xff1b; # 初始化项目 git init #…

MySQL:8.0- timestamp默认值允许‘0000-00-00 00:00:00‘

MySql 8.0中输入代码&#xff1a; alter table kingbal_com add column create_date timestamp not null default 0000-00-00 00:00:00; 报错&#xff0c;提示默认时期格式0000-00-00 00:00:00有误。 解决办法&#xff1a; 1&#xff09; select sql_mode; -- 查看全局sql…

Android第四次面试(Java基础篇)

一、Java 中的 DCL 单例模式 单例模式是设计模式中最常用的模式之一&#xff0c;其核心目标是确保一个类在程序中仅有一个实例&#xff0c;并提供全局访问点。在 Java 中&#xff0c;实现单例模式需要兼顾线程安全和性能优化。DCL&#xff08;Double-Checked Locking&#xff0…

2025年智能系统、自动化与控制国际学术会议(ISAC 2025)

重要信息 2025 International Conference on Intelligent Systems, Automation and Control 2025年3月28-30日 | 中国西安理工大学 | 会议官网&#xff1a; www.icisac.org 简介 在国家大力推动高质量发展与创新驱动战略的背景下&#xff0c;智能制造与自动化控制行业正迎…

Microchip AN1477中关于LLC数字补偿器的疑问

最近在学习Microchip的AN1477关于LLC的功率级传递函数推导及数字补偿器设计&#xff0c;对其中的2P2Z数字补偿器的系数有一些困惑。我在MATLAB中运行了源程序提供的VMC_LLC.m文件&#xff0c;发现有些地方和AN1477中的结果不一致。现在把相关有疑问的地方列举出来&#xff0c;也…

【Linux】Makefile秘籍

> &#x1f343; 本系列为Linux的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:【小编的个人主页】 >小编将在这里分享学习Linux的心路历程✨和知识分享&#x1f50d; >如果本篇文章有问题&#xff0c;还请多多包涵&a…