您可以使用以下方式获取安装在iOS设备上的键盘列表:
NSUserDefaults *userDeafaults = [NSUserDefaults standardUserDefaults]; NSDictionary * userDefaultsDict = [userDeafaults dictionaryRepresentation]; NSLog(@"%@",userDefaultsDict);
这在控制台中产生一些东西,如:
{ ... AppleKeyboards = ( "en_US@hw=US;sw=QWERTY","es_ES@hw=Spanish - ISO;sw=QWERTY-Spanish","emoji@sw=Emoji","com.swiftkey.SwiftKeyApp.Keyboard" ); AppleKeyboardsExpanded = 1; ... }
这告诉我,该设备安装了西班牙语,表情符号和SwiftKey键盘,但是当键盘出现时,它将告诉我什么都不会使用.
有没有办法告诉?
解决方法
没有公开的API,但是我发现了一个解决方案,它需要很少的“灰色区域API”(我将API定义为“灰色区域”,如果一个API通常不被暴露,但是可以很少隐藏工作).
iOS有以下类:UITextInputMode
这个类给你所有用户可以使用的输入方法.使用以下查询将会给您当前使用的,只有当键盘打开时:
UITextInputMode* inputMode = [[[UITextInputMode activeInputModes] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"isDisplayed = YES"]] lastObject];
[inputMode valueForKey:@"displayName"]
要么
[inputMode valueForKey:@"extendedDisplayName"]
这只有当键盘可见时才有效.所以你必须自己监视输入模式的改变
[[NSNotificationCenter defaultCenter] addObserverForName:UITextInputCurrentInputModeDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { dispatch_async(dispatch_get_main_queue(),^{ NSLog(@"%@",[[[[UITextInputMode activeInputModes] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"isDisplayed = YES"]] lastObject] valueForKey:@"extendedDisplayName"]); }); }];
我们实际上需要延迟获取当前的输入模式,因为通知是在键盘内部实现使用新值更新系统之前发送的.在下一个循环中获取它的效果很好.