如何测试包含应用程序是否授予“允许完全访问”权限?

问题描述 投票:0回答:4

我正在开发键盘扩展项目。在应用程序代码的某些点,我需要测试用户是否已授予键盘扩展的“允许完全访问”权限。协议是我需要从应用程序端进行这些测试,并在此基础上让用户访问键盘设置或在未授予权限的情况下提醒他。

问题是这里提供的方法如下:

func isOpenAccessGranted() -> Bool {
    return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard)
}

或:

func isOpenAccessGranted() -> Bool {
let fm = NSFileManager.defaultManager()
let containerPath = fm.containerURLForSecurityApplicationGroupIdentifier(
                    "group.com.example")?.path
var error: NSError?
fm.contentsOfDirectoryAtPath(containerPath!, error: &error)
if (error != nil) {
    NSLog("Full Access: Off")
    return false
}
NSLog("Full Access: On");
return true
}

仅从键盘一侧工作,因为键盘是唯一受此权限影响的键盘。从包含应用程序端来看,这两个方法始终返回 true。

有人知道从应用程序端测试这个的可靠方法吗?

ios swift keyboard ios-keyboard-extension
4个回答
3
投票

考虑在您的应用程序和键盘中使用 NSUSerdefaults。为了使扩展程序和应用程序能够共享相同的 NSUserdefaults,您只需打开应用程序组即可。在项目导航器中的项目下选择您的主应用程序目标,然后转到功能并通过将其切换为打开来启用应用程序组,添加您的开发人员配置文件并修复可能出现的问题。 现在创建一个新容器。根据帮助,它必须以“group.”开头,因此给它一个类似“group.com.mycompany.myapp”的名称。选择您的 Today Extension 目标并重复打开应用程序组的过程。不要创建新的组,而是选择这个新创建的组来表示 Today Extension 是该组的一部分。

现在允许您与容器应用程序共享相同的 NSUserdefaults。 您现在要做的就是使用您提供的代码并将保存方法添加到 NSUserdefaults 中,如下所示:

func isOpenAccessGranted() -> Bool {
    let defaults = NSUserDefaults.standardUserDefaults()
    let fm = NSFileManager.defaultManager()
    let containerPath = fm.containerURLForSecurityApplicationGroupIdentifier(
        "group.com.example")?.path
    var error: NSError?
    fm.contentsOfDirectoryAtPath(containerPath!, error: &error)
    if (error != nil) {
        NSLog("Full Access: Off")
        defaults.setBool(false, forKey: "hasFullAccess")
        return false
    }
    NSLog("Full Access: On");
    defaults.setBool(true, forKey: "hasFullAccess")
    return true
}

在键盘扩展中执行此操作。然后在您的父应用程序中,只需检索它们并根据它们的值采取行动即可。

let hasFullAccess : Bool = NSUserDefaults.standardUserDefaults().boolForKey("hasFullAccess")


if hasFullAccess{
    //User granted full access
}
else{
    //User didn't grant full access
}

如果用户未授予完全访问权限,则会显示警报,否则请编码!

编辑: 在联系苹果的技术开发人员支持后,他们告诉我,目前无法以任何支持的方式实现这一点。他们的回应如下:

我们的工程师已审查您的请求并得出结论: 鉴于以下情况,不支持实现所需功能的方法 目前正在发布系统配置。

如果您希望 Apple 考虑添加对此类的支持 未来的功能,请通过以下方式提交增强请求 错误报告工具位于 https://developer.apple.com/bug-reporting/

希望有帮助,朱利安


2
投票

Objective-C

[UIInputViewController new].hasFullAccess;

0
投票

您可以轻松测试iOS 11及更高版本是否授予“允许完全访问”权限。

  1. 要获得“允许完全访问”权限,首先将 UIInputViewController 类。
  2. 添加代码。该代码返回一个布尔值。

Objective-C

[self hasFullAccess];

斯威夫特

self.hasFullAccess

https://developer.apple.com/documentation/uikit/uiinputviewcontroller/2875763-hasfullaccess?changes=_2


0
投票

您可以在包含的应用程序中检查它,如下所示:

    private func isOpenAccessGranted() -> Bool {
        let inputVC = UIInputViewController()
        return inputVC.hasFullAccess
    }
© www.soinside.com 2019 - 2024. All rights reserved.