当你开发一个具有高级功能的移动应用程序时,你很可能需要得到用户的许可。
为了保护用户,应用程序不应该能够直接访问用户的相机、麦克风、位置等。我们需要尊重用户的隐私,在采集和存储照片、音频和视频时要寻求许可。
让我们在Facebook上检查一下,看看摄像头权限的例子。你对这些警报很熟悉,对吗?

为了能够充分展示你的应用程序,你的用户必须给予许可。但如果用户拒绝了呢?正如你可能猜到的,你不能提供这个功能。因此,权限是必不可少的。
如果我们正在开发一个照片编辑应用程序呢?解决办法很简单:我们需要获得他们的许可来访问他们的数据。在这篇文章中,我们将深入探讨权限,以及我们如何通过使用zoontek的react-native-permissions库在React Native中获得权限。
React-native-permissions库
不幸的是,React Native并不支持获取权限。幸运的是,有一个流行的第三方库我们可以使用。Mathieu Acthernoene的 react-native-permissions 库。
让我们假设我们想询问相机的权限。步骤很容易做到。
首先,确保你将这个库添加到项目中。
$ npm install --save react-native-permissions
--or--
$ yarn add react-native-permissions
然后,一定要在文件的顶部写上你要处理这些权限的地方,从而导入这个库。
import * as permissions from 'react-native-permissions';
// you may also import just the functions or constants that you will use from this library
import {request, PERMISSIONS} from 'react-native-permissions';
react-native-permissions for iOS devices
-
请确保将所有需要的权限添加到你的应用程序的
Podfile,并运行此命令:pod install- CocoaPods是一个用于Swift和Objective-C Cocoa项目的依赖管理器。
Podfile是一个规范,描述了一个或多个Xcode项目的目标的依赖性。运行pod install,可以帮助你安装这些依赖性。你可以在这里查看CocoaPods来阅读更多内容。
- CocoaPods是一个用于Swift和Objective-C Cocoa项目的依赖管理器。
→ 在我们的例子中,我们将添加
pod 'Permission-Camera', :path => "#{permissions_path}/Camera"
到Podfile 并运行pod install 。
- 用想要的权限使用说明更新
Info.plist。你可以通过两种方式实现这一点;选择适合你的方式。
选项1:Xcode
- 打开 "信息 "部分
- 添加一个新行
- 从选项中选择你想要的权限作为一个键
- 为该键添加值
→ 在我们的案例中,我们将选择隐私 - 相机使用说明。

选项2:文本编辑器
- 打开
Info.plist文件 - 从以下内容中复制密钥和字符串值并粘贴到文件中
- 根据你的需要更新字符串的值。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- 🚨 Keep only the permissions used in your app 🚨 -->
<key>NSAppleMusicUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSCalendarsUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSCameraUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSContactsUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSFaceIDUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSLocationTemporaryUsageDescriptionDictionary</key>
<dict>
<key>YOUR-PURPOSE-KEY</key>
<string>YOUR TEXT</string>
</dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSMicrophoneUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSMotionUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSRemindersUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSSiriUsageDescription</key>
<string>YOUR TEXT</string>
<key>NSUserTrackingUsageDescription</key>
<string>YOUR TEXT</string>
<!-- … -->
</dict>
</plist>
→ 在我们的例子中,它是如下的。
<key>NSCameraUsageDescription</key>
<string>YOUR TEXT</string>
第一个选项中的值部分和第二个选项中的<string> 部分对应于警报信息里面的文本。
让我们回顾一下Facebook的摄像头权限提醒。描述部分是你在这里给出的文本作为值。

→ 在我们的例子中,我只是给了 "相机 "这个值,这里看起来像这样。

安卓的 react-native-permissions
- 在你的应用程序的
android/app/src/main/AndroidManifest.xml文件中添加所有需要的权限。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myawesomeapp">
<!-- 🚨 Keep only the permissions used in your app 🚨 -->
<uses-permission android:name="android.permission.ACCEPT_HANDOVER" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
<uses-permission android:name="android.permission.BODY_SENSORS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.USE_SIP" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
<!-- … -->
</manifest>
→ 在我们的案例中,我们只需要在AndroidManifest.xml 文件中添加相机权限。
<uses-permission android:name="android.permission.CAMERA" />
请求权限:返回类型
request(Platform.OS === 'ios' ? PERMISSIONS.IOS.CAMERA : PERMISSIONS.ANDROID.CAMERA).then((result) => {
setPermissionResult(result)
console.log(result)
});
返回类型和含义在这里。

