uniapp 拉起授权 (兼容拒绝后重新开启权限)

本文讲述了在uniapp中,如何处理用户拒绝写入照片库权限后,通过在`authorize`的`fail`回调中巧妙使用`openSetting`和`confirm`实现设置界面重置权限的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

uniapp 获取用户权限的时候 如果不小心点击了取消权限就会发现,第二次无论怎么点击都无法重新拉起授权界面的按钮;

>(获取用户权限除外  getUserProfile  getUserinfo 无论拒绝还是同意每一次都能重新拉起授权)

拒绝授权后就必须进入设置中开启授权,那么怎么直接在小程序中直接跳转设置界面重新打开这一项权限呢?

使用openSetting函数

但是如果你直接在外部(authorize函数得外部)调用openSetting函数 你会发现进入的设置的界面里 没有你需要的重新打开的权限  !!!

这里就是一个则恶心的坑!反正我是搞了老半天才发现的  openSetting拉起设置界面打开某一项拒绝授权的权限时,必须在拉起这项权限的 authorize 函数中的 fail 函数   中使用openSetting函数,且使用这个函数也必须使用一个confirm 方法进行包裹提示!!

代码如下:

pullAuth() {
			// 读取 小程序已经授权的权限
			uni.getSetting({
				success(res) {
					// 判断是否拥有此权限进行拉起授权  和 重新授权功能
					if (!res.authSetting['scope.writePhotosAlbum']) {
						// 未授权此项权限 拉起授界面
						uni.authorize({
							scope: 'scope.writePhotosAlbum',
							success() {
								// 授权成功后 就可以执行 需要权限的  操作函数了
								//在这里调用uni.saveImageToPhotosAlbum(OBJECT)
								// 使用已授权的功能
								uni.showToast({
									title: '可以使用系统相册存储权限',
									icon: 'success'
								});
							},
							fail(err) {
								/*
								 第一次拒绝授权后必须在 uni.authorize的fail中使用
								 uni.openSetting 才能进入设置界面打开授权按钮
								 */
								uni.showToast({
									title: '拒绝授权',
									icon: 'none'
								});
								// 这里必须经过一个confirm 不然也会出现问题(啥问题我也不知道)
								uni.showModal({
									title: '是否重新授权系统相册的存储功能',
									success(res) {
										if (res.confirm) {
											uni.openSetting({
												success() {
													console.log('开启权限成功');
												},
												fail() {
													console.log('开启权限失败');
												}
											});
										} else if (res.cancel) {
											console.log('拒绝开启开启权限');
										}
									}
								});
							}
						});
					} else {
						//在这里调用uni.saveImageToPhotosAlbum(OBJECT)
						// 使用已授权的功能
						uni.showToast({
							title: '已经授权系统相册存储权限'
						});
					}
				}
			});
		}

### 实现 UniApp 中调用 API 打开手机通讯录权限设置页面 在 UniApp 应用开发过程中,为了能够访问用户的联系人信息,在某些情况下可能需要引导用户前往应用的权限管理界面来开启相应的权限。对于 Android 和 iOS 平台而言,可以通过不同的方式实现这一功能。 #### 对于 Android 设备: Android 提供了一个特定的方法用于跳转到应用程序详情页,从而让用户可以在那里调整权限设置。这通常涉及到启动一个新的 Intent 来指向 `ACTION_APPLICATION_DETAILS_SETTINGS` 的 Uri 数据[^1]。 ```javascript if (uni.getSystemInfoSync().platform === 'android') { const intent = "package:" + plus.runtime.packageName; plus.runtime.openURL('intent:#Intent;action=android.settings.APPLICATION_DETAILS_SETTINGS;data=' + encodeURIComponent(intent) + ';end'); } ``` 这段代码会检测当前运行环境是否为安卓平台,如果是,则构建并执行一个意图(Intent),该意图将会把用户带到指定包名的应用程序详细信息页面,在这里他们可以选择修改包括电话簿在内的各种权限。 #### 对于 iOS 设备: iOS 上并没有直接提供类似的快捷路径去往单个 App 的具体权限配置项,但是可以利用系统的隐私设置链接让用户体验更友好地找到位置服务等重要权限的位置。然而针对联系人的特殊处理,开发者论坛建议使用私有 URL Scheme 方式尝试唤起系统设定中的对应条目。 ```javascript else if (uni.getSystemInfoSync().platform === 'ios') { try { plus.runtime.openURL('app-settings:'); } catch(e){ console.error("Failed to open settings", e); } } ``` 此部分逻辑同样先判断设备类型,当确认为苹果产品线之后,尝试通过标准 URI scheme (`app-settings:`) 导航至通用设置菜单;虽然这不是最理想的解决方案因为并不是精确导航到联系人授权选项,但在实际操作中已被证明有效帮助用户到达适当的地方完成必要的更改。 综上所述,上述两种方案分别适用于不同操作系统下的情况,实现了从 UniApp 内部指引用户进入各自的操作系统级别的权限控制面板的目的,以便其能顺利授予或撤销对本应用读本地联系人数据的权利。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值