traba teclados teclado plus para descargar cambiar ios keyboard ios8

ios - teclados - teclado para iphone 7 plus



¿Cómo detectar si el teclado personalizado está activado desde la aplicación de contenedor del teclado? (4)

Aquí hay 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; }

Me preguntaba si hay un método que me permita detectar desde la aplicación de contenedor de teclado si el teclado asociado se ha 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 del contenedor donde el paso 1 sería "activar el teclado", y el paso 2 dependería de la finalización del paso 1. ¿Como tal, me interesa saber si hay una manera de detectar si la extensión del teclado está activada?

¡Gracias!


Los estados de la documentation actual 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: Comunicación y persistencia de datos entre aplicaciones con Grupos de aplicaciones

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

Opción de usar un contenedor compartido con la aplicación que contiene el teclado, que habilita funciones tales como proporcionar una IU de administración de léxico personalizada en la aplicación que contiene

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

Obstáculo no 2 : el uso de este conocimiento de configuración de un NSUserDefault , me permite pensar en un método en el que se pueda establecer esto. Pero no hay un método público que indique que una extensión está instalada. Así que este es un callejón sin salida por ahora.

-

[Actualización 1]

No es muy relevante, pero aún así vale la pena shouldAllowExtensionPointIdentifier : el método delegado de la aplicación shouldAllowExtensionPointIdentifier en combinación con la constante UIApplicationKeyboardExtensionPointIdentifier puede tratar con el rechazo de los teclados personalizados. Los identificadores de punto 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 la solución: ¿Cómo detectar una extensión de la aplicación está habilitada para contener la aplicación en iOS 8?

-

Esta es una respuesta de trabajo en curso que indica mis hallazgos hasta ahora, y espero que los actualice en los próximos días en caso de que encuentre una solución.


Por si acaso aquí está la versión Swift de la brillante y sorprendente 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 }


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