解决getLocation获取当前的地理位置,报错:getLocation:fail auth deny及方法封装

问题描述

在开发微信小程序使用wx.getLocation或uni.getLocation获取当前的地理位置、速度的API时,会弹出如下的授权框,如果用户点了允许,那么就会获取到API提供的latitude纬度、longitude经度、speed速度等,但是点了拒绝就会报错:{errMsg: "getLocation:fail auth deny"},下面就将出错的问题以及开启手动授权的方法给大家介绍一下。

问题一:

如果出现下面的报错,这就说明没有在小程序配置项中设置requiredPrivateInfos。

javascript 复制代码
{errMsg: "getLocation:fail the api need to be declared in the requiredPrivateInfos field in app.json/ext.json"}

解决办法:

如果是uniapp开发就需要到更目录下的manifest.json源码视图下配置,如果是微信小程序原生开发,需要到app.json中进行设置,如下:

javascript 复制代码
"permission": {
			"scope.userLocation": {
	"desc": "你的位置信息将用于小程序位置接口的效果展示"
	}
},
"requiredPrivateInfos": ["chooseLocation", "getLocation"]

将获取地理位置API的接口getLocation放置到requiredPrivateInfos属性中,详细的配置,可以参考这篇文章:https://blog.csdn.net/qq_18798149/article/details/150474651

问题二:

如果出现下面的报错:

javascript 复制代码
{errMsg: "getLocation:fail auth deny"}

这是在一开始概述时候说的,弹出获取位置授权框的时候,你点了拒绝,所有小程序就无法获取当前用户的位置信息,有同学可以使用了uni.getLocation的API什么错误都不显示,千万不要忘了fail回调,错误会在fail中,如下所示:

javascript 复制代码
uni.getLocation({
	type: 'gcj02',
	success: (res) => {
		console.log(res);
	},
	fail: (err) => {
		console.log(err)
	}
})

解决办法:

使用我下面封装的方法,让用户手动开启权限,这个方法是通用性的,因为在微信小程序开发中,会用到很多的权限需要用户进行授权,再去获取别的API授权的时候,也可以使用该方法,更多的权限范围可以看这个文档:https://uniapp.dcloud.net.cn/api/other/authorize.html

javascript 复制代码
export const showAuthorize = ({ scope = 'scope.userLocation', text = '您的位置信息' } = {}) => {
	return new Promise((resolve, reject) => {
		uni.getSetting({
			success: (setting) => {
				if (!setting.authSetting[scope]) {
					uni.showModal({
						title: '提示',
						content: `为了提供更好的服务,请允许小程序获取${text}`,
						confirmText: '去授权',
						success: (modal) => {
							if (modal.confirm) {
								uni.openSetting({
									success: (open) => {
										if (open.authSetting[scope]) {
											uni.showToast({
												icon: 'none',
												title: '授权成功'
											});
											resolve('授权成功');
										} else {
											uni.showToast({
												icon: 'none',
												title: '授权失败'
											});
											reject('授权失败');
										}
									}
								});
							} else {
								reject('授权失败');
							}
						}
					});
				}
			}
		});
	});
};

说明:

showAuthorize 方法接收一个对象;

  • scope:授权范围,可以授权常见的如:scope.userLocation、scope.address、scope.writePhotosAlbum
  • text:授权描述,如:'保存到相册的权限'、'您的位置信息'等

使用:

javascript 复制代码
const getLocation = () => {
	uni.getLocation({
		type: 'gcj02',
		success: (res) => {
			console.log(res);
		},
		fail: async (err) => {
			console.log(err);
			try {
				let res = await showAuthorize({ text: '您的位置信息' });
				getLocation();
			} catch (err) {
				console.log(err);
			}
		}
	});
};

总结:

微信小程序需要用户授权的API还是挺多的,将手动授权的方法进行封装,后期再用的时候,直接调用接口,如果你对该方法封装有更好的建议,欢迎留言讨论。

相关推荐
码云之上20 小时前
小程序 iOS 多输入框焦点乱序脱坑记
ios·微信小程序·taro
Greg_Zhong2 天前
微信小程序 + 腾讯云人体分析:从 0 到 1 实现 AI 抠图打卡合照(细节待更新~)
人工智能·微信小程序·腾讯云·ai抠图-ai打卡拍照
梦想的颜色4 天前
AI 时代小白 VibeCoding 做 APP:UniApp(含 Uni‑X)、Flutter 与 React Native+Expo全维度技术选型对比指南
flutter·react native·app·uniapp·vibecoding·unippx·app产品
java1234_小锋5 天前
【免费】基于Python的微信小程序网约车(打车,在线叫车,移动出行)系统(FastAPI+Vue3) 锋哥原创出品,必属精品
微信小程序·小程序·fastapi·网约车系统·在线叫车系统
拖孩6 天前
用 AI 重解千年观音灵签,做了一个微信小程序,每天摇一摇,命运给你回应
前端·后端·微信小程序
java1234_小锋6 天前
【免费】微信小程序网约车(打车,在线叫车,移动出行)系统(SpringBoot4+Vue3) 锋哥原创出品,必属精品
微信小程序·网约车·在线叫车·移动出行
AI砖家7 天前
AI编程—微信小程序开发规范
微信小程序·小程序·notepad++·ai编程
sam-zy8 天前
微信小程序+ESP8266+Arduino 开发智能插座,有本地OTA功能
微信小程序·小程序
A24207349308 天前
微信小程序开发:常用基础语法与指令详解
微信小程序·小程序·notepad++
梦想的颜色9 天前
UniApp 请求层终极封装:统一拦截、错误处理、多端兼容,结合 Claude Code 高效落地
服务器·uniapp·uni.request·codex·claudecode·ai 辅助开发·uniapp 请求封装