Search code examples
iosswiftkeyboarduikitemoji

Showing the system Emoji keyboard by default on iOS 13


Solution

Here is a full solution/work around for this issue, please up vote Blld's answer as well because this was the vital bit of info needed!

Alternative titles to aid search

  • Showing the Emoji keyboard as default for a UIKeyInput object (in iOS 13)
  • Force iOS 13 to show the Emoji keyboard
  • Setting the UITextInputMode.primaryLanguage to emoji
  • Programatically set the keyboard to emoji

Prior to returning the UITextInputMode with primaryLanguage that equaled "emoji" would default to showing the Emoji Keyboard (see image below).

Emoji keyboard screen shot

Example code for returning the "emoji" UITextInputMode.

//
//  ViewController.swift
//  Keyboard Info
//
//  Created by Richard Stelling on 30/09/2019.
//  Copyright © 2019 Richard Stelling. All rights reserved.
//

import UIKit

class TestButton: UIButton, UIKeyInput {

    var hasText: Bool = true

    func insertText(_ text: String) { print("\(text)") }

    func deleteBackward() {}


    override var canBecomeFirstResponder: Bool { return true }

    override var canResignFirstResponder: Bool { return true }

    override var textInputMode: UITextInputMode? {
        for mode in UITextInputMode.activeInputModes {
            if mode.primaryLanguage == "emoji" {
                return mode
            }
        }
        return nil
    }
}

Running this code on iOS 12 will set the keyboard to the system Emoji Keyboard, but on iOS 13 it has no affect.

Is this a known bug? Is there a workaround?

Updates

  • Requested by @Navillus, the full list of "active input modes" is; "en-GB", "emoji"
  • Tested and confirmed on; 13.0, 13.1, 13.1.1, 13.1.2 and 13.2 (seed 1)

Solution

  • NB: Make sure you have the Emoji keyboard enabled.

    This seems to be an iOS 13 bug, the work around (for devices, this does not affect the Simulator) is to override the textInputContextIdentifier property and return a non-nil value.

    //
    //  ViewController.swift
    //  Keyboard Info
    //
    //  Created by Richard Stelling on 30/09/2019.
    //  Copyright © 2019 Richard Stelling. All rights reserved.
    //
    
    import UIKit
    
    class TestButton: UIButton, UIKeyInput {
    
        var hasText: Bool = true
    
        override var textInputContextIdentifier: String? { "" } // return non-nil to show the Emoji keyboard ¯\_(ツ)_/¯ 
    
        func insertText(_ text: String) { print("\(text)") }
    
        func deleteBackward() {}
    
        override var canBecomeFirstResponder: Bool { return true }
    
        override var canResignFirstResponder: Bool { return true }
    
        override var textInputMode: UITextInputMode? {
            for mode in UITextInputMode.activeInputModes {
                if mode.primaryLanguage == "emoji" {
                    return mode
                }
            }
            return nil
        }
    }
    

    Thanks to blld for his answer.