为啥在设置中显示应用之前需要询问所有权限?

Posted

技术标签:

【中文标题】为啥在设置中显示应用之前需要询问所有权限?【英文标题】:Why does all permissions need to be asked before app is shown in settings?为什么在设置中显示应用之前需要询问所有权限? 【发布时间】:2021-05-28 20:16:12 【问题描述】:

我的应用程序正在跟踪用户并允许他们使用存储在其中的信息/图像创建注释/标记。 这是我的 info.plist 权限用法。

<key>NSAppleMusicUsageDescription</key>
<string>info</string>
<key>NSCameraUsageDescription</key>
<string>info</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>info</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>info</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>info</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>info</string>
<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
    <string>location</string>
</array>

WhenInUseUsage 直接要求用户提供位置权限,以在地图上显示他们的位置。然后,当用户想要开始跟踪他们的位置时,我请求 AlwaysUsage 权限并提示他们进入应用程序设置屏幕。在这个阶段它不会找到应用程序设置屏幕。

我尝试重新安装我的应用程序,重新启动手机,其他手机等。只有当我也请求相机权限时,应用程序才会出现在设置屏幕中。我只想在用户实际使用它来说明我问的原因时请求照片许可。

这就是我在设置中请求权限的方式:

func showSettingsAlert()
    let alert = UIAlertController(title: C.Alert.settingsTitle, message: C.Alert.settingsMessage, preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: C.Alert.setting, style: .default, handler:  action in
        
        UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil)
    ))
    alert.addAction(UIAlertAction(title: C.Alert.cancel, style: .default, handler: nil))
    self.present(alert, animated: true, completion: nil)

这是故意的吗?在我可以将用户发送到应用程序设置屏幕之前,是否需要在运行时开始询问所有权限?我错过了什么?

【问题讨论】:

无论如何,您都不应该将用户引导至此用例的设置。 “始终”位置权限(用户需要授予)和后台位置(您的应用可以在没有始终权限的情况下使用)之间存在差异。正确的方法是在需要时始终请求许可,并在位置管理器上启用后台位置。您的应用将始终获得临时权限,您将在后台获得位置,并且在一段时间后将提示用户始终授予您真实权限。在此有一个 wwdc 2019 会议 @Paulw11 我不知道这一点。这显然是正确的做法。尽管这不是我的问题的答案,但我希望人们阅读这篇文章! 【参考方案1】:

如果您想在请求任何权限之前将用户引导至设置面板,您可以将 Settings.bundle 添加到您的项目中。这将确保设置面板在安装后直接可用。


编辑: 抱歉,我没有得到你想要做的第一件事..

只有在您在应用中请求后,每个权限才会显示在设置中。 您应该在上下文中向用户询问每个权限,用户尝试使用某个功能,并且需要此权限。用户应该能够理解您为什么请求此权限。 因此,在应用启动时询问所有权限并不是一个好方法。

例如: 当用户打开地图并想查看他的位置时,询问位置。 当用户点击“扫描二维码”按钮或“拍照”按钮时,请求相机许可。 等等。

【讨论】:

这正是我目前在应用程序中请求权限的方式。我只问什么时候用。问题是当我需要在后台询问位置时。我将用户发送到应用程序设置。但在我还要求照片权限之前,他们将无法访问应用程序设置。我不想在使用前征求照片许可。当询问 InUse 和摄像头时,应用程序设置不会在展位位置之前显示。用户应该能够在询问相机之前访问应用设置并选择位置 alwaysUsage(他们可能不需要/不想使用相机) 那么也许试试 settings.bundle 方法。有了这个,设置肯定是可用的。

以上是关于为啥在设置中显示应用之前需要询问所有权限?的主要内容,如果未能解决你的问题,请参考以下文章

Android中常见的权限

为啥不调用 ViewForAnnotation?

为啥 Qt creator 中不存在所有 android 权限?

为啥我的 iOS 应用程序不询问用户访问相机的权限?

oauth2.0授予Web应用访问用户的Google spreadhseets所需的最小范围是多少?

用户Administrator所有权限都没有了!!