我正在开发键盘扩展项目。在应用程序代码的某些点,我需要测试用户是否已授予键盘扩展的“允许完全访问”权限。协议是我需要从应用程序端进行这些测试,并在此基础上让用户访问键盘设置或在未授予权限的情况下提醒他。
问题是这里提供的方法如下:
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。
有人知道从应用程序端测试这个的可靠方法吗?
考虑在您的应用程序和键盘中使用 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/。
希望有帮助,朱利安
Objective-C
[UIInputViewController new].hasFullAccess;
您可以轻松测试iOS 11及更高版本是否授予“允许完全访问”权限。
Objective-C
[self hasFullAccess];
斯威夫特
self.hasFullAccess
您可以在包含的应用程序中检查它,如下所示:
private func isOpenAccessGranted() -> Bool {
let inputVC = UIInputViewController()
return inputVC.hasFullAccess
}