Visualizzazione della tastiera Emoji di sistema per impostazione predefinita su iOS 13


17

Soluzione

Ecco una soluzione completa / aggirare il problema, per favore vota anche la risposta di Blld perché questa era l'informazione vitale necessaria!

Titoli alternativi per facilitare la ricerca

  • Visualizzazione della tastiera Emoji come predefinita per un oggetto UIKeyInput (in iOS 13)
  • Forza iOS 13 a mostrare la tastiera Emoji
  • Impostando UITextInputMode.primaryLanguagesu emoji
  • Imposta programmaticamente la tastiera su emoji

Prima di restituzione UITextInputModedi primaryLanguage"emoji" equivaleva a mostrare la tastiera Emoji (vedi immagine sotto).

Schermata della tastiera Emoji

Codice di esempio per restituire "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
    }
}

L'esecuzione di questo codice su iOS 12 imposterà la tastiera sul sistema Emoji Keyboard, ma su iOS 13 non ha alcun effetto.

È un bug noto? C'è una soluzione?

aggiornamenti

  • Richiesto da @Navillus , l'elenco completo delle "modalità di input attive" è; "en-GB", "emoji"
  • Testato e confermato il; 13.0, 13.1, 13.1.1, 13.1.2 e 13.2 (seme 1)

Cosa divertente: sono stato in grado di eseguire correttamente questo codice sul simulatore, ma non sul dispositivo. iOS 13 per entrambi. Ora sono incuriosito.
Marina Aguilar,

Ha funzionato anche per me in un simulatore. @rjstelling Qual è l'elenco completo di activeInputModes sul tuo dispositivo? Puoi verificare con questo: print (UITextInputMode.activeInputModes.map ({(m) -> String in cambio m.primaryLanguage ?? ""}))
Navillus

@Navillus - risposte alla domanda, "en-GB" ed "emoji"
rjstelling

1
Questo problema è ora risolto in iOS 13.4 / Xcode 11.4
Stephen,

Risposte:


9

Ho archiviato un radar su questo per iOS 13 perché ho un'app bilingue giapponese / inglese. Alcuni campi sono giapponesi e un po 'inglese, quindi ovviamente ha senso presentare all'utente il giusto tipo di tastiera anziché farli girare avanti e indietro 20 volte.

C'era una soluzione per questo, e cioè che dopo che UIKit chiamava 'textInputMode', nel thread principale si poteva fare questo:

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

Questo impone alla tastiera di ricaricarsi dopo aver risposto con il TextInputMode desiderato. Li ho informati del bug e della soluzione alternativa per ottenere un comportamento corretto.

Quindi in iOS 13.1 il bug non è stato corretto, tuttavia hanno bloccato la mia soluzione alternativa.

Bello. Non segnalerò più alcun bug a loro. Piuttosto se trovo una soluzione alternativa la userò semplicemente.

Quindi sembra che ora stiano disabilitando silenziosamente questa funzione. Ed è una caratteristica, questo è letteralmente lo scopo di questa chiamata di metodo, per scoprire quale modalità di input dovrebbe essere presentata all'utente.

Funziona comunque bene se hai un'altra lingua e vuoi selezionare l'inglese.

Quindi, se il mio utente imposta il giapponese come selezione della tastiera, posso forzare una tastiera inglese. Solo non il contrario. Qualsiasi tentativo di ottenere una modalità di input giapponese finisce in una tastiera inglese.

MODIFICARE:

Esiste un altro percorso che è possibile aggirare attorno a questo, ma comporta il rilevamento e l'uso dell'API interna che non è semplice. Dovresti essenzialmente trovare le funzioni utilizzate per gestire i risultati della pressione del pulsante globo. Se lo fai, stai essenzialmente simulando i tocchi dell'utente e ha effetti ad ampio raggio, cioè la tastiera verrà cambiata anche per altre app. Quindi non è raccomandato, al 100% fallirà l'invio all'App Store. Non voglio pubblicarlo a causa dei risultati della mia ultima soluzione alternativa.

Penso che non sia possibile capire Apple molto facilmente. Tutto quello che so è che:

  1. l'API non funziona come pubblicato
  2. è stato segnalato e non hanno risolto il bug
  3. dal momento della segnalazione hanno risolto (intenzionalmente o meno) la soluzione alternativa

Quindi soluzioni alternative future dovrebbero essere accumulate fino a quando le loro intenzioni non saranno chiare e / o risolveranno questo bug (che è quello che dovrebbero fare). La semplice revoca di una parte dell'API senza pubblicare la modifica è un bug importante.


Grazie per questo! Mi ha aiutato a capirlo un po 'di più. Dubito che abbiano bloccato di proposito la tua soluzione, questo mi sembra più un bug. Se volessero rimuovere la funzionalità potrebbero deprecarla.
rjstelling

"Non attribuire mai alla malizia ciò che è adeguatamente spiegato dalla stupidità."
rjstelling

Qualcuno ha trovato un'altra soluzione per questo?
shujaat,

8

NB: assicurati di avere la tastiera Emoji abilitata.

Questo sembra essere un bug di iOS 13, il problema (per i dispositivi, ciò non influisce sul simulatore) è quello di sovrascrivere la textInputContextIdentifierproprietà e restituire un valore diverso da 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
    }
}

Grazie a Blld per la sua risposta.


1
Sto riscontrando lo stesso tipo di problema nel mostrare il decimale inglese. La lingua della mia app è in arabo e voglio che il mio campo di testo mostri il decimale inglese. Ho fatto i passaggi sopra menzionati ignorando questi parametri e metodi. In textInputMode, restituisco solo la modalità "en-US", ma mostra comunque il decimale arabo in iOS 13.
shujaat,

Non funziona per me su iOS 13.2
atereshkov

Posso confermare che questo non sembra funzionare più per iOS 13.2 ...
Jay Lee,

@JayLee Assicurati di avere la tastiera Emoji abilitata
rjstelling il

7

Devi impostare textinputcontextidentifiertextField in modo che iOS sappia dove salvare la personalizzazionetextInputMode

Non è scritto nel documento ma funziona.

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


2
Questo ha funzionato per me su iOS 13. Appena tornato "emoji"o ""per la textInputContextIdentifiermia personalizzazione UITextFieldmostra la tastiera Emoji (se combinata con l' textInputModeoverride nella domanda). Grazie per il suggerimento sui documenti nascosti. 👍
Baza207,

Non funziona quando vogliamo imporre il decimale inglese per un UITextField quando la localizzazione dell'app è in arabo.
shujaat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.