@nativescript-community/perms
为 NativeScript 在 iOS 和 Android 上提供的统一权限 API。
npm i --save @nativescript-community/perms

@nativescript-community/perms

Downloads per month NPM Version

为 NativeScript 在 iOS 和 Android 上提供的统一权限 API。


iOS 示例 Android 示例

目录

安装

从您项目的根目录运行以下命令

ns plugin add @nativescript-community/perms

API

权限状态

承诺解析为 [状态:状态,始终:布尔值],其中状态是以下状态之一

返回值 注意事项
authorized 用户已授权此权限
denied 用户至少拒绝过此权限一次。在 iOS 上,这意味着用户将不会被再次提示。Android 用户可以在选择“不再问我”之前多次被提示
limited iOS - 这意味着权限已被授予,但有限制
restricted iOS - 这意味着用户无法授予此权限,可能是因为设备不支持或不被家长控制阻止。 Android - 这意味着用户在拒绝权限时选择了“不再问我”
undetermined 用户尚未被提示权限对话框

支持的权限类型

当前支持的权限包括

类型 iOS Android
位置 location
相机 camera
麦克风 microphone
照片 photo
视频 video ✔ (api >= 33)
音频 audio ✔ (api >= 33)
联系人 contacts
事件 event
蓝牙 bluetooth ✔(api >= 31)
提醒事项 reminder
推送通知 notification ✔ (api >= 33)
后台刷新 backgroundRefresh
语音识别 speechRecognition
媒体库 mediaLibrary
运动活动 motion
存储 storage ❌️
电话呼叫 callPhone ❌️
读取短信 readSms ❌️
接收短信 receiveSms ❌️
媒体位置 mediaLocation ❌️ ✔(api >= 29)
蓝牙扫描 bluetoothScan ❌️ ✔(api >= 31)
蓝牙连接 bluetoothConnect ❌️ ✔(api >= 31)

方法

方法名称 参数 注意事项
check() type - 返回一个包含权限状态的承诺。有关特殊情况的说明,请参阅 iOS 注意事项
request() type - 接受除 backgroundRefresh 之外的所有权限类型。如果当前状态为 undetermined,则显示权限对话框,并返回一个包含结果的承诺。否则,立即返回一个包含当前状态的承诺。有关特殊情况的说明,请参阅 iOS 注意事项
checkMultiple() {[key:string]:Record<string, any>} - 接受权限类型的数组,并返回一个对象,将权限类型映射到状态
getTypes() none - 返回有效权限类型的数组
openSettings() none 将用户切换到应用的设置页面
canOpenSettings() none - 返回一个布尔值,指示设备是否支持切换到设置页面

iOS 注意事项

  • 权限类型 bluetooth 代表 CBPeripheralManager 的状态。如果只需要 CBCentralManager,则不要使用此权限。
  • 权限类型 location 接受一个用于 request()check() 的第二个参数;第二个参数是一个字符串,可以是 alwayswhenInUse(默认)。
  • 权限类型 notification 接受一个用于 request() 的第二个参数。第二个参数是一个包含所需警报类型的数组。可以是 alertbadgesound 的任意组合(默认请求所有三个)。
  • iOS 12+: 第二个参数也可以在数组中包含此类型 providesAppNotificationSettings
  • 如果你不请求媒体库,则可以删除 xcode 项目中的 MediaPlayer.framework。
import { check as checkPermission, request as requestPermission } from '@nativescript-community/perms';

// example
checkPermission('location', { type: 'always' }).then(response => {
this.setState({ locationPermission: response[0] })
})

requestPermission('location', { type: 'always' }).then(response => {
this.setState({ locationPermission: response[0] })
})

requestPermission('notification', { type: ['alert', 'badge'] }).then(
response => {
this.setState({ notificationPermission: response[0] })
},
)
  • 在模拟器上无法请求麦克风权限。
  • 使用 Xcode 8,你现在需要为将请求的每个权限添加使用描述。打开 Xcode ➜ Info.plist ➜ 添加一个键(以 "Privacy - ...” 开头),其中包含你的套件特定权限。

示例:如果你需要联系人权限,你必须添加键 Privacy - Contacts Usage Description

3cde3b44-7ffd-11e6-918b-63888e33f983

App Store 提交免责声明

如果你需要将你的应用程序提交到 AppStore,你需要将所有 *UsageDescription 键添加到你的 Info.plist 中,其中包含一个字符串值,解释应用程序如何使用这些数据。即使你不使用它们。

因此,在提交你的应用程序到 App Store 之前,请确保在你的 Info.plist 中有以下键

<key>NSBluetoothPeripheralUsageDescription</key>
<string>Some description</string>
<key>NSCalendarsUsageDescription</key>
<string>Some description</string>
<key>NSCameraUsageDescription</key>
<string>Some description</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Some description</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Some description</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Some description</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>Some description</string>
<key>NSAppleMusicUsageDescription</key>
<string>Some description</string>
<key>NSMotionUsageDescription</key>
<string>Some description</string>

这是必要的,因为在 App Store 提交处理阶段,系统检测到你的应用程序包含请求权限 X 的代码,但没有 UsageDescription 键,然后它拒绝构建。

请注意,这只会显示你应用程序中真正需要的权限的使用描述。

你可以在 #46 中找到更多关于此问题的信息。

Android 注意事项

  • checkrequest 还允许你直接传递 android 权限(作为值或数组)。这将允许请求任何新权限,而无需更新此插件。

  • 在请求之前,所有必需的权限也必须包含在 AndroidManifest.xml 文件中。否则,request() 将立即返回 denied

  • 你可以在 AndroidManifest.xml 文件中包含适当的写入权限,以便请求这些类型的写入访问。更多信息请参阅 此处

  • 对于 targetSdkVersion < 23 的目标,权限将自动接受,但你仍然可以使用 check() 来检查用户是否在设置中禁用了它们。

你可能需要提高你的 targetSdkVersion 版本在你的 build.gradle 中。

android {
compileSdkVersion 23 // ← set at least 23
buildToolsVersion "23.0.1" // ← set at least 23.0.0

defaultConfig {
minSdkVersion 16
targetSdkVersion 23 // ← set at least 23
// ...

故障排除

Q: iOS - 请求权限后应用程序立即崩溃

A: 从 Xcode 8 开始,你需要添加权限描述。有关更多详细信息,请参阅 iOS 备注。感谢 @jesperlndk 发现此问题。

Q: iOS - 当我在设置中更改权限时,应用程序崩溃

A: 这是正常的。iOS 在你的隐私设置更改时重新启动你的应用程序。只需在 Google 上搜索 "iOS crash permission change" 即可。