nativescript-perms
Nativescript 权限插件。
npm i --save nativescript-perms

npm npm GitHub forks GitHub stars

NPM

安装

  • tns plugin add nativescript-perms

添加插件后请确保运行新的构建,以避免任何问题。


这是从 react-native-permissions 转换而来

API

权限状态

承诺解析为 [状态:Status, 总是:boolean],其中状态是以下状态之一

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

支持的权限类型

当前支持的权限有

类型 iOS Android
位置 location
摄像头 camera
麦克风 microphone
照片 photo
联系人 contacts
事件 event
蓝牙 bluetooth
提醒 reminder
推送通知 notification
后台刷新 backgroundRefresh
语音识别 speechRecognition
媒体库 mediaLibrary
运动活动 motion
存储 storage ❌️
电话 callPhone ❌️
读取短信 readSms ❌️
接收短信 receiveSms ❌️

方法

方法名称 参数 备注
check() type - 返回一个包含权限状态的承诺。有关特殊情况,请参阅 iOS 备注
request() type - 除了 backgroundRefresh 之外,接受任何权限类型。如果当前状态是 undetermined,则显示权限对话框并返回一个包含结果的承诺。否则,立即返回一个包含当前状态的承诺。有关特殊情况,请参阅 iOS 备注
checkMultiple() [types] - 接受权限类型的数组,并返回一个承诺,该承诺将权限类型映射到状态
getTypes() none - 返回一个有效权限类型的数组
openSettings() none - (仅限 iOS - 8.0 及以上版本) 将用户切换到应用的设置页面
canOpenSettings() none - (仅限 iOS) 返回一个布尔值,指示设备是否支持切换到设置页面

iOS 备注

  • 权限类型 bluetooth 表示 CBPeripheralManager 的状态。如果只需要 CBCentralManager,则不要使用此类型
  • 权限类型 location 接受 request()check() 的第二个参数;第二个参数是字符串,可以是 alwayswhenInUse(默认)。
  • 权限类型 notification 接受 request() 的第二个参数。第二个参数是一个包含所需警报类型的数组。可以是 alertbadgesound 的任何组合(默认请求所有三个)。
  • 如果您不请求媒体库,则可以删除 xcode 项目中的 MediaPlayer.framework。
// example
Permissions.check('location', { type: 'always' }).then(response => {
this.setState({ locationPermission: response[0] })
})

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

Permissions.request('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 说明

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

  • 您可以通过在 AndroidManifest.xml 文件中也包括适当的写入权限来请求对任何这些类型的写入访问。更多信息请参阅 这里

  • 可选的理由参数将显示对话框提示。

// example
Permissions.request('camera', {
rationale: {
title: 'Cool Photo App Camera Permission',
message:
'Cool Photo App needs access to your camera ' +
'so you can take awesome pictures.',
},
}).then(response => {
this.setState({ cameraPermission: response[0] })
})
  • 对于 targetSdkVersion < 23 的目标,权限将自动接受,但您仍然可以使用 check() 检查用户是否已在设置中禁用它们。

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

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
// ...

故障排除

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

答案:从 Xcode 8 开始,您需要添加权限描述。有关详细信息,请参阅 iOS 说明。感谢 @jesperlndk 发现此问题。

问题:iOS - 我更改设置中的权限时应用程序崩溃

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