keyboard ios8

keyboard - ¿Cómo se activa el "Permitir acceso total" en iOS 8?



ios8 (15)

ACTUALIZACIÓN 08/23/2017 para compatibilidad con iOS 10:

func isOpenAccessGranted() -> Bool{ UIPasteboard.general.string = "CHECK" return UIPasteboard.general.hasStrings }

iOS 8:

-(BOOL)isOpenAccessGranted{ return [UIPasteboard generalPasteboard]; }

Tenga en cuenta que el simulador siempre le dirá que tiene acceso total, para que funcione correctamente debe ejecutarlo desde un dispositivo.

En iOS 8, cuando desarrolle un teclado personalizado y establezca la propiedad RequestsOpenAccess en YES en info.plist, hay un botón para alternar en Configuración-> Agregar nuevo teclado llamado "Permitir acceso completo". ¿Cómo sabe el código de teclado personalizado que el usuario habilitó o deshabilitó esta opción?


Actualización: no es necesario activar el grupo de aplicaciones, como han mencionado otros, simplemente verifique el acceso al cartón:

- (BOOL)isFullAccessGranted { return !![UIPasteboard generalPasteboard]; }

NOTA: Lo siguiente ya no funciona, incluso si tiene el grupo de aplicaciones habilitado ...

Para un teclado personalizado con un grupo de aplicaciones habilitado, la siguiente es una manera rápida y confiable de probar el estado del interruptor "Permitir acceso completo":

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 }


Esta es la respuesta más simple de lejos y no requiere que configure grupos de aplicaciones. Se prueba en producción en la tienda de aplicaciones.

+ (BOOL)isOpenAccessGranted { return [UIPasteboard generalPasteboard]; }


Este código funciona para mí, también en grupos de aplicaciones: https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/AddingCapabilities/AddingCapabilities.html#//apple_ref/doc/uid/TP40012582- CH26-SW61

Puede ser que funcione sin Grupos de aplicaciones también.

Y usé este código:

if(isOpenAccessGranted()){ NSLog("FULL ACCESS ON") } else{ NSLog("FULL ACCESS OFF") } } func isOpenAccessGranted() -> Bool { return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard) }


He estado probando esto hoy en iOS 10 y no es suficiente tener acceso al portapapeles. En iOS 10 puedes configurar el portapapeles en una var sin acceso completo. Aquí hay una solución que se me ocurrió ...

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 }

La prueba para ver si el portapapeles tiene algún contenido devuelve falso con el acceso completo desactivado, incluso cuando hay contenido en el portapapeles. Por supuesto, en realidad podría estar vacío, por lo que después de todas esas pruebas, puede intentar establecer algo en la mesa de trabajo sin preocuparse por reemplazar algo que ya está allí. Si tiene acceso y el portapapeles tenía contenido, entonces la prueba habría resultado verdadera, si no tiene acceso, entonces no puede sobrescribir algo que estaba allí.

HTH, Mike


Hoy, para iOS 9.2, puede verificar el acceso abierto por:

func isOpenAccessGranted() -> Bool { return UIPasteboard(name: "checkOpenedAccess", create: true) != nil }


Las aplicaciones con grupo de aplicaciones pueden usar:

func isOpenAccessGranted() -> Bool { let fm = NSFileManager.defaultManager() let containerPath = fm.containerURLForSecurityApplicationGroupIdentifier( AppGroup)?.path return fm.isWritableFileAtPath(containerPath!) }


Para aquellos de ustedes que usan iOS 10 y Objective-C, esto funcionará según lo previsto.

- (BOOL)hasFullAccess { UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; NSString *originalString = pasteboard.string; pasteboard.string = @"TEST"; if (pasteboard.hasStrings) { pasteboard.string = originalString; return YES; } else { return NO; } }


Para iOS 10 (Beta 5) cambiaron la API de UIPasteboard pero encontré que lo siguiente funcionaba:

let originalString = UIPasteboard.general.string UIPasteboard.general.string = "TEST" if UIPasteboard.general.hasStrings { UIPasteboard.general.string = originalString hasFullAccess = true } else { hasFullAccess = false }


Para iOS 10 usando Swift 2.3 (si no quiere convertir sus archivos a 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) } }


Solo usa

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ AudioServicesPlaySystemSound(1104); });

el tirck es, cuando el acceso completo está habilitado, el sonido se reproducirá, si no, porque su llamada está en el hilo de fondo no bloqueará el hilo principal


Solución Swift útil por @ hoiberg42:

func isOpenAccessGranted() -> Bool { return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard) }

¡Funciona de maravilla!


Solución iOS10: compruebe todos los tipos que pueden copiarse, si uno de ellos está disponible, tiene acceso total; de lo contrario, no.

PD: Nuevo teléfono y después de que los casos de actualización de iOS sean corregidos.

- Swift 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) } }


Una solución rápida

if let test = UIPasteboard.generalPasteboard() as? UIPasteboard{ NSLog("Full Access: On") return true }else{ NSLog("Full Access: Off") return false }

dentro de la función anterior, por supuesto.


iOS 11 ya no requiere ningún hackeo.

override var hasFullAccess: Bool { if #available(iOS 11.0, *) { return super.hasFullAccess// super is UIInputViewController. } if #available(iOS 10.0, *) { let original: String? = UIPasteboard.general.string UIPasteboard.general.string = " " let val: Bool = UIPasteboard.general.hasStrings if let str = original { UIPasteboard.general.string = str } return val } return UIPasteboard.general.isKind(of: UIPasteboard.self) }