¿Cómo detectar si el teclado personalizado se activa desde la aplicación de contenedor del teclado?

Me preguntaba si existe un método que me permita detectar desde la aplicación de contenedor de teclado si el teclado asociado ha sido activado en la aplicación de Configuración del dispositivo.

Por ejemplo, estoy interesado en agregar una función simple de “pasos” dentro de la aplicación contenedor donde el paso 1 sería “activar el teclado”, y el paso 2 estaría supeditado a la finalización del paso 1. Como tal, estoy interesado en averiguar si hay una forma de detectar si la extensión del teclado está activada.

¡Gracias!

Este es un método que he usado en uno de mis proyectos. Creo que es lo que pediste, espero que te ayude.

- (BOOL)isCustomKeyboardEnabled { NSString *bundleID = @"com.company.app.customkeyboard"; // Replace this string with your custom keyboard's bundle ID NSArray *keyboards = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] objectForKey:@"AppleKeyboards"]; // Array of all active keyboards for (NSString *keyboard in keyboards) { if ([keyboard isEqualToString:bundleID]) return YES; } return NO; } 

Por si acaso aquí está la versión Swift de la shiny y asombrosa respuesta de Kurt:

 public func isKeyboardExtensionEnabled() -> Bool { guard let appBundleIdentifier = NSBundle.mainBundle().bundleIdentifier else { fatalError("isKeyboardExtensionEnabled(): Cannot retrieve bundle identifier.") } guard let keyboards = NSUserDefaults.standardUserDefaults().dictionaryRepresentation()["AppleKeyboards"] as? [String] else { // There is no key `AppleKeyboards` in NSUserDefaults. That happens sometimes. return false } let keyboardExtensionBundleIdentifierPrefix = appBundleIdentifier + "." for keyboard in keyboards { if keyboard.hasPrefix(keyboardExtensionBundleIdentifierPrefix) { return true } } return false } 

La documentación actual indica By default, your extension and its containing app have no direct access to each other's containers .

También indica que la aplicación contenedora puede compartir datos con el teclado de la siguiente manera:

 // Create and share access to an NSUserDefaults object. NSUserDefaults *mySharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.example.domain.MyShareExtension"]; // Use the shared user defaults object to update the user's account. [mySharedDefaults setObject:theAccountName forKey:@"lastAccountName"]; 

Lea más sobre esto: Comunicando y persistiendo datos entre aplicaciones con grupos de aplicaciones

Obstáculo no 1 : De acuerdo con la documentación, para que esto funcione, el acceso de RequestsOpenAccess en el plist debe establecerse en YES ya que obtendría la siguiente capacidad:

Opción para usar un contenedor compartido con la aplicación que contiene el teclado, lo que permite funciones como la configuración de una interfaz de usuario de administración de léxico personalizada en la aplicación que lo contiene

Solicitar acceso completo para un caso simple como este definitivamente no es preferido por mi parte.

Obstáculo no 2 : el uso de este conocimiento de establecer un NSUserDefault , me hace pensar en un método donde esto se puede establecer en su lugar. Pero no hay un método público que indique que se instaló una extensión. Entonces este es un callejón sin salida por ahora.

[Actualización 1]

No es súper relevante, pero aún vale la pena shouldAllowExtensionPointIdentifier : el método de delegado de la aplicación shouldAllowExtensionPointIdentifier en combinación con la constante UIApplicationKeyboardExtensionPointIdentifier puede UIApplicationKeyboardExtensionPointIdentifier uso de teclados personalizados. Los identificadores de puntos de extensión no son identificadores únicos de la extensión sino de su tipo.

Lea más sobre esto: ¿Puedo deshabilitar los teclados personalizados (iOS8) para mi aplicación?

[Actualización 2]

Otra pregunta con el mismo problema, pero sin solución: ¿Cómo detectar una extensión de aplicación está habilitada en la aplicación que contiene iOS 8?

Esta es una respuesta de trabajo en progreso que indica mis hallazgos hasta el momento, y espero actualizar los próximos días si encuentro una solución.

Puede usar esta función (Swift 3 y 4) para verificar si su extensión de teclado personalizada tiene acceso abierto o no:

 func isOpenAccessGranted() -> Bool{ if #available(iOS 10.0, *) { let originalString = UIPasteboard.general.string UIPasteboard.general.string = "Sour LeangChhean" if UIPasteboard.general.hasStrings { UIPasteboard.general.string = originalString ?? "" return true }else{ UIPasteboard.general.string = "" return false } } else { // Fallback on earlier versions if UIPasteboard.general.isKind(of: UIPasteboard.self) { return true }else{ return false } } }