如何检查“允许完全访问”在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) } }