权限

编辑

了解如何在应用配置文件中配置和添加权限。


在开发需要访问用户设备上潜在敏感信息的原生应用时,例如用户的位置或联系人,应用必须首先请求用户的权限。例如,要访问用户的媒体库,应用需要运行 MediaLibrary.requestPermissionsAsync()

独立和开发构建中的权限在请求之前需要进行原生构建时配置,才能使用运行时 JavaScript 代码进行请求。在 Expo Go 应用中测试项目时不需要此配置。

如果您没有正确配置或解释原生权限,可能会导致您的应用被拒绝或从商店下架

安卓

权限通过 android.permissionsandroid.blockedPermissions 键在您的 应用配置 中进行配置。

大多数权限是由您在应用中使用的库自动添加的,使用 配置插件 或包级 AndroidManifest.xml。您只需使用 android.permissions 来添加库中默认未包含的额外权限。

app.json
{ "android": { "permissions": ["android.permission.SCHEDULE_EXACT_ALARM"] } }

移除由包级 AndroidManifest.xml 文件添加的权限的唯一方法是通过 android.blockedPermissions 属性来阻止它们。为此,请指定 完整权限名称。例如,如果您想要移除 expo-av 添加的音频录制权限:

app.json
{ "android": { "blockedPermissions": ["android.permission.RECORD_AUDIO"] } }
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 键,例如:

app.json
{ "ios": { "infoPlist": { "NSCameraUsageDescription": "此应用使用相机扫描活动门票上的条形码。" } } }

这些属性中的许多也可以直接通过与之相关的库的 config plugin 的属性来进行配置。 例如,使用 expo-media-library 时,您可以这样配置照片权限信息:

app.json
{ "plugins": [ [ "expo-media-library", { "photosPermission": "Allow $(PRODUCT_NAME) to access your photos.", "savePhotosPermission": "Allow $(PRODUCT_NAME) to save photos." } ] ] }
Are you using this library in an existing React Native app?

直接在 Info.plist 文件中添加并修改权限值。我们建议直接在 Xcode 中进行,以获得自动补全。

Web

在网页端,像 CameraLocation 这样的权限只能从 安全上下文 请求。例如,使用 https://http://localhost。这一限制类似于 Android 的清单权限以及 iOS 的 Info.plist 使用提示,并且是为了提升隐私保护而强制执行的。

重置权限

通常你希望能够测试当用户拒绝权限时会发生什么,以确保你的应用能优雅地做出反应。Android 和 iOS 的操作系统级别权限限制都禁止应用程序对同一权限请求超过一次(你可以想象在用户拒绝权限后被反复提示权限会有多烦人)。在开发中测试涉及权限的不同流程时,可能需要卸载并重新安装原生应用。

在测试 Expo Go 时,你可以删除应用并通过运行 npx expo start 并在 Expo CLI 终端界面中按 ia 重新安装。