应用权限

应用权限

如今,许多设备和操作系统功能如果被滥用,可能会对隐私、安全和性能产生重大影响。因此,越来越多的平台要求在访问这些功能之前获得用户的明确同意。

Qt 权限 API 允许应用程序以跨平台的方式检查或请求对这样的功能的权限。

用法

通常需要用户同意的功能之一是访问设备的麦克风。一个用于录音语音记忆的应用程序可能最初看起来像这样

void VoiceMemoWidget::onRecordingInitiated()

{

m_microphone->startRecording();

}

为了确保这个应用程序在要求对麦克风访问权限进行用户同意的平台上的良好运行,我们会对其进行以下扩展

void VoiceMemoWidget::onRecordingInitiated()

{

QMicrophonePermission microphonePermission;

switch (qApp->checkPermission(microphonePermission)) {

case Qt::PermissionStatus::Undetermined:

qApp->requestPermission(microphonePermission, this,

&VoiceMemoWidget::onRecordingInitiated);

return;

case Qt::PermissionStatus::Denied:

m_permissionInstructionsDialog->show();

return;

case Qt::PermissionStatus::Granted:

m_microphone->startRecording();

}

}

我们首先检查我们是否已经知道麦克风权限的状态。如果没有,我们将对权限请求进行初始化以确定当前状态,这可能会要求用户进行同意。我们将请求的结果连接到我们已经在的槽中,这样我们就有了评估权限状态的其他机会。

一旦知道权限状态,要么是因为我们在之前获得或拒绝权限,要么是在从我们刚才发起的请求中返回结果后,我们将用户重定向到对话框,说明为什么我们现在无法记录语音备忘录(如果权限被拒绝),或者继续使用麦克风(如果权限被授予)。

注意:在 macOS 和 iOS 上,当前只能为 GUI 应用程序请求权限。

声明权限

某些平台要求在构建时提前声明你请求的权限。

Apple 平台

你请求的每个权限都必须在应用程序的 Info.plist 文件中附上所谓的 用途描述 字符串,说明为什么应用程序需要访问该权限。例如

NSMicrophoneUsageDescription

The microphone is used to record voice memos.

每个权限类型的用途描述键在各自的文档中有描述。

Android

你请求的每个权限都必须在应用程序的 AndroidManifest.xml 文件中附上 uses-permission 条目。例如

每个权限类型的权限名称在各自的文档中有描述。

可用的权限

以下权限类型可用

QBluetoothPermission

访问蓝牙外设

QCalendarPermission

访问用户的日历

QCameraPermission

访问摄像头进行拍照或录像

QContactsPermission

访问用户的联系人

QLocationPermission

访问用户的位置

QMicrophonePermission

访问麦克风进行监控或录音

最佳实践

为了确保提供给最终用户最佳的用户体验,我们建议采用以下最佳实践来管理应用程序权限

请求所需的权限的最小集合。例如,如果您只需要访问麦克风,不要请求相机权限以防万一。使用单个权限类型的属性进一步限制权限范围,例如使用 QContactsPermission::setReadOnly() 请求只读访问。

在用户采取特定操作时请求权限。例如,在用户按下录制音频按钮之前,暂缓请求麦克风权限。将权限请求与特定操作关联,可以给用户提供更清晰的权限需求背景。不要在启动时请求所有需要的权限。

如有必要,提供额外上下文和解释。有时用户的行为不足以提供足够的信息。考虑在用户启动操作后,但在请求权限之前显示解释对话框,以便用户了解在系统权限对话框弹出时将发生什么。

关于为什么需要权限,要透明并明确。在解释对话框和用法描述中,明确说明为何需要特定的权限来实现您的应用程序的特定功能,以便用户可以做出明智的决定。

考虑权限被拒绝的情况。您请求的权限可能因各种原因而被拒绝。您应该始终考虑这种情况,通过优雅地降低应用程序体验,并向用户提供关于该情况的清晰解释。

千万不要从库中请求权限。请求权限应该在尽可能靠近用户的地方进行,以便有足够的信息来做出上述正确的决定。库可以检查权限,以确保他们有执行工作的先决条件,但如果权限未确定或被拒绝,应通过库的API反映这种情况,以便应用程序可以请求必要的权限。

相关文章