Standardmäßig wird die Emoji-Tastatur des Systems unter iOS 13 angezeigt

17

Lösung

Hier ist eine vollständige Lösung / Problemumgehung für dieses Problem. Bitte stimmen Sie auch die Antwort von Blld ab , da dies die entscheidende Information war, die benötigt wurde!

Alternative Titel zur Unterstützung der Suche

  • Anzeigen der Emoji-Tastatur als Standard für ein UIKeyInput-Objekt (in iOS 13)
  • Erzwingen Sie, dass iOS 13 die Emoji-Tastatur anzeigt
  • Setzen Sie das UITextInputMode.primaryLanguageauf Emoji
  • Stellen Sie die Tastatur programmgesteuert auf Emoji ein

Vor der Rückkehr UITextInputModemit primaryLanguagedieser entsprach „Emoji“ zu zeigen , die Emoji - Tastatur Standard würde (siehe Bild unten).

Screenshot der Emoji-Tastatur

Beispielcode für die Rückgabe des "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
    }
}

Wenn Sie diesen Code unter iOS 12 ausführen, wird die Tastatur auf die Emoji-Tastatur des Systems eingestellt, unter iOS 13 hat dies jedoch keine Auswirkungen.

Ist das ein bekannter Fehler? Gibt es eine Problemumgehung?

Aktualisierung

  • Von @Navillus angefordert , ist die vollständige Liste der "aktiven Eingabemodi"; "en-GB", "emoji"
  • Getestet und bestätigt am; 13.0, 13.1, 13.1.1, 13.1.2 und 13.2 (Startwert 1)
rjstelling
quelle
Lustige Sache: Ich konnte diesen Code erfolgreich auf dem Simulator ausführen, aber nicht auf dem Gerät. iOS 13 für beide. Jetzt bin ich fasziniert.
Marina Aguilar
Arbeitete auch für mich in einem Simulator. @rjstelling Wie lautet die vollständige Liste der activeInputModes auf Ihrem Gerät? Sie können dies überprüfen: print (UITextInputMode.activeInputModes.map ({(m) -> String im Gegenzug m.primaryLanguage ?? ""}))
Navillus
@ Navillus - Antworten in der Frage, seine "en-GB" und "Emoji"
rjstelling
1
Dies ist jetzt in iOS 13.4 / Xcode 11.4
Stephen

Antworten:

9

Ich habe ein Radar für iOS 13 eingereicht, weil ich eine zweisprachige Japanisch / Englisch-App habe. Einige Felder sind japanisch und einige englisch, daher ist es offensichtlich sinnvoll, dem Benutzer den richtigen Tastaturtyp zu präsentieren, anstatt ihn 20 Mal hin und her drehen zu lassen.

Hierfür gab es eine Problemumgehung. Nachdem das UIKit 'textInputMode' aufgerufen hatte, konnten Sie im Hauptthread Folgendes tun:

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

Dadurch wird die Tastatur nach dem Antworten mit dem gewünschten textInputMode neu geladen. Ich informierte sie über den Fehler und die Problemumgehung, um das richtige Verhalten zu erhalten.

In iOS 13.1 wurde der Fehler also nicht behoben, sie blockierten jedoch meine Problemumgehung.

Nett. Ich werde ihnen keine Fehler mehr melden. Wenn ich eine Problemumgehung finde, verwende ich sie einfach.

Es scheint also, dass sie diese Funktion jetzt stillschweigend deaktivieren. Und es ist eine Funktion, die buchstäblich der Zweck dieses Methodenaufrufs ist, um herauszufinden, welcher Eingabemodus dem Benutzer präsentiert werden soll.

Es funktioniert jedoch immer noch in Ordnung, wenn Sie eine andere Sprache haben und Englisch auswählen möchten.

Wenn mein Benutzer Japanisch als Tastaturauswahl festlegt, kann ich eine englische Tastatur erzwingen. Nur nicht umgekehrt. Alle Versuche, einen japanischen Eingabemodus zu erhalten, werden auf einer englischen Tastatur ausgeführt.

