我正在进行键盘扩展项目。在应用程序代码的某些点上,我需要测试用户是否已授予"允许完全访问权限#34;键盘扩展的权限。这笔交易是我需要从应用程序端进行这些测试,并在此基础上让用户访问键盘设置或在未获得许可的情况下提醒他。
问题是这里提供的方法如:
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。
有人知道从应用程序端测试这个的可靠方法吗?
答案 0 :(得分:1)
考虑在您的应用和键盘中使用NSUSerdefaults。为了使扩展程序和应用程序能够共享相同的NSUserdefaults,您只需打开应用程序组即可。在项目导航器中选择项目下的主应用程序目标,然后转到功能并通过将其切换为打开来启用应用程序组,添加您的开发人员配置文件并修复可能出现的问题。 现在创建一个新容器。根据帮助,它必须以“group。”开头,所以给它命名为“group.com.mycompany.myapp”。选择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/。
希望有帮助,朱利安