用户授权
收藏我的收藏
抖音小程序用户授权是保障用户隐私与功能正常运行的核心机制,开发者需在用户明确同意后才能调用涉及敏感信息的 API 或组件。
授权机制
小程序对用户信息采取严格的分级保护策略,仅在以下场景触发授权流程:
- 1.首次调用:当调用需授权的 API / 组件(如
tt.chooseLocation
)时,首次调用一定会弹出用户授权弹窗。- ◦用户允许:正常执行接口功能。
- ◦用户拒绝:本次调用失败,直接进入接口
fail
回调。- 2.再次调用:
- ◦在用户未手动授权前,再次调用同 API 时不再弹窗,直接触发
fail
回调。- ◦用户可通过小程序授权设置页(右上角「更多 - 设置」)手动修改授权状态,后续调用结果随设置实时更新。
- 3.授权状态存储:
- ◦授权设置仅存储在当前设备当前账号下,与服务器及其他设备无关联。
- ◦更换设备或切换账号需重新触发首次授权流程。
使用场景
基础功能与敏感功能区分
- •无授权场景:浏览信息、查看非个性化内容等基础操作无需授权。
- •需授权场景:涉及用户隐私或设备功能的操作(如定位、摄像头、相册、麦克风、地址等),需用户主动授权后才能使用。
典型业务场景示例
- •生活服务类:通过
scope.userLocation
获取地理位置,推荐附近商家或导航服务。- •社交分享类:使用
scope.hostId
为用户生成带有抖音号水印的分享内容。- •电商购物类:通过
scope.address
获取收货地址,简化订单填写流程。- •多媒体工具类:调用
scope.camera/album/record
实现拍照上传、相册选图或语音输入功能。目标
- 1.掌握授权全流程开发。
- ◦理解首次授权弹窗触发、重复调用逻辑及授权设置页管理机制。
- ◦熟练使用
tt.getSetting
(检查状态)、tt.openSetting
(引导授权)等核心 API。- 2.实现合规的权限交互。
- ◦确保仅在用户使用敏感功能时请求授权,明确告知权限用途(如 “需要摄像头权限以使用扫码功能”)。
- ◦处理用户拒绝授权后的引导逻辑(如跳转设置页手动开启权限)。
- 3.完成授权体系搭建。
- ◦从 “首次触发授权→状态检测→用户引导→功能调用” 形成闭环,适配不同设备 / 账号的授权重置场景。
- ◦解决常见问题(如权限设置页不显示、状态不同步等),保障功能稳定性。
准备工作
- •注册账号并完成认证
- •创建小程序
- •添加协作者/管理员
- •安装抖音开发者工具 IDE
开发步骤
说明
本教程以用户的地理位置权限为例,介绍如何在小程序中实现。
步骤一:全局配置
配置小程序的基本信息(如页面路径、导航栏标题)。
- •在
app.json
中声明地理位置权限 scope.userLocation
,这是使用相关 API 的前提,否则会导致权限申请失败。- •在
app.ttss
中设置小程序的全局样式,为整个小程序定义统一的样式规则, 确保所有页面的视觉风格一致。app.json
app.ttss
{ "pages": ["pages/index/index"], "window": { "navigationBarTitleText": "位置授权示例" }, "requiredPrivateInfos": ["scope.userLocation"] }
步骤二:获取授权状态
- •若已授权,直接获取授权信息及状态,如地理位置权限信息;
- •若未授权,判断是否为首次请求,决定后续流程(首次触发授权弹窗,非首次引导至设置页)。
index.js
index.ttml
Page({ data: { authStatus: null, // 授权状态:null=未检查,true=已授权,false=未授权 checkResult: '' // 检查结果文本 }, // 检查授权状态 checkAuthStatus() { tt.getSetting({ success: (res) => { const authStatus = res.authSetting['scope.userLocation']; this.setData({ authStatus: authStatus, checkResult: authStatus ? '✅ 已授权地理位置' : '❌ 未授权地理位置' }); console.log('授权状态:', authStatus); }, fail: (err) => { console.error('获取授权状态失败', err); this.setData({ checkResult: '⚠️ 检查权限失败,请重试' }); } }); } });
本教程中,此时还未实现地理位置授权,用户无法选择,所以授权状态为 ❌ 未授权地理位置。
步骤三:地理位置授权
- •用户同意后,直接获取位置信息。
- •用户拒绝后,则记录状态,后续引导至设置页。
index.js
index.ttml
// 获取用户位置 getUserLocation() { tt.chooseLocation({ success: (res) => { console.log('位置信息:', res); this.setData({ checkResult: `✅ 位置信息:${res.name}, ${res.address}` }); }, fail: (err) => { console.error('获取位置失败', err); this.setData({ checkResult: '⚠️ 获取位置失败,请重试' }); } }); }
操作结果 | 示例 |
用户同意授权,并选择地理位置后,界面中显示位置信息。 | |
用户同意授权,但未选择地理位置,界面中显示“⚠️ 获取位置失败,请重试”。 | |
用户拒绝后,界面中显示“⚠️ 获取位置失败,请重试”。 |
步骤四:打开授权设置页面
index.js
index.ttml
// 打开授权设置页(直接打开,无提示框) openAuthSetting() { tt.openSetting({ success: (res) => { console.log('用户返回设置页', res.authSetting); // 立即检查授权状态是否更新 this.checkAuthStatus(); }, fail: (err) => { console.error('打开设置页失败', err); this.setData({ checkResult: '⚠️ 无法打开设置页,请重试' }); } }); },
步骤五:再次获取授权状态
本教程中,无需新增代码,复用步骤 1 的
checkAuthStatus
方法,用户从设置页返回后点击「检查授权状态」按钮即可。index.ttml
<button type="primary" bindtap="checkAuthStatus"> 再次检查授权状态 </button>
用户在设置页手动开启权限后,刷新界面显示 “✅ 已授权地理位置”。
最佳实践
- •提前告知用途:在触发授权前,通过弹窗或页面提示明确告知用户权限用途,例如:"需要获取您的地理位置以推荐附近的餐厅"。
- •分场景授权:避免在小程序启动时请求所有权限,应在用户实际使用功能时触发授权。例如:
- ◦首次使用地图功能时请求地理位置授权
- ◦首次上传图片时请求相册授权
- •友好的拒绝提示:当用户拒绝授权时,提供清晰的提示和重新授权的入口,例如:"摄像头权限被拒绝,点击此处重新授权"。
- •权限状态持久化:将用户授权状态存储在本地(如
tt.setStorage
),避免重复检查授权状态。- •兼容不同设备:由于授权状态不会同步到其他设备,需在用户切换设备时重新检查授权。
常见问题
问题 | 原因 | 解决方案 |
授权设置页不显示权限 | 该权限未被首次调用触发过授权弹窗 |
tt.getSetting 检查权限是否已被记录 |
授权状态不同步 | 授权设置仅存储在当前设备当前账号下 |
|
授权弹窗未显示 |
|
tt.getSetting 检查用户是否已授权 |
用户拒绝授权后无法再次弹窗 | 首次拒绝后,重复调用 API 不会再次弹窗 |
|