BEARBEITEN:

Es gibt einen anderen Pfad, den Sie umgehen können, der jedoch die Ermittlung und Verwendung der internen API umfasst, was nicht einfach ist. Sie müssten im Wesentlichen die Funktionen finden, die zum Verwalten der Ergebnisse beim Drücken der Globustaste verwendet werden. Wenn Sie dies tun, simulieren Sie im Wesentlichen die Taps des Benutzers und es hat weitreichende Auswirkungen, dh die Tastatur wird auch für andere Apps geändert. Es wird also nicht empfohlen, die App Store-Übermittlung schlägt zu 100% fehl. Ich möchte es wegen der Ergebnisse meiner letzten Problemumgehung nicht veröffentlichen.

Ich denke, es ist nicht möglich, Apple sehr leicht zu verstehen. Ich weiß nur:

  1. Die API funktioniert nicht wie veröffentlicht
  2. Es wurde gemeldet und der Fehler wurde nicht behoben
  3. Seit dem Zeitpunkt der Berichterstattung haben sie (absichtlich oder nicht) die Problemumgehung gebrochen

Daher sollten zukünftige Problemumgehungen gehortet werden, bis ihre Absichten klar sind und / oder sie diesen Fehler beheben (was sie tun sollten). Das einfache Widerrufen eines Teils der API ohne Veröffentlichung der Änderung ist ein schwerwiegender Fehler.

dbquarrel
quelle
Danke dafür! Es hat mir geholfen, das ein bisschen besser zu verstehen. Ich bezweifle, dass sie Ihre Problemumgehung absichtlich blockiert haben. Das fühlt sich für mich eher wie ein Fehler an. Wenn sie die Funktion entfernen wollten, konnten sie sie verwerfen.
rjstelling
"Niemals der Bosheit das zuschreiben, was durch Dummheit angemessen erklärt wird."
rjstelling
Hat jemand eine andere Problemumgehung dafür gefunden?
Shujaat
8

NB: Stellen Sie sicher, dass die Emoji-Tastatur aktiviert ist.

Dies scheint ein iOS 13-Fehler zu sein. Die Problemumgehung (bei Geräten wirkt sich dies nicht auf den Simulator aus) besteht darin, die textInputContextIdentifierEigenschaft zu überschreiben und einen Wert ungleich Null zurückzugeben.

//
//  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
    }
}

Danke an blld für seine Antwort.

rjstelling
quelle
1
Ich habe die gleiche Art von Problem beim Anzeigen des englischen Dezimalblocks. Die Sprache meiner App ist Arabisch und ich möchte, dass in meinem Textfeld der englische Dezimalblock angezeigt wird. Ich habe die oben genannten Schritte ausgeführt, indem ich diese Variablen und Methoden überschrieben habe. Im textInputMode gebe ich nur den "en-US" -Modus zurück, aber es wird immer noch der arabische Dezimalblock in iOS 13
angezeigt
Funktioniert nicht für mich unter iOS 13.2
Atereshkov
Ich kann bestätigen, dass dies für iOS 13.2 nicht mehr zu funktionieren scheint ...
Jay Lee
@ JayLee Stellen Sie sicher, dass Sie die Emoji-Tastatur aktiviert haben
rjstelling
7

Sie müssen textinputcontextidentifierdas Textfeld festlegen, damit iOS weiß, wo die benutzerdefinierte Datei gespeichert werden solltextInputMode

Es ist nicht im Dokument geschrieben, aber es funktioniert.

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

blld
quelle
2
Dies funktionierte für mich unter iOS 13. Nur beim Zurückkehren "emoji"oder ""für textInputContextIdentifierin meinem Benutzer UITextFieldwird die Emoji-Tastatur angezeigt (in Kombination mit der textInputModeÜberschreibung in der Frage). Vielen Dank für den Tipp zu den versteckten Dokumenten. 👍
Baza207
Funktioniert nicht, wenn wir das englische Dezimalfeld für ein UITextField erzwingen möchten, wenn die Lokalisierung der App auf Arabisch erfolgt.
Shujaat