如何检查 ios 设置应用中是否存在应用设置

How to check if app settings exist in ios setting app

我正在使用权限,我似乎遇到了一个有趣的边缘情况...

似乎直到用户授予一项或多项权限后,应用程序设置才会创建。我有一个按钮试图通过调用以下代码(在 appDelegate 的扩展中)在设置应用程序中打开应用程序设置

   open(UIApplication.openSettingsURLString, completionHandler: { success in
       // success
   })

用户可以在请求任何应用权限之前或之后访问此按钮。

如果用户在授予任何应用权限之前尝试打开应用设置,则应用特定设置似乎未在设置应用中列出。

如何以编程方式检查应用设置是否已创建?

您可以维护您的应用使用的所有权限的列表。假设它使用 PhotosCamera 权限。您可以单独检查这些权限中的每一个,以了解是否已为您的应用创建系统设置。

import AVFoundation
import Photos

class PermissionsUtil {
    class var isSystemSettingsCreatedForApp: Bool {
        PHPhotoLibrary.hasUserInteractedWithSystemPermissionsAlert
        ||
        AVCaptureDevice.hasUserInteractedWithSystemPermissionsAlert
        /// And so on
    }
}

extension PHPhotoLibrary {
    class var hasUserInteractedWithSystemPermissionsAlert: Bool {
        self.authorizationStatus() != .notDetermined
    }
}

extension AVCaptureDevice {
    class var hasUserInteractedWithSystemPermissionsAlert: Bool {
        self.authorizationStatus(for: .video) != .notDetermined
    }
}

这需要一些维护,因为新权限已添加到应用程序中。尽管不使用任何私有 API 就解决了这个问题。

我通过向应用程序添加 settings.bundle 解决了这个问题。

事实证明,添加一个 Settings.bundle(即使是一个没有指定任何 PreferenceSpecifiers 的空 Settings.bundle)将确保将应用程序设置添加到 iOS 设置应用程序当应用程序安装在设备上时。这保证了应用程序设置始终存在。

右键单击项目 > 新建文件并向项目添加 Settings.bundle。 然后更改或删除默认的 PreferenceSpecifiers。

有关 Settings.bundle 的详细信息,请参阅: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html

我用的settings.bundle如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>StringsTable</key>
    <string>Root</string>
    <key>PreferenceSpecifiers</key>
    <array/>
</dict>
</plist>