Domyślne wyświetlanie systemowej klawiatury Emoji w systemie iOS 13

17

Rozwiązanie

Oto pełne rozwiązanie / obejście tego problemu, proszę również głosować na odpowiedź Bllda, ponieważ była to niezbędna niezbędna informacja!

Alternatywne tytuły ułatwiające wyszukiwanie

  • Wyświetlanie domyślnej klawiatury Emoji dla obiektu UIKeyInput (w iOS 13)
  • Wymuś iOS 13, aby wyświetlić klawiaturę Emoji
  • Ustawienie UITextInputMode.primaryLanguageemoji
  • Programowo ustaw klawiaturę na emoji

Przed zwracanie UITextInputModez primaryLanguagetym „emoji” domyślnie pokazywałoby klawiaturę Emoji (patrz obrazek poniżej).

Zrzut ekranu z klawiaturą emoji

Przykładowy kod zwracający „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
    }
}

Uruchomienie tego kodu w systemie iOS 12 spowoduje ustawienie klawiatury na systemową klawiaturę Emoji, ale w systemie iOS 13 nie ma to wpływu.

Czy to znany błąd? Czy jest w pobliżu praca?

Aktualizacje

  • Na żądanie @Navillus pełna lista „aktywnych trybów wprowadzania” jest następująca; „en-GB”, „emoji”
  • Testowane i potwierdzone dnia; 13.0, 13.1, 13.1.1, 13.1.2 i 13.2 (materiał siewny 1)
rjstelling
źródło
Zabawne: udało mi się pomyślnie uruchomić ten kod na symulatorze, ale nie na urządzeniu. iOS 13 dla obu. Teraz jestem zaintrygowany.
Marina Aguilar,
Pracowałem też dla mnie w symulatorze. @rjstelling Jaka jest pełna lista activeInputModes na twoim urządzeniu? Możesz to sprawdzić za pomocą: print (UITextInputMode.activeInputModes.map ({(m) -> String w zamian m.primaryLanguage ?? ""}))
Navillus
@Navillus - odpowiedzi na pytanie, jego „en-GB” i „emoji”
rjstelling
1
Zostało to teraz naprawione w iOS 13.4 / Xcode 11.4
Stephen

Odpowiedzi:

9

Złożyłem radar na ten temat dla iOS 13, ponieważ mam dwujęzyczną japońską / angielską aplikację. Niektóre pola są japońskie, a niektóre angielskie, więc oczywiście sensowne jest zaprezentowanie użytkownikowi odpowiedniego rodzaju klawiatury, zamiast 20-krotnego przewijania w tę iz powrotem.

Było obejście tego problemu, a mianowicie, że po wywołaniu przez UIKit „textInputMode” w głównym wątku można to zrobić:

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

To zmusza klawiaturę do ponownego załadowania po odpowiedzi z żądanym tekstem TextInputMode. Poinformowałem ich o błędzie i obejściu, aby uzyskać prawidłowe zachowanie.

Tak więc w iOS 13.1 błąd nie został naprawiony, jednak zablokowały moje obejście.

Miły. Nie będę im więcej zgłaszać błędów. Raczej jeśli znajdę obejście, po prostu go wykorzystam.

Wygląda więc na to, że teraz cicho wyłączają tę funkcję. Jest to funkcja, która jest dosłownie celem tego wywołania metody, aby dowiedzieć się, jaki tryb wprowadzania powinien zostać przedstawiony użytkownikowi.

To wciąż działa OK ale jeśli masz inny język i chcesz wybrać angielsku.

Więc jeśli mój użytkownik ustawi japońską jako klawiaturę, mogę wymusić angielską klawiaturę. Po prostu nie na odwrót. Wszelkie próby uzyskania japońskiego trybu wprowadzania kończą się na angielskiej klawiaturze.

EDYTOWAĆ:

Istnieje inna ścieżka, którą można obejść, ale wiąże się to z odkryciem i użyciem wewnętrznego interfejsu API, co nie jest proste. Trzeba będzie zasadniczo znaleźć funkcje używane do zarządzania wynikami po naciśnięciu przycisku kuli ziemskiej. Jeśli to zrobisz, zasadniczo symulujesz stuknięcia użytkownika i ma on szeroki zakres efektów, to znaczy klawiatura zostanie zmieniona również dla innych aplikacji. Więc nie jest to zalecane, w 100% nie powiedzie się przesłanie App Store. Nie chcę tego publikować z powodu wyników mojego ostatniego obejścia.

Myślę, że nie można bardzo łatwo zrozumieć Apple. Wiem tylko, że:

  1. interfejs API nie działa zgodnie z publikacją
  2. zostało zgłoszone i nie naprawili błędu
  3. od momentu zgłoszenia złamali (umyślnie lub nie) obejście

Więc przyszłe obejścia powinny być gromadzone, dopóki ich intencje nie będą jasne i / lub nie naprawią tego błędu (co powinni zrobić). Po prostu odwołanie części interfejsu API bez opublikowania zmiany jest poważnym błędem.

dbquarrel
źródło
Dzięki za to! Pomogło mi to zrozumieć to trochę bardziej. Wątpię, by celowo zablokowali obejście tego problemu, co wydaje mi się bardziej błędem. Gdyby chcieli usunąć tę funkcję, mogliby ją wycofać.
rjstelling
„Nigdy nie przypisuj złośliwości temu, co właściwie tłumaczy głupota”.
rjstelling
Czy ktoś znalazł inne rozwiązanie tego problemu?
shujaat
8

Uwaga: upewnij się, że masz włączoną klawiaturę Emoji.

Wygląda na to, że jest to błąd w systemie iOS 13, a obejście tego problemu (w przypadku urządzeń nie ma to wpływu na Symulator) polega na zastąpieniu textInputContextIdentifierwłaściwości i zwróceniu wartości innej niż zero.

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

Dzięki blld za jego odpowiedź.

rjstelling
źródło
1
Mam ten sam problem z wyświetlaniem angielskiej klawiatury dziesiętnej. Język mojej aplikacji jest w języku arabskim i chcę, aby moje pole tekstowe wyświetlało angielski dziesiętny pad. Zrobiłem wyżej wymienione kroki, zastępując te zmienne i metody. W textInputMode zwracam tylko tryb „en-US”, ale nadal pokazuje arabski pad dziesiętny w iOS 13.
shujaat 28.10.19
Nie działa dla mnie na iOS 13.2
atereshkov
Mogę potwierdzić, że wydaje się, że to już nie działa na iOS 13.2 ...
Jay Lee
@JayLee Upewnij się, że masz włączoną klawiaturę Emoji
rjstelling
7

Musisz ustawić textinputcontextidentifierw polu tekstowym, aby iOS wiedział, gdzie zapisać niestandardowytextInputMode

Nie jest napisane w dokumencie, ale działa.

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

blld
źródło
2
Ten pracował dla mnie na iOS 13. Justa powrocie "emoji"lub ""na textInputContextIdentifiermoich własnych UITextFieldpokazów klawiaturę Emoji (w połączeniu z textInputModeręcznym w pytaniu). Dzięki za wskazówkę dotyczącą ukrytych dokumentów. 👍
Baza207
Nie działa, gdy chcemy wymusić angielski pad dziesiętny dla pola UITextField, gdy lokalizacja aplikacji jest w języku arabskim.
shujaat