Mostrando o teclado Emoji do sistema por padrão no iOS 13

17

Solução

Aqui está uma solução completa / solução alternativa para esse problema, vote na resposta de Blld também, porque essa era a parte vital de informação necessária!

Títulos alternativos para ajudar na pesquisa

  • Mostrando o teclado Emoji como padrão para um objeto UIKeyInput (no iOS 13)
  • Forçar o iOS 13 a mostrar o teclado Emoji
  • Configurando o UITextInputMode.primaryLanguageemoji
  • Defina programaticamente o teclado como emoji

Antes do retornar o UITextInputModecom primaryLanguage"igual emoji" seria o padrão para mostrar o teclado emoji (veja a imagem abaixo).

Captura de tela do teclado Emoji

Exemplo de código para retornar o "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
    }
}

A execução desse código no iOS 12 definirá o teclado para o teclado Emoji do sistema, mas no iOS 13 isso não afetará.

Isto é um erro conhecido? Existe uma solução alternativa?

Atualizações

  • Solicitada pelo @Navillus , a lista completa de "modos de entrada ativos" é; "en-GB", "emoji"
  • Testado e confirmado em; 13.0, 13.1, 13.1.1, 13.1.2 e 13.2 (semente 1)
rjstelling
fonte
Engraçado: consegui executar esse código com sucesso no simulador, mas não no dispositivo. iOS 13 para ambos. Agora estou intrigado.
Marina Aguilar
Trabalhou para mim em um simulador também. @rjstelling Qual é a lista completa dos activeInputModes no seu dispositivo? Você pode verificar com isso: print (UITextInputMode.activeInputModes.map ({(m) -> String em troca m.primaryLanguage ?? ""}))
Navillus
@Navillus - respostas na pergunta, a sua "en-GB" e "emoji"
rjstelling
11
Agora isso foi corrigido no iOS 13.4 / Xcode 11.4
Stephen

Respostas:

9

Arquivei um radar para o iOS 13 porque tenho um aplicativo bilíngue em japonês / inglês. Alguns campos são japoneses e outros ingleses, portanto, obviamente, faz sentido apresentar o tipo de teclado correto ao usuário, em vez de fazê-lo girar 20 vezes.

Havia uma solução alternativa para isso, e era isso que, após o UIKit chamar 'textInputMode', no thread principal, você poderia fazer isso:

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

Isso força o teclado a recarregar depois de responder com o textInputMode que você queria. Eu os informei sobre o bug e a solução alternativa para obter o comportamento correto.

Portanto, no iOS 13.1, o bug não foi corrigido, mas eles bloquearam minha solução alternativa.

Agradável. Não relatarei nenhum erro a eles novamente. Se encontrar uma solução alternativa, apenas a utilizarei.

Parece que agora eles estão desativando silenciosamente esse recurso. E é um recurso, esse é literalmente o objetivo dessa chamada de método, para descobrir qual modo de entrada deve ser apresentado ao usuário.

Ele ainda funciona ok embora se você tiver outra língua e deseja selecionar Inglês.

Portanto, se meu usuário definir japonês como a seleção de teclado, eu posso forçar um teclado em inglês. Apenas não o contrário. Qualquer tentativa de obter um modo de entrada japonês acaba em um teclado em inglês.

EDITAR:

Há outro caminho que você pode solucionar, mas envolve a descoberta e o uso da API interna, o que não é simples. Você precisaria essencialmente encontrar as funções usadas para gerenciar os resultados de pressionar o botão do globo. Se você fizer isso, simulará essencialmente os toques do usuário e os efeitos serão amplos, ou seja, o teclado também será alterado para outros aplicativos. Portanto, não é recomendado, 100% falhará no envio da App Store. Não quero publicá-lo por causa dos resultados da minha última solução alternativa.

Eu acho que não é possível entender a Apple com muita facilidade. Tudo o que sei é que:

  1. a API não está funcionando como publicada
  2. foi relatado e eles não corrigiram o erro
  3. desde o momento do relatório, eles quebraram (intencionalmente ou não) a solução alternativa

Portanto, soluções alternativas futuras devem ser armazenadas até que suas intenções sejam claras e / ou eles corrijam esse bug (que é o que deveriam fazer). Simplesmente revogar parte da API sem publicar a alteração é um erro grave.

dbquarrel
fonte
Obrigado por isso! Isso me ajudou a entender isso um pouco mais. Duvido que tenham propositalmente bloqueado sua solução alternativa, isso me parece mais um bug. Se eles quisessem remover o recurso, poderiam excluí-lo.
Rjstelling
"Nunca atribua à malícia aquilo que é adequadamente explicado pela estupidez."
Rjstelling
Alguém encontrou outra solução alternativa para isso?
Shujaat
8

Nota: verifique se o teclado Emoji está ativado.

Parece ser um bug do iOS 13, a solução alternativa (para dispositivos, isso não afeta o Simulador) é substituir a textInputContextIdentifierpropriedade e retornar um valor não nulo.

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

Obrigado a blld por sua resposta.

rjstelling
fonte
11
Estou tendo o mesmo tipo de problema ao exibir o bloco decimal em inglês. O idioma do meu aplicativo está em árabe e quero que meu campo de texto mostre o teclado decimal em inglês. Eu fiz as etapas acima mencionadas, substituindo esses vars e métodos. No textInputMode, retorno apenas o modo "en-US", mas ainda mostra o teclado decimal em árabe no iOS 13. #
23419
Não funciona para mim no iOS 13.2
atereshkov 08/11/19
Posso confirmar que isso não parece trabalhar mais para iOS 13.2 ...
Jay Lee
@JayLee Certifique-se de que você tem o teclado Emoji habilitado
rjstelling
7

Você precisa definir textinputcontextidentifierno campo de texto para que o iOS saiba onde salvar o arquivo personalizado.textInputMode

Não está escrito no documento, mas funciona.

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

blld
fonte
2
Isso funcionou para mim no iOS 13. Apenas retornando "emoji"ou ""para textInputContextIdentifierno meu costume UITextFieldmostra o teclado Emoji (quando combinado com a textInputModesubstituição na pergunta). Obrigado pela dica sobre os documentos ocultos. B
Baza207
Não funciona quando queremos aplicar o teclado decimal em inglês a um UITextField quando a localização do aplicativo está em árabe.
Shujaat