如何测试是不是从包含应用程序授予“允许完全访问”权限?
Posted
技术标签:
【中文标题】如何测试是不是从包含应用程序授予“允许完全访问”权限?【英文标题】:How to test if "Allow Full Access" permission is granted from containing app?如何测试是否从包含应用程序授予“允许完全访问”权限? 【发布时间】:2015-11-14 04:41:32 【问题描述】:我正在做一个键盘扩展项目。在应用程序代码的某些点,我需要测试用户是否已授予键盘扩展的“允许完全访问”权限。交易是我需要从应用程序端进行这些测试,并基于此让用户访问键盘设置或在未授予权限的情况下提醒他。
问题是这里提供的方法如下:
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。
有人知道从应用程序端对此进行测试的可靠方法吗?
【问题讨论】:
非常感谢任何高于 8.3 的 ios 版本的解决方案。仅适用于某些版本的事件。 【参考方案1】:考虑在您的应用和键盘中使用 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/ 的错误报告工具。
希望对您有所帮助,朱利安
【讨论】:
嗯,这是最好的解决方案的一半。总比没有好,但是这个解决方案有一些缺点。对于初学者,此解决方案仅在您第一次使用键盘并且我没有弄错允许完全访问权限后才有效。否则键盘将无法访问共享的 NSUserDefaults。接下来如果用户进入设置并关闭允许完全访问权限,您将在应用程序端获得错误的值,直到用户再次使用您的键盘。这确实不令人满意,但感谢您的努力和帮助。 @Emil Adz 嗯。我知道了。好吧,我很抱歉你有这种感觉。我会尝试找到更好的方法并进行编辑。 不过,我想谈谈您提到的一些要点。在应用组中,您可以立即共享 NSUSerdefaults。您可以毫无问题地实施一个解决方案,该解决方案将在每次键盘加载时简单地返回最新值,检查是否授予完全访问权限并返回 true 或 false 的值并更新 NSUserdefault。这将是最多 5-8 行代码,并且应该很容易检查。然后,如果您更新 NSUserdefaults,您还可以修改父应用中的内容。 我真的不明白你的评论如何回答我用你的解决方案提出的两个问题。 好吧,对不起。我以为我已经用清晰的英语和易于理解的观点表达了自己。对此感到抱歉。我想说的是 NSUserdefaults 可以在键盘运行时立即写入和访问,不需要完全访问权限。我想使用您的代码向您展示如何在容器应用程序中访问返回的 true 或 false 值。您说如果您没记错的话,应用程序需要获得完全访问权限才能访问 NSUserdefaults。你错了,任何扩展都可以访问应用组中的NSUserdefaults【参考方案2】:您可以轻松测试是否在 iOS 11 及更高版本上授予“允许完全访问”权限。
-
要获得“允许完全访问”权限,首先将
UIInputViewController 类。
添加代码。代码返回一个布尔值。
Objective-C
[self hasFullAccess];
斯威夫特
self.hasFullAccess
https://developer.apple.com/documentation/uikit/uiinputviewcontroller/2875763-hasfullaccess?changes=_2
【讨论】:
【参考方案3】:Objective-C
[UIInputViewController new].hasFullAccess;
【讨论】:
以上是关于如何测试是不是从包含应用程序授予“允许完全访问”权限?的主要内容,如果未能解决你的问题,请参考以下文章
如何知道用户之前是不是已经授予 Facebook SDK 权限
如何检查用户是不是已在 React Native Android 中授予相机权限?