You can get a list of the keyboards installed on the iOS device using:
NSUserDefaults *userDeafaults = [NSUserDefaults standardUserDefaults];
NSDictionary * userDefaultsDict = [userDeafaults dictionaryRepresentation];
NSLog(@"%@", userDefaultsDict);
This yields something in the console like:
{
...
AppleKeyboards = (
"en_US@hw=US;sw=QWERTY",
"es_ES@hw=Spanish - ISO;sw=QWERTY-Spanish",
"emoji@sw=Emoji",
"com.swiftkey.SwiftKeyApp.Keyboard"
);
AppleKeyboardsExpanded = 1;
...
}
This tells me that the device has the Spanish, Emoji and SwiftKey keyboards installed, but it tells me nothing about which will be used when the keyboard comes up.
Is there a way to tell?
@Leo Natan's answers is cool but it's may return
nil
when the keyboard have not display.So here I use the string to find the
UIKeyboardInputMode
's property.I can tell you that this can find out the current keyboard because it's comes from Apple's Private API.
Code here:
And more:
Actually we can also use the
displayName
or theidentifier
and more.Leo Natan's answer is great, but I would like to add something to it. You can actually get the current input mode at any time, not just when the keyboard is open, like this:
Please note that
textView.textInputMode
isnil
for the Emoji keyboard for some reason.Also, in addition to
displayName
andextendedDisplayName
, there are other keys you can retrieve, such asidentifier
,normalizedIdentifier
(iOS 8+),hardwareLayout
, ... See the full API here:https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UIKeyboardInputMode.h
Now I'm not sure if using any of those is more risky than
displayName
for App Store approval...There is no public API for this, but I found a solution for you, which requires very little "gray area API" (I define API as "gray area" if an API is not normally exposed, but can be hidden with little to no work).
iOS has the following class:
UITextInputMode
This class gives you all the input methods the user can use. Using the following query will give you the currently used, only when the keyboard is open:
To get the display name of the extension (or regular Apple keyboard), use:
or
This only works when the keyboard is visible. So you will have to monitor input mode change yourself using
We actually need to delay obtaining the current input mode, as the notification is sent before the keyboard internal implementation has updated the system with new value. Obtaining it on the next runloop works well.