How do I find out the current keyboard used on iOS8?

后端 未结 4 2096
暖寄归人
暖寄归人 2020-12-14 02:52

You can get a list of the keyboards installed on the iOS device using:

NSUserDefaults *userDeafaults = [NSUserDefaults standardUserDefaults];
NSDictionary *          


        
相关标签:
4条回答
  • 2020-12-14 03:13

    it works for me Swift 5.0

     NotificationCenter.default.addObserver(self, selector: #selector(keyBoardChanged(_:)), name:UITextInputMode.currentInputModeDidChangeNotification, object: nil)
    
      @objc func keyBoardChanged(_ notification: NSNotification){
        if let identifier = textField.textInputMode?.perform(NSSelectorFromString("identifier"))?.takeUnretainedValue() as? String{
            if identifier == "YOUR APP IDENTIFIER"{
                //Do Whatever you required :) 
            }
        }
     }
    
    0 讨论(0)
  • 2020-12-14 03:16

    @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:

    + (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;
    }
    

    And more:

    + (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;
    }
    

    Actually we can also use the displayName or the identifier and more.

    0 讨论(0)
  • 2020-12-14 03:30

    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:

    UITextInputMode* inputMode = [[[UITextInputMode activeInputModes] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"isDisplayed = YES"]] lastObject];
    

    To get the display name of the extension (or regular Apple keyboard), use:

    [inputMode valueForKey:@"displayName"]
    

    or

    [inputMode valueForKey:@"extendedDisplayName"]
    

    This only works when the keyboard is visible. So you will have to monitor input mode change yourself using

    [[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"]);
         });
     }];
    

    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.

    0 讨论(0)
  • 2020-12-14 03:38

    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:

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

    Please note that textView.textInputMode is nil for the Emoji keyboard for some reason.

    Also, in addition to displayName and extendedDisplayName, there are other keys you can retrieve, such as identifier, 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...

    0 讨论(0)
提交回复
热议问题