- 版本:2.0.11
- GitHub:
- NPM: https://npmjs.net.cn/package/nativescript-perms
- 下载
- 昨天: 0
- 上周: 45
- 上个月: 234
安装
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()
的第二个参数;第二个参数是字符串,可以是always
或whenInUse
(默认)。 - 权限类型
notification
接受request()
的第二个参数。第二个参数是一个包含所需警报类型的数组。可以是alert
、badge
和sound
的任何组合(默认请求所有三个)。 - 如果您不请求媒体库,则可以删除 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
。
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" 即可。