如何检查“允许完全访问”在iOS 8中启用?
在iOS 8中,开发自定义键盘并在info.plist中将RequestsOpenAccess属性设置为YES时,在设置 – >添加名为“允许完全访问”的新键盘上有一个切换button。 自定义键盘代码如何知道用户启用或禁用此切换?
更新08/23/2017 iOS 10兼容性:
func isOpenAccessGranted() -> Bool{ UIPasteboard.general.string = "CHECK" return UIPasteboard.general.hasStrings }
iOS 8:
-(BOOL)isOpenAccessGranted{ return [UIPasteboard generalPasteboard]; }
请注意,模拟器会一直告诉你,你有完整的访问权限,所以为了正常工作,你需要从设备上运行它。
这是迄今为止最简单的答案,不需要您设置应用程序组。 它在应用程序商店的生产testing。
+ (BOOL)isOpenAccessGranted { return [UIPasteboard generalPasteboard]; }
对于iOS 10(Beta 5),他们更改了UIPasteboard API,但是我发现以下工作:
let originalString = UIPasteboard.general.string UIPasteboard.general.string = "TEST" if UIPasteboard.general.hasStrings { UIPasteboard.general.string = originalString hasFullAccess = true } else { hasFullAccess = false }
更新:不需要启用应用程序组,如其他人所述,只需检查是否可以访问粘贴板:
- (BOOL)isFullAccessGranted { return !![UIPasteboard generalPasteboard]; }
注意:即使您已启用应用程序组 ,以下内容也不再有效…
对于启用了应用程序组的自定义键盘,以下是testing“允许完全访问”开关状态的快速可靠方法:
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 }
对于使用Swift 2.3的iOS 10(如果您不想将文件转换为Swift 3.0)
func isOpenAccessGranted() -> Bool { if #available(iOSApplicationExtension 10.0, *) { let originalString = UIPasteboard.generalPasteboard().string UIPasteboard.generalPasteboard().string = "Test" if UIPasteboard.generalPasteboard().hasStrings { UIPasteboard.generalPasteboard().string = originalString return true } else { return false } } else { return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard) } }
我已经在iOS 10中testing了这一点,并且访问粘贴板看起来不够。 在iOS 10中,您可以将粘贴板设置为无法完全访问的变体。 这是我提出的解决scheme
func checkFullAccess() -> Bool { var hasFullAccess = false if #available(iOSApplicationExtension 10.0, *) { let pasty = UIPasteboard.general if pasty.hasURLs || pasty.hasColors || pasty.hasStrings || pasty.hasImages { hasFullAccess = true } else { pasty.string = "TEST" if pasty.hasStrings { hasFullAccess = true pasty.string = "" } } } else { // Fallback on earlier versions var clippy : UIPasteboard? clippy = UIPasteboard.general if clippy != nil { hasFullAccess = true } } return hasFullAccess }
即使在粘贴板上有内容时,testing以查看粘贴板是否具有某些内容也会返回错误并显示完全访问权限。 当然,它实际上可以是空的,所以在所有这些testing之后,您可以安全地尝试在粘贴板上设置某些内容,而不用担心replace已经存在的内容。 如果你有访问权限和粘贴板有内容,那么testing将返回true,如果你没有访问,那么你不能覆盖那里的东西。
HTH,Mike
此代码适用于我,也适用于应用组: https : //developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/AddingCapabilities/AddingCapabilities.html#//apple_ref/doc/uid/TP40012582- CH26-SW61
也许它会在没有应用程序组的情况下工作。
我用这个代码:
if(isOpenAccessGranted()){ NSLog("FULL ACCESS ON") } else{ NSLog("FULL ACCESS OFF") } } func isOpenAccessGranted() -> Bool { return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard) }
有用的Swift解决scheme@ hoiberg42:
func isOpenAccessGranted() -> Bool { return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard) }
奇迹般有效!
只是使用
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ AudioServicesPlaySystemSound(1104); });
tirck是,当完全访问启用时,声音将播放,如果没有,因为它的调用是在后台线程将不会阻止主线程
迅速的解决scheme
if let test = UIPasteboard.generalPasteboard() as? UIPasteboard{ NSLog("Full Access: On") return true }else{ NSLog("Full Access: Off") return false }
里面的function当然是上面的。
今天,对于iOS 9.2,您可以通过以下方式检查打开的访问权限
func isOpenAccessGranted() -> Bool { return UIPasteboard(name: "checkOpenedAccess", create: true) != nil }
具有应用组的应用可以使用:
func isOpenAccessGranted() -> Bool { let fm = NSFileManager.defaultManager() let containerPath = fm.containerURLForSecurityApplicationGroupIdentifier( AppGroup)?.path return fm.isWritableFileAtPath(containerPath!) }
对于那些使用iOS 10和Objective-C的人来说,这将会按照预期工作。
- (BOOL)hasFullAccess { UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; NSString *originalString = pasteboard.string; pasteboard.string = @"TEST"; if (pasteboard.hasStrings) { pasteboard.string = originalString; return YES; } else { return NO; } }
iOS10解决scheme:检查所有可复制types,如果其中一个可用,则您可以完全访问,否则不可以。
PS:新手机和iOS更新案例已修复。
– 斯威夫特2.3 –
static func isFullAccessGranted() -> Bool { if #available(iOSApplicationExtension 10.0, *) { if UIPasteboard.generalPasteboard().hasStrings { return true } else if UIPasteboard.generalPasteboard().hasURLs { return true } else if UIPasteboard.generalPasteboard().hasColors { return true } else if UIPasteboard.generalPasteboard().hasImages { return true } else // In case the pasteboard is blank { UIPasteboard.generalPasteboard().string = "" if UIPasteboard.generalPasteboard().hasStrings { return true }else { return false } } } else { // before iOS10 if UIPasteboard.generalPasteboard().isKindOfClass( UIPasteboard) { return true }else { return false } } }
– Swift 3.0 –
static func isFullAccessGranted() -> Bool { if #available(iOSApplicationExtension 10.0, *) { if UIPasteboard.general.hasStrings { return true } else if UIPasteboard.general.hasURLs { return true } else if UIPasteboard.general.hasColors { return true } else if UIPasteboard.general.hasImages { return true } else // In case the pasteboard is blank { UIPasteboard.general.string = "" if UIPasteboard.general.hasStrings { return true }else { return false } } } else { // before iOS10 return UIPasteboard.general.isKind(of: UIPasteboard.self) } }