Mostrar el teclado Emoji del sistema de forma predeterminada en iOS 13

17

Solución

Aquí hay una solución / solución completa para este problema, ¡vote por favor la respuesta de Blld también porque esta era la información vital necesaria!

Títulos alternativos para ayudar a la búsqueda

  • Mostrar el teclado Emoji como predeterminado para un objeto UIKeyInput (en iOS 13)
  • Forzar iOS 13 para mostrar el teclado Emoji
  • Configurar el UITextInputMode.primaryLanguageemoji
  • Programáticamente configurar el teclado en emoji

Antes de que devolviera el UITextInputModecon primaryLanguageese "emoji" equivalente, se mostraría de forma predeterminada el teclado Emoji (ver imagen a continuación).

Captura de pantalla del teclado Emoji

Código de ejemplo para devolver el "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
    }
}

Ejecutar este código en iOS 12 configurará el teclado en el sistema Emoji Keyboard, pero en iOS 13 no tiene ningún efecto.

¿Es esto un error conocido? ¿Hay alguna solución?

Actualizaciones

  • Solicitado por @Navillus , la lista completa de "modos de entrada activa" es; "en-GB", "emoji"
  • Probado y confirmado en; 13.0, 13.1, 13.1.1, 13.1.2 y 13.2 (semilla 1)
rjstelling
fuente
Lo curioso: pude ejecutar este código con éxito en el simulador, pero no en el dispositivo. iOS 13 para ambos. Ahora estoy intrigado.
Marina Aguilar
También funcionó para mí en un simulador. @rjstelling ¿Cuál es la lista completa de activeInputModes en su dispositivo? Puede verificar con esto: print (UITextInputMode.activeInputModes.map ({(m) -> String in return m.primaryLanguage ?? ""}))
Navillus
@Navillus - respuestas en la pregunta, es "en-GB" y "emoji"
rjstelling
1
Esto ahora está arreglado en iOS 13.4 / Xcode 11.4
Stephen

Respuestas:

9

Archivé un radar sobre esto para iOS 13 porque tengo una aplicación bilingüe japonés / inglés. Algunos campos son japoneses y otros ingleses, así que obviamente tiene sentido presentar el tipo de teclado correcto al usuario en lugar de hacer que se muevan 20 veces hacia adelante y hacia atrás.

Hubo una solución para esto, y eso fue que después de que el UIKit llama 'textInputMode', en el hilo principal podría hacer esto:

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

Esto obliga al teclado a recargarse después de responder con el textInputMode que deseaba. Les informé del error y la solución para obtener el comportamiento correcto.

Entonces, en iOS 13.1, el error no se solucionó, sin embargo, bloquearon mi solución.

Agradable. No les reportaré ningún error nuevamente. Más bien, si encuentro una solución alternativa, simplemente la usaré.

Entonces parece que ahora están desactivando silenciosamente esta función. Y es una característica, este es literalmente el propósito de esta llamada al método, para averiguar qué modo de entrada debe presentarse al usuario.

Sin embargo , todavía funciona bien si tienes otro idioma y quieres seleccionar inglés.

Entonces, si mi usuario establece el japonés como la selección de teclado, entonces puedo forzar un teclado en inglés. Simplemente no al revés. Cualquier intento de obtener un modo de entrada japonés termina en un teclado en inglés.

EDITAR:

Hay otra ruta que puede solucionar, pero implica el descubrimiento y el uso de API interna que no es sencilla. Esencialmente, tendría que encontrar las funciones utilizadas para administrar los resultados de presionar el botón de globo. Si hace eso, esencialmente está simulando los toques del usuario y tiene efectos de amplio alcance, es decir, el teclado también se cambiará para otras aplicaciones. Por lo tanto, no se recomienda, 100% fallará el envío de la App Store. No quiero publicarlo debido a los resultados de mi última solución.

Creo que no es posible entender a Apple muy fácilmente. Todo lo que sé es que:

  1. la API no funciona como se publicó
  2. fue reportado y no arreglaron el error
  3. desde el momento en que informaron, rompieron (intencionalmente o no) la solución

Por lo tanto, las futuras soluciones deben atesorarse hasta que sus intenciones sean claras y / o solucionen este error (que es lo que deberían hacer). Simplemente revocar parte de la API sin publicar el cambio es un error importante.

dbquarrel
fuente
¡Gracias por esto! Me ha ayudado a entender esto un poco más. Dudo que hayan bloqueado tu solución a propósito, esto me parece más un error. Si quisieran eliminar la función, podrían haberla dejado de usar.
rjstelling
"Nunca atribuya a la malicia lo que se explica adecuadamente por la estupidez".
rjstelling
¿Alguien ha encontrado otra solución para esto?
shujaat
8

NB: asegúrese de tener habilitado el teclado Emoji.

Esto parece ser un error de iOS 13, la solución (para dispositivos, esto no afecta al simulador) es anular la textInputContextIdentifierpropiedad y devolver un valor no 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
    }
}

Gracias a blld por su respuesta.

rjstelling
fuente
1
Tengo el mismo tipo de problema al mostrar el teclado decimal en inglés. El idioma de mi aplicación es el árabe y quiero que mi campo de texto muestre el teclado decimal en inglés. He realizado los pasos mencionados anteriormente anulando estos vars y métodos. En textInputMode, solo devuelvo el modo "en-US", pero aún muestra el teclado decimal árabe en iOS 13.
shujaat
No funciona para mí en iOS 13.2
atereshkov
Puedo confirmar que esto ya no parece funcionar para iOS 13.2 ...
Jay Lee
@ JayLee Asegúrate de tener el teclado Emoji habilitado
rjstelling
7

textinputcontextidentifierDebe configurar en el campo de texto para que iOS sepa dónde guardar el personalizadotextInputMode

No está escrito en el documento, pero funciona.

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

blld
fuente
2
Esto funcionó para mí en IOS 13. Sólo volviendo "emoji"o ""para textInputContextIdentifieren mis personalizados UITextFieldmuestra el teclado Emoji (cuando se combina con la textInputModeanulación de la cuestión). Gracias por el consejo sobre los documentos ocultos. 👍
Baza207
No funciona cuando queremos aplicar el decimal decimal en inglés para un UITextField cuando la localización de la aplicación está en árabe.
shujaat