Menampilkan sistem keyboard Emoji secara default di iOS 13

17

Larutan

Berikut ini adalah solusi lengkap / penyelesaian untuk masalah ini, mohon pilih jawaban Blld juga karena ini adalah informasi penting yang diperlukan!

Judul alternatif untuk membantu pencarian

  • Menampilkan keyboard Emoji sebagai default untuk objek UIKeyInput (di iOS 13)
  • Paksa iOS 13 untuk menampilkan keyboard Emoji
  • Mengatur UITextInputMode.primaryLanguageto emoji
  • Secara sistematis mengatur keyboard ke emoji

Sebelum mengembalikan UITextInputModedengan primaryLanguageyang sama dengan "emoji" akan secara default menampilkan Keyboard Emoji (lihat gambar di bawah).

Tangkapan layar keyboard Emoji

Contoh kode untuk mengembalikan "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
    }
}

Menjalankan kode ini di iOS 12 akan mengatur keyboard ke sistem Emoji Keyboard, tetapi di iOS 13 tidak ada pengaruhnya.

Apakah ini bug yang dikenal? Apakah ada solusinya?

Pembaruan

  • Diminta oleh @Navillus , daftar lengkap "mode input aktif" adalah; "en-GB", "emoji"
  • Diuji dan dikonfirmasi pada; 13.0, 13.1, 13.1.1, 13.1.2 dan 13.2 (seed 1)
rjstelling
sumber
Lucunya: Saya berhasil menjalankan kode ini di simulator, tetapi tidak di perangkat. iOS 13 untuk keduanya. Sekarang saya tertarik.
Marina Aguilar
Bekerja untuk saya di simulator juga. @rjstelling Apa daftar lengkap activeInputModes di perangkat Anda? Anda dapat memeriksa dengan ini: print (UITextInputMode.activeInputModes.map ({(m) -> String in return m.primaryLanguage ?? ""}))
Navillus
@Navillus - jawaban dalam pertanyaan, "en-GB" dan "emoji"
rjstelling
1
Ini sekarang diperbaiki di iOS 13.4 / Xcode 11.4
Stephen

Jawaban:

9

Saya mengajukan radar ini untuk iOS 13 karena saya memiliki aplikasi Jepang / Inggris bilingual. Beberapa bidang adalah bahasa Jepang dan bahasa Inggris jadi jelas masuk akal untuk menyajikan jenis keyboard yang tepat kepada pengguna alih-alih membuatnya bolak-balik 20 kali.

Ada solusi untuk ini, dan itu adalah setelah UIKit memanggil 'textInputMode', di utas utama Anda bisa melakukan ini:

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

Ini memaksa keyboard untuk memuat ulang setelah menjawab dengan textInputMode yang Anda inginkan. Saya memberi tahu mereka tentang bug, dan solusinya untuk mendapatkan perilaku yang benar.

Jadi di iOS 13.1 bug tidak diperbaiki, namun mereka memblokir solusi saya.

Bagus. Saya tidak akan melaporkan bug kepada mereka lagi. Alih-alih jika saya menemukan solusi, saya hanya akan menggunakannya.

Jadi sepertinya mereka sekarang secara diam-diam menonaktifkan fitur ini. Dan itu adalah fitur, ini benar-benar tujuan dari pemanggilan metode ini, untuk mengetahui mode input apa yang harus disajikan kepada pengguna.

Ini masih bekerja ok meskipun jika Anda memiliki bahasa lain dan ingin memilih bahasa Inggris.

Jadi jika pengguna saya menetapkan bahasa Jepang sebagai pilihan keyboard maka saya dapat memaksakan keyboard bahasa Inggris ke atas. Hanya saja tidak sebaliknya. Setiap upaya untuk mendapatkan mode input Jepang berakhir di keyboard bahasa Inggris.

EDIT:

Ada jalur lain yang bisa Anda atasi, tetapi ini melibatkan penemuan dan penggunaan API internal yang tidak mudah. Anda harus menemukan fungsi yang digunakan untuk mengelola hasil dari menekan tombol globe. Jika Anda melakukannya, Anda pada dasarnya mensimulasikan ketukan pengguna dan memiliki efek rentang luas, yaitu, keyboard akan diubah untuk aplikasi lain juga. Jadi tidak disarankan, 100% itu akan gagal pengiriman App Store. Saya tidak ingin mempostingnya karena hasil dari solusi terakhir saya.

Saya pikir itu tidak mungkin untuk memahami Apple dengan mudah. Yang saya tahu adalah:

  1. API tidak berfungsi seperti yang dipublikasikan
  2. itu dilaporkan dan mereka tidak memperbaiki bug
  3. sejak saat pelaporan mereka memecahkan (sengaja atau tidak) solusinya

Jadi solusi di masa depan harus ditimbun sampai niat mereka jelas dan / atau mereka memperbaiki bug ini (yang harus mereka lakukan). Mencabut sebagian API tanpa mempublikasikan perubahan adalah bug utama.

dbquarrel
sumber
Terima kasih untuk ini! Ini membantu saya memahami ini sedikit lebih. Saya ragu mereka sengaja memblokir solusi Anda, ini terasa lebih seperti bug bagi saya. Jika mereka ingin menghapus fitur, mereka dapat mencabutnya.
rjstelling
"Jangan pernah menganggap kedengkian sebagai sesuatu yang dijelaskan dengan cukup oleh kebodohan."
rjstelling
Adakah yang menemukan solusi lain untuk ini?
shujaat
8

NB: Pastikan Anda mengaktifkan keyboard Emoji.

Ini tampaknya merupakan bug iOS 13, penyelesaiannya (untuk perangkat, ini tidak mempengaruhi Simulator) adalah untuk menimpa textInputContextIdentifierproperti dan mengembalikan nilai non-nil.

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

Terima kasih blld untuk jawabannya.

rjstelling
sumber
1
Saya mengalami masalah yang sama dalam menunjukkan pad desimal bahasa Inggris. Bahasa aplikasi saya dalam bahasa Arab dan saya ingin bidang teks saya menampilkan pad desimal bahasa Inggris. Saya telah melakukan langkah-langkah yang disebutkan di atas dengan mengganti vars dan metode ini. Di textInputMode, saya hanya mengembalikan mode "en-US", tetapi masih menampilkan pad desimal arab di iOS 13.
shujaat
Tidak bekerja untuk saya di iOS 13.2
atereshkov
Saya dapat mengonfirmasi bahwa ini tampaknya tidak berfungsi lagi untuk iOS 13.2 ...
Jay Lee
@JayLee Pastikan Anda mengaktifkan keyboard Emoji
rjstelling
7

Anda perlu mengatur textinputcontextidentifiertextField agar iOS tahu di mana harus menyimpan customtextInputMode

Itu tidak ditulis dalam dokumen tetapi itu bekerja.

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

blld
sumber
2
Ini bekerja untuk saya di iOS 13. Baru saja kembali "emoji"atau ""untuk textInputContextIdentifierdi kebiasaan saya UITextFieldmenunjukkan keyboard Emoji (ketika dikombinasikan dengan textInputModemenimpa dalam pertanyaan). Terima kasih atas tipnya pada dokumen tersembunyi. 👍
Baza207
Tidak berfungsi ketika kami ingin menerapkan pad desimal bahasa Inggris untuk UITextField saat pelokalan aplikasi dalam bahasa Arab.
shujaat