¿Cómo descubro el keyboard actual usado en iOS8?

Puede get una list de los keyboards instalados en el dispositivo iOS usando:

NSUserDefaults *userDeafaults = [NSUserDefaults standardUserDefaults]; NSDictionary * userDefaultsDict = [userDeafaults dictionaryRepresentation]; NSLog(@"%@", userDefaultsDict); 

Esto produce algo en la console como:

 { ... AppleKeyboards = ( "en_US@hw=US;sw=QWERTY", "es_ES@hw=Spanish - ISO;sw=QWERTY-Spanish", "emoji@sw=Emoji", "com.swiftkey.SwiftKeyApp.Keyboard" ); AppleKeyboardsExpanded = 1; ... } 

Esto me dice que el dispositivo tiene instalados los keyboards en español, Emoji y SwiftKey, pero no me dice nada sobre qué se usará cuando aparezca el keyboard.

¿Se puede decir de alguna manera?

No hay una API pública para esto, pero encontré una solución para ti, que requiere muy poca "API de área gris" (defino API como "área gris" si una API no está normalmente expuesta, pero se puede ocultar con poco o nada trabajo).

iOS tiene la siguiente class: UITextInputMode

Esta class le proporciona todos los methods de input que el usuario puede usar. Usar la siguiente consulta le dará el usado actualmente, solo cuando el keyboard esté abierto :

 UITextInputMode* inputMode = [[[UITextInputMode activeInputModes] filtenetworkingArrayUsingPnetworkingicate:[NSPnetworkingicate pnetworkingicateWithFormat:@"isDisplayed = YES"]] lastObject]; 

Para get el nombre para mostrar de la extensión (o el keyboard normal de Apple), use:

 [inputMode valueForKey:@"displayName"] 

o

 [inputMode valueForKey:@"extendedDisplayName"] 

Esto solo funciona cuando el keyboard es visible. Por lo tanto, tendrá que controlar el cambio de modo de input utilizando usted mismo

 [[NSNotificationCenter defaultCenter] addObserverForName:UITextInputCurrentInputModeDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"%@", [[[[UITextInputMode activeInputModes] filtenetworkingArrayUsingPnetworkingicate:[NSPnetworkingicate pnetworkingicateWithFormat:@"isDisplayed = YES"]] lastObject] valueForKey:@"extendedDisplayName"]); }); }]; 

De hecho, necesitamos retrasar la obtención del modo de input actual, ya que la notificación se envía antes de que la implementación interna del keyboard haya actualizado el sistema con un nuevo valor. Obtenerlo en el próximo runloop funciona bien.

La respuesta de Leo Natan es genial, pero me gustaría agregar algo. En realidad, puede get el modo de input actual en cualquier momento, no solo cuando el keyboard está abierto, así:

 UITextView *textView = [[UITextView alloc] init]; UITextInputMode *inputMode = textView.textInputMode; 

Tenga en count que textView.textInputMode es nil para el keyboard Emoji por alguna razón.

Además, además de displayName y extendedDisplayName , hay otras keys que puede recuperar, como identifier , normalizedIdentifier (iOS 8+), hardwareLayout , … Vea la API completa aquí:

https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UIKeyboardInputMode.h

Ahora no estoy seguro de si usar cualquiera de ellos es más riesgoso que displayName para la aprobación de App Store …

Las respuestas de @Leo Natan son geniales, pero es posible que vuelvan a nil cuando el keyboard no se muestre.

Entonces aquí uso la cadena para encontrar la propiedad UIKeyboardInputMode .

Puedo decirte que esto puede averiguar el keyboard actual porque proviene de la API privada de Apple.

Código aquí:

 + (BOOL)isTheCustomKeyboard { UITextInputMode* inputMode = [UITextInputMode currentInputMode]; if ([inputMode respondsToSelector:NSSelectorFromString(@"identifier")]) { NSString* indentifier = [inputMode performSelector:NSSelectorFromString(@"identifier")]; if ([indentifier isEqualToString: YOUR_APP_ID]) { return YES; } } return NO; } 

Y más:

 + (BOOL)isContaintCustomKeyboard { NSArray * inputModes = [UITextInputMode activeInputModes]; for (id inputModel in inputModes) { if ([inputModel respondsToSelector:NSSelectorFromString(@"identifier")]) { NSString* indentifier = [inputModel performSelector:NSSelectorFromString(@"identifier")]; if ([indentifier isEqualToString: YOUR_APP_ID]) { return YES; } } } return NO; } 

En realidad, también podemos usar el displayName o el identifier y más.