流程因操作系统的不同而不同。这里有iOS和Android的权限流程图,它取自这个库的文档。


最终产品
看吧!你已经准备好运行你的代码了!基本上,这就是了!你可能还会遇到一些问题。
你可能还是会遇到一些问题,比如你的设备不支持该功能,或者版本无效。我的建议是:你检查解决方案的第一个地方应该是库的文档。
在写这篇文章时,我建立了一个React Native应用程序的例子,其中包括相机和麦克风的权限。它显示了权限的结果和对结果的解释。
你可以玩玩它,看看结果类型,并观察该结果何时返回。你可以先批准它,然后在设置中改变权限,打开应用程序,看看会发生什么。与它一起工作才能更好地理解!
你也可以在为特定场合编码时使用该样本进行测试。除了把玩样本外,你还可以查看源代码,如果你有什么困难,可以和我的进行比较

当我即将完成我的例子项目时,我发现zoontek也为这个项目做了一个例子,就像我的一样,但包括了所有的权限!你可以去看看zoontek的例子。你可以在这里查看zoontek的示例程序。
配置权限的关键点
权限外观
请记住, 如果你回答了一个权限请求, 它就不会再要求这个权限了。如果你想让它再次出现,请删除并安装该应用。
如果你只想改变结果,你可以在设备的设置上改变它。
在iOS中,用户必须明确授予每个应用程序访问摄像头和麦克风的权限。在你的应用程序第一次使用捕捉系统之前,操作系统会显示一个警告,要求用户授予你的应用程序访问摄像头的权限。他们会记住用户对这一提示的反应,所以每次你访问用户的摄像头时,它不会重新出现。
用户可以在iOS的 "设置">"隐私 "中改变你的应用程序的权限设置,或者在Android的
"设置">"应用程序">"你的应用程序名称">"权限"。
Android 11权限更新
在安卓生态系统中,有一些变化是随着安卓11而来的。
- 如果你的应用程序请求与相机、麦克风或位置有关的权限,权限对话框包括 "仅此一次 "选项。如果选择了它,你的应用程序就会被授予一次权限。这被称为 "一次性许可"。第二次打开该应用时,权限对话框会再次出现
- 如果你的应用程序有几个月没有被使用,系统会自动重置用户为该应用程序授予的敏感运行时权限。
想了解更多,请去看看Android 11的更新。
iOS 14.5:应用跟踪透明化
对于iOS14.5、iPadOS14.5和tvOS14.5及更高版本,开发者需要征求用户的许可,以便在其他公司拥有的应用程序和网站上跟踪他们。这个库的最大特点之一是它是最新的。你可以通过使用react-native-permissions添加AppTrackingTransparency(ATT)的提示和请求。记住,只有14.5版或更新的iOS设备能够请求。
何时询问权限以获得最佳用户体验
在应用程序的入职培训中询问权限,还是在你需要的特定时间询问权限,仍然是一个用户体验的争论。没有一个答案;有的只是意见。
我所建议的是在你需要的时候询问。作为一个用户,在入职培训中看到所有的权限让我感到害怕,而且大多数时候我并没有给出全部的权限。正如我之前所说,这是可以讨论的。选择适合你的方式。
总结
我们已经涵盖了权限的概念,以及我们如何通过使用react-native-permissions在React Native中获得它们。我给了你在你的权限旅程中可能需要的关键点,比如Android 11和iOS 14.5的变化。你可以在这个GitHub仓库里找到我的例子项目。
我希望你喜欢这篇文章,并希望你的用户给予充分的权限,从你的应用功能中获得好处如果你有任何反馈,请随时联系我们。直到下一次,请注意!
参考文献
The postManaging app permissions in React Nativeappeared first onLogRocket Blog.