平台功能
系统权限
检查和请求系统权限,打开对应的设置页面,并在 macOS 上引导用户到系统设置中授权。
检查和请求
系统替用户保管着应用的一些能力,由用户授予:手机和 Mac 上的麦克风、相机、日历、提醒事项、蓝牙和媒体资料库,以及 macOS 上的辅助功能、录屏、输入监控、完全磁盘访问权限、App 管理和开发者工具。core.Permissions() 以 core.Permission 键列出它们。cx.PermissionStatus 不打扰用户地回答应用是否已有某项权限,cx.RequestPermission 在系统有弹窗且尚未询问过时用系统弹窗请求。请在用户做需要该权限的操作时再请求。面容 ID 和触控 ID 不在其中:cx.BiometricAvailability 回答它们是否可用,cx.AuthenticateBiometric 用它们自己的弹窗请求。
cx.RequestPermission(core.PermissionCamera, func(s core.PermissionStatus) {
if s.Allowed() {
startScanner()
}
})
| 状态 | String() |
含义 |
|---|---|---|
PermissionNotAsked |
prompt |
尚未询问:请求会显示系统弹窗 |
PermissionGranted |
granted |
应用已有该权限 |
PermissionDenied |
denied |
已被拒绝,只能在系统设置中更改 |
PermissionUnknown |
unknown |
系统保管该权限,但系统或平台不告知 |
PermissionNotGated |
not-gated |
没有什么限制应用使用它,例如在 Linux 上 |
PermissionUnavailable |
unavailable |
平台没有这项权限 |
Allowed 对已授予和不受限都为真。macOS 在用户打开之前对辅助功能、录屏和输入监控都回答已拒绝,因为请求只会把应用列进对应面板;录屏的授权要等应用重新启动后才能读到。
用途说明
在 macOS 和 iOS 上,请求权限需要应用的 Info.plist 写明用途,由 nsgo.yaml 的 apple.info 提供;缺少时请求回答不可用并在日志中写出所需的键,因为系统会在询问时终止应用。
apple:
info:
NSMicrophoneUsageDescription: 录制你的语音笔记。
NSCameraUsageDescription: 扫描你对准的二维码。
NSCalendarsFullAccessUsageDescription: 把你的预订加入日历。 # macOS 14 和 iOS 17 起;之前为 NSCalendarsUsageDescription
NSRemindersFullAccessUsageDescription: 把任务变成提醒事项。 # 之前为 NSRemindersUsageDescription
NSBluetoothAlwaysUsageDescription: 查找你的耳机。
NSAppleMusicUsageDescription: 播放你的资料库。 # iOS
windows:
device_capabilities: [microphone, webcam] # store 构建的 MSIX 声明的设备
在 nsgo dev 下,macOS 把应用的行为记在启动它的终端名下,询问和列出的都是终端;要测试应用自己的权限,请先构建应用。
打开设置
cx.OpenPermissionSettings 打开授予某项权限的页面,并回答是否打开:macOS 上是“隐私与安全性”中该权限的面板,iOS 上是“设置”中本应用的页面,Windows 上是麦克风或相机的页面。
引导用户
desktop.GuidePermission 打开该页面并等待用户授予权限。在 macOS 上,一个面板跟随系统设置的窗口且不抢焦点;对于列表接受拖入应用的面板,它会展示应用,让用户把应用拖进列表。应用获得权限、用户关闭面板或系统设置、调用 stop 或组件销毁时,引导结束,回调收到当时的状态;新的引导会结束之前的引导。
stop := desktop.GuidePermission(cx, core.PermissionAccessibility, desktop.GuideOptions{}, func(s core.PermissionStatus) {
trusted.Set(s == core.PermissionGranted)
})
展示的应用是它的应用包,没有应用包时是可执行文件;GuideOptions.App 可以指定其他应用,Name 指定面板中显示的名称。Windows 打开页面并等待“设置”关闭。其他平台上回调立即收到当前状态。
各平台
| 平台 | 能读取和请求的权限 |
|---|---|
| macOS | 全部权限;App 管理、开发者工具和媒体与 Apple Music 为未知 |
| iOS | 麦克风、相机、日历、提醒事项、蓝牙和媒体资料库 |
| Windows | 麦克风和相机,但从不弹窗请求;其余不受限 |
| Linux | 不受限;在 Flatpak 和 Snap 中麦克风和相机为未知 |
| Web | 麦克风和相机,在 Firefox 中为未知 |
| Android、Apple Watch、小程序 | 目前为未知 |
测试
nsgotest 用它的模型回答:app.Permissions 保存每项权限的状态,初始为尚未询问;请求尚未询问的权限时,状态变为 app.PermissionAnswers 中给它的值,没有时为已授予。app.PermissionSettings 列出打开过的设置,app.Guide 是正在显示的引导,app.GrantPermission 和 app.CloseGuide 会结束它。
app.PermissionAnswers[core.PermissionMicrophone] = core.PermissionDenied
app.Press("id:record")
app.Find("text:The microphone is off")