权限
编辑页面
了解如何在应用配置文件中配置和添加权限。
For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.
在开发原生应用时,如果应用需要访问用户设备上可能敏感的信息,例如位置信息或联系人,应用必须先请求用户的权限。例如,要访问用户的媒体库,应用需要运行 MediaLibrary.requestPermissionsAsync()。
在独立应用和开发构建中,权限在通过运行时 JavaScript 代码请求之前,需要先进行原生构建时配置。在 Expo Go 应用中测试项目时则不需要这样做。
如果你没有正确配置或说明原生权限,可能会导致你的应用被拒绝上架或从商店中下架。
Android
权限通过你在 app config 中使用的 android.permissions 和 android.blockedPermissions 键进行配置。
大多数权限会由你在应用中使用的库自动添加,这些库要么通过 config plugins,要么通过包级别的 AndroidManifest.xml 添加。你只需要使用 android.permissions 来添加某个库默认未包含的额外权限。
{ "android": { "permissions": ["android.permission.SCHEDULE_EXACT_ALARM"] } }
移除由包级别 AndroidManifest.xml 文件添加的权限的唯一方法,是通过 android.blockedPermissions 属性将其屏蔽。为此,请指定完整的权限名称。例如,如果你想移除由 expo-camera 添加的录音权限:
{ "android": { "blockedPermissions": ["android.permission.RECORD_AUDIO"] } }
- 查看
android.permissions,了解默认 prebuild template 中包含哪些权限。 - 未提供正当理由而使用 dangerous 或 signature 权限的应用,可能会被 Google 拒绝。提交应用时,请确保遵循 Android permissions best practices。
- 所有可用的 Android
Manifest.permissions。
Are you using this library in an existing React Native app?
修改 AndroidManifest.xml 以排除特定权限:在 <use-permission> 标签中添加 tools:node="remove" 属性,以确保即使它包含在某个库的 AndroidManifest.xml 中也会被移除。
<manifest xmlns:tools="http://schemas.android.com/tools"> <uses-permission tools:node="remove" android:name="android.permission.ACCESS_FINE_LOCATION" /> </manifest>
在权限上使用
tools:node属性之前,你必须先在<manifest>上定义xmlns:tools属性。
iOS
你的 iOS 应用可以向用户请求系统权限。例如,要使用设备的摄像头或访问照片,Apple 要求解释你的应用将如何使用这些数据。大多数包会通过 config plugins 自动提供某个权限的标准说明。这些默认消息很可能需要根据你的具体用例进行定制,应用才能被 App Store 接受。
要设置权限消息,请在你的 app config 中使用 ios.infoPlist 键,例如:
{ "ios": { "infoPlist": { "NSCameraUsageDescription": "此应用使用摄像头扫描活动门票上的条形码。" } } }
这些属性中的许多也可以直接通过添加它们的库所关联的 config plugin 属性进行配置。例如,使用 expo-media-library 时,你可以这样配置照片权限消息:
{ "plugins": [ [ "expo-media-library", { "photosPermission": "允许 $(PRODUCT_NAME) 访问你的照片。", "savePhotosPermission": "允许 $(PRODUCT_NAME) 保存照片。" } ] ] }
- 对 Info.plist 的更改不能通过空中更新(over-the-air)进行更新,它们只会在你提交新的原生二进制文件时部署。例如,使用
eas build。 - Apple 官方的权限消息建议。
- 所有可用的 Info.plist 属性。
Are you using this library in an existing React Native app?
直接在 Info.plist 文件中添加和修改权限消息值。我们建议直接在 Xcode 中这样做,以便自动补全。
Web
在 Web 上,像 Camera 和 Location 这样的权限只能在安全上下文中请求。例如,使用 https:// 或 http://localhost。这一限制类似于 Android 的清单权限和 iOS 的 Info.plist 使用说明消息,并且是为了增强隐私而强制执行的。
重置权限
你通常会希望测试当用户拒绝权限时会发生什么,以确保你的应用能够优雅地响应。在 Android 和 iOS 上,操作系统级别的限制禁止应用多次请求同一权限(你可以想象,如果用户拒绝后还反复被提示授权,这会多么令人烦恼)。要在开发中测试涉及权限的不同流程,你可能需要卸载并重新安装原生应用。
在 Expo Go 中测试时,你可以通过运行 npx expo start,然后在 Expo CLI 终端界面中按 i 或 a 来删除并重新安装应用。