uniapp 如何申请系统权限
在uniapp开发中,如何申请Android和iOS系统的权限?比如相机、地理位置、存储等权限,具体需要调用哪些API?不同平台的配置是否有差异?请求权限时需要注意哪些兼容性问题?能否提供完整的代码示例?
2 回复
在uniapp中,通过uni.authorize方法申请系统权限。例如获取位置权限:
uni.authorize({
scope: 'scope.userLocation',
success() {
console.log('授权成功')
}
})
常用权限scope包括:userLocation(位置)、record(录音)、camera(相机)等。注意需在manifest.json中配置所需权限。
在 UniApp 中申请系统权限(如相机、位置、通知等)通常涉及以下步骤,具体实现需根据目标平台(如 Android、iOS)调整:
1. 配置权限声明
在项目配置文件 manifest.json 中声明所需权限:
{
"app-plus": {
"distribute": {
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>"
]
},
"ios": {
"permissions": {
"摄像头- NSCameraUsageDescription": "用于拍照和扫描二维码",
"位置- NSLocationWhenInUseUsageDescription": "用于获取当前位置"
}
}
}
}
}
- Android:直接在
permissions数组中添加权限标签。 - iOS:需描述权限用途(如
NSCameraUsageDescription),否则审核可能被拒。
2. 动态申请权限(代码实现)
使用 UniApp 的 API 或条件编译调用原生方法:
示例:申请相机权限
// 在页面或方法中调用
function requestCameraPermission() {
// #ifdef APP-PLUS
plus.android.requestPermissions(
['android.permission.CAMERA'],
function(result) {
if (result.deniedAlways.length > 0) {
uni.showToast({ title: '权限被永久拒绝', icon: 'none' });
} else if (result.deniedPresent.length > 0) {
uni.showToast({ title: '本次权限被拒绝', icon: 'none' });
} else {
uni.showToast({ title: '权限已授予', icon: 'success' });
}
},
function(error) {
console.error('申请权限失败:', error);
}
);
// #endif
}
使用 uni.authorize(部分权限支持)
uni.authorize({
scope: 'scope.camera',
success: () => { console.log('授权成功'); },
fail: () => { console.log('授权失败'); }
});
3. 平台差异注意事项
- Android:部分权限需动态申请(API 23+)。若用户拒绝,可引导至设置页手动开启:
plus.runtime.openURL(plus.android.getIntent().getData()); - iOS:权限弹窗仅出现一次。若用户拒绝,需提示手动开启(路径:设置 → 应用 → 权限)。
4. 推荐工具库
对于复杂场景,可使用插件如:
- uni-permission:简化权限申请流程。
总结步骤:
- 声明权限:在
manifest.json中配置。 - 动态申请:通过 API 在运行时请求用户授权。
- 处理结果:根据授权结果引导用户操作。
根据实际需求调整权限类型和提示文案,确保符合各平台审核规范。

