11

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

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

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。

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

4

3 回答 3

2

考虑在您的应用程序和键盘中使用 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 的技术开发人员支持后,他们告诉我,目前无法以任何受支持的方式实现。他们的回应如下:

我们的工程师已经审查了您的请求,并得出结论认为,鉴于当前发货的系统配置,没有支持的方式来实现所需的功能。

如果您希望 Apple 考虑在未来添加对此类功能的支持,请通过https://developer.apple.com/bug-reporting/上的 Bug Reporter 工具提交增强请求。

希望有帮助,朱利安

于 2015-12-19T16:41:28.597 回答
0

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

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

Objective-C

[self hasFullAccess];

迅速

self.hasFullAccess

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

于 2021-01-12T04:20:18.277 回答
0

Objective-C

[UIInputViewController new].hasFullAccess;
于 2021-09-30T14:06:23.343 回答