权限
编辑
了解如何在应用配置文件中配置和添加权限。
在开发需要访问用户设备上潜在敏感信息的原生应用时,例如用户的位置或联系人,应用必须首先请求用户的权限。例如,要访问用户的媒体库,应用需要运行 MediaLibrary.requestPermissionsAsync()。
独立和开发构建中的权限在请求之前需要进行原生构建时配置,才能使用运行时 JavaScript 代码进行请求。在 Expo Go 应用中测试项目时不需要此配置。
如果您没有正确配置或解释原生权限,可能会导致您的应用被拒绝或从商店下架。
安卓
权限通过 android.permissions 和 android.blockedPermissions 键在您的 应用配置 中进行配置。
大多数权限是由您在应用中使用的库自动添加的,使用 配置插件 或包级 AndroidManifest.xml。您只需使用 android.permissions 来添加库中默认未包含的额外权限。
{ "android": { "permissions": ["android.permission.SCHEDULE_EXACT_ALARM"] } }
移除由包级 AndroidManifest.xml 文件添加的权限的唯一方法是通过 android.blockedPermissions 属性来阻止它们。为此,请指定 完整权限名称。例如,如果您想要移除 expo-av 添加的音频录制权限:
{ "android": { "blockedPermissions": ["android.permission.RECORD_AUDIO"] } }
- 请参阅
android.permissions了解默认 预构建模板 中包含哪些权限。 - 使用 dangerous 或 signature 权限而没有有效理由的应用 可能会被 Google 拒绝。在提交应用时,请确保遵循 Android 权限最佳实践。
- 所有可用的 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>
在
<manifest>上定义xmlns:tools属性后,才能在权限上使用tools:node属性。
iOS
你的 iOS 应用可以向用户请求系统权限。例如,使用设备的相机或访问照片,Apple 需要对应用如何使用这些数据进行解释。大多数包会自动为给定权限提供一个模板化的原因,使用 config plugins。这些默认消息很可能需要根据你应用的具体使用场景进行定制,才能被 App Store 接受。
要设置权限提示信息,请在你在 app config 中使用 ios.infoPlist 键,例如:
{ "ios": { "infoPlist": { "NSCameraUsageDescription": "此应用使用相机扫描活动门票上的条形码。" } } }
这些属性中的许多也可以直接通过与之相关的库的 config plugin 的属性来进行配置。 例如,使用 expo-media-library 时,您可以这样配置照片权限信息:
{ "plugins": [ [ "expo-media-library", { "photosPermission": "Allow $(PRODUCT_NAME) to access your photos.", "savePhotosPermission": "Allow $(PRODUCT_NAME) to save photos." } ] ] }
- 对 Info.plist 的更改无法通过空投更新,它们只有在提交新的原生二进制文件时才会部署。例如,使用
eas build。 - Apple 官方的权限消息推荐。
- 所有可用的 Info.plist 属性.
Are you using this library in an existing React Native app?
直接在 Info.plist 文件中添加并修改权限值。我们建议直接在 Xcode 中进行,以获得自动补全。
Web
在网页端,像 Camera 和 Location 这样的权限只能从 安全上下文 请求。例如,使用 https:// 或 http://localhost。这一限制类似于 Android 的清单权限以及 iOS 的 Info.plist 使用提示,并且是为了提升隐私保护而强制执行的。
重置权限
通常你希望能够测试当用户拒绝权限时会发生什么,以确保你的应用能优雅地做出反应。Android 和 iOS 的操作系统级别权限限制都禁止应用程序对同一权限请求超过一次(你可以想象在用户拒绝权限后被反复提示权限会有多烦人)。在开发中测试涉及权限的不同流程时,可能需要卸载并重新安装原生应用。
在测试 Expo Go 时,你可以删除应用并通过运行 npx expo start 并在 Expo CLI 终端界面中按 i 或 a 重新安装。