权限

编辑页面

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


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.permissionsandroid.blockedPermissions 键进行配置。

大多数权限会由你在应用中使用的库自动添加,这些库要么通过 config plugins,要么通过包级别的 AndroidManifest.xml 添加。你只需要使用 android.permissions 来添加某个库默认未包含的额外权限。

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

移除由包级别 AndroidManifest.xml 文件添加的权限的唯一方法,是通过 android.blockedPermissions 属性将其屏蔽。为此,请指定完整的权限名称。例如,如果你想移除由 expo-camera 添加的录音权限:

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>

在权限上使用 tools:node 属性之前,你必须先在 <manifest> 上定义 xmlns:tools 属性。

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": "允许 $(PRODUCT_NAME) 访问你的照片。", "savePhotosPermission": "允许 $(PRODUCT_NAME) 保存照片。" } ] ] }
Are you using this library in an existing React Native app?

直接在 Info.plist 文件中添加和修改权限消息值。我们建议直接在 Xcode 中这样做,以便自动补全。

Web

在 Web 上,像 CameraLocation 这样的权限只能在安全上下文中请求。例如,使用 https://http://localhost。这一限制类似于 Android 的清单权限和 iOS 的 Info.plist 使用说明消息,并且是为了增强隐私而强制执行的。

重置权限

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

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