Есть ли способ узнать, поддерживается ли Emoji в iOS?

Я создаю приложение iOS, и Emojis играют большую роль в нем.

В iOS 10.2 были выпущены новые emojis.

Я почти уверен, что, если у кого-то есть iOS 8, например, они бы не смогли увидеть эти эможи. Есть ли способ обнаружить это? Я пытаюсь динамически создавать список всех Emojis, которые поддерживаются в версии iOS для пользователей, но у меня проблемы.

Ответы

Ответ 1

Уточнение: Emoji - это просто символ в пространстве символов Unicode, поэтому настоящее решение работает для всех символов, а не только для Emoji.

Описание

Чтобы узнать, доступен ли символ Unicode (включая Emoji) на данном устройстве или ОС, запустите метод unicodeAvailable() ниже.

Он работает путем сравнения заданного символьного изображения с известным символом undefined Unicode U+1FFF.

unicodeAvailable(), расширение Character

private static let refUnicodeSize: CGFloat = 8
private static let refUnicodePng =
    Character("\u{1fff}").png(ofSize: Character.refUnicodeSize)

func unicodeAvailable() -> Bool {
    if let refUnicodePng = Character.refUnicodePng,
        let myPng = self.png(ofSize: Character.refUnicodeSize) {
        return refUnicodePng != myPng
    }
    return false
}

Обсуждение

  • Все символы будут отображаться как png с одинаковым размером (8), как определено в

    static let refUnicodeSize: CGFloat = 8

  • Изображение undefined character U+1FFF рассчитывается один раз в

    static let refUnicodePng = Character("\u{1fff}").png(ofSize: Character.refUnicodeSize)

  • Вспомогательный метод необязательно создает png из Character

    func png(ofSize fontSize: CGFloat) -> Data?

1. Пример: тест против 3 emoji

let codes:[Character] = ["\u{2764}","\u{1f600}","\u{1F544}"] // ❤️, 😀, undefined
for unicode in codes {
    print("\(unicode) : \(unicode.unicodeAvailable())")
}

3 characters

2. Пример: проверка диапазона символов Unicode

func unicodeRange(from: Int, to: Int) {
    for unicodeNumeric in from...to {
        if let scalar = UnicodeScalar(unicodeNumeric) {
            let unicode = Character(scalar)
            let avail = unicode.unicodeAvailable()
            let hex = String(format: "0x%x", unicodeNumeric)
            print("\(unicode) \(hex) is \(avail ? "" : "not ")available")
        }
    }
}

несколько сотен символов


Вспомогательная функция: Character до png

func png(ofSize fontSize: CGFloat) -> Data? {
    let attributes = [NSAttributedStringKey.font:
                          UIFont.systemFont(ofSize: fontSize)]
    let charStr = "\(self)" as NSString
    let size = charStr.size(withAttributes: attributes)

    UIGraphicsBeginImageContext(size)
    charStr.draw(at: CGPoint(x: 0,y :0), withAttributes: attributes)

    var png:Data? = nil
    if let charImage = UIGraphicsGetImageFromCurrentImageContext() {
        png = UIImagePNGRepresentation(charImage)
    }

    UIGraphicsEndImageContext()
    return png
}

► Найдите это решение на GitHub и детальную статью о Быстрые рецепты.