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

【1】问题描述:

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

【2】前提准备:

  • 小程序已经 申请过 wx.getLocation() :获取当前的地理位置 的服务权限

  • 在小程序的根目录下的 app.json 中配置 requiredPrivateInfos 进行声明启用

    • 在调用 wx.getLocation() 时需要在 app.json 配置 permission 字段,同时使用 scope.userLocation 声明收集用户选择的位置信息 的目(wx.chooseLocation() 接口不需要配置该字段,可以直接进行调用)
    json 复制代码
    {
      "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

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

    javascript 复制代码
    // 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: '您已拒绝授权获取位置信息'
            })
          }
        }
      }
    })
相关推荐
00后程序员张1 小时前
无需 Mac 的 iOS App 上架工具,开心上架Appuploader 负责哪些环节
android·ios·小程序·https·uni-app·iphone·webview
2501_9159090618 小时前
Ipa Guard 防护上架,混淆、重签名和回归测试怎么做
android·ios·小程序·https·uni-app·iphone·webview
鸿蒙开发1 天前
# 代码写完才发现不能上线:微信小程序开发前必须准备的 8 件事
微信小程序·产品经理
李纲明1 天前
微信小程序 web-view 打开空白或提示未配置业务域名:校验文件、HTTPS 与跳转域名排查
前端·微信小程序·https·web-view·小程序开发·业务域名
济南壹软网络科技有限公司1 天前
盲盒源码系统小程序V6MAX底层架构解析,PHP+Uniapp高性能商用底座发布
小程序·架构·uni-app
2501_915918411 天前
iOS 上架注意事项有哪些?Appuploader 的四个阶段自查清单
android·ios·小程序·https·uni-app·iphone·webview
Autumn_ing1 天前
AI原型设计工具怎么选?可编辑原型与可运行前端适合什么场景
前端·小程序·产品经理·代码·codex·墨刀ai客户端·ai原型
fengGer的bugs1 天前
微信小程序实战:本地存储的新生儿喂养记录(原生 + 四套主题 + 疫苗日程)
微信小程序·小程序
Ai-_Man1 天前
我需要批量导出Poe左边栏所有对话,而不是一条具体的对话内容,你们AI导出鸭可以吗?
开发语言·前端·javascript·人工智能·小程序
青企通1 天前
二手交易小程序的担保交易:资金托管、状态机与争议处理
小程序