关于Swift:默认情况下在iOS 13上显示系统Emoji键盘

Showing the system Emoji keyboard by default on iOS 13

解决方案

这里是针对此问题的完整解决方案/解决方法,也请投票Blld的答案,因为这是所需的重要信息!

辅助搜索的替代标题

  • 将Emoji键盘默认显示为UIKeyInput对象(在iOS 13中)
  • 强制iOS 13显示表情符号键盘
  • UITextInputMode.primaryLanguage设置为表情符号
  • 以编程方式将键盘设置为表情符号

在ios13之前,返回UITextInputModeprimaryLanguage等于" emoji"的按钮将默认显示Emoji键盘(请参见下图)。

EmojiUITextInputMode的示例代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//
//  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
    }
}

在iOS 12上运行此代码会将键盘设置为系统Emoji键盘,但在iOS 13上则无效。

这是一个已知的错误吗?有解决方法吗?

更新

  • 由@Navillus请求,"活动输入模式"的完整列表为;" en-GB"," emoji"
  • 经过测试并确认; 13.0、13.1、13.1.1、13.1.2和13.2(种子1)


我为此在iOS 13上引起了轰动,因为我有一个双语的日语/英语应用程序。有些字段是日语,有些是英语,因此显然向用户展示正确的键盘类型是有意义的,而不是使它们来回翻转20次。

有一个解决方法,就是在UIKit调用\\'textInputMode \\'之后,您可以在主线程中执行以下操作:

1
2
3
4
// has to be done after the textInputMode method is called
if #available(iOS 13, *) {
    textField.keyboardType = textField.keyboardType
}

这将强制键盘在回答所需的textInputMode后重新加载。我向他们通报了该错误以及解决方法,以获取正确的行为。

因此在iOS 13.1中,该错误未得到修复,但是它们阻止了我的解决方法。

不错。我不会再向他们报告任何错误。相反,如果我找到解决方法,我只会使用它。

因此,似乎他们现在正在静默禁用此功能。这是一个功能,从字面上讲,这就是此方法调用的目的,以找出应向用户提供哪种输入模式。

即使您使用另一种语言并想要选择英语,它仍然可以正常工作。

因此,如果用户将日语设置为键盘选择,则可以强制使用英语键盘。并非相反。任何尝试获得日语输入模式的尝试都将最终以英语键盘进行。

编辑:

还有另一种方法可以解决,但是涉及发现和使用内部API并不容易。您实际上必须找到用于管理按地球按钮的结果的功能。如果这样做,实际上是在模拟用户的点击,并且具有广泛的效果,也就是说,其他应用程序的键盘也将更改。因此不建议这样做,因为100%的应用商店提交都会失败。由于最后一个解决方法的结果,我不想发布它。

我认为不可能很容易理解Apple。我所知道的是:

  • API无法正常运行
  • 据报道,他们没有修复错误
  • 自报告之日起,他们(有意或无意)破坏了解决方法
  • 因此,应该future积未来的解决方法,直到其意图明确和/或他们修复了此错误(这是他们应该做的)。仅仅撤销部分API而不发布更改是一个主要错误。


    NB: Make sure you have the Emoji keyboard enabled.

    这似乎是一个iOS 13错误,解决方法(对于设备,这不影响模拟器)是重写textinputcontextidentifier属性并返回非nil值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    //
    //  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.


    您需要在textField上设置textinputcontextidentifier,以便iOS知道将自定义textInputMode

    保存在何处

    它没有写在文档中,但是可以使用。

    参考:https://developer.apple.com/documentation/uikit/uiresponder/1621091-textinputcontextidentifier