- 版本:2.3.3
- GitHub: https://github.com/nativescript-community/perms
- NPM: https://npmjs.net.cn/package/%40nativescript-community%2Fperms
- 下载量
- 前一天:391
- 上周:2216
- 上个月:9468
@nativescript-community/perms
为 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()
的第二个参数;第二个参数是一个字符串,可以是always
或whenInUse
(默认)。 - 权限类型
notification
接受一个用于request()
的第二个参数。第二个参数是一个包含所需警报类型的数组。可以是alert
、badge
和sound
的任意组合(默认请求所有三个)。 - 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
。
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 注意事项
-
check
和request
还允许你直接传递 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" 即可。