有没有办法知道iOS中是否支持表情符号?

时间:2016-12-25 05:54:09

标签: ios emoji

我正在构建一个iOS应用程序,而Emojis在其中发挥了重要作用。

In iOS 10.2, new emojis were released.

我很确定如果有人拥有iOS 8,他们实际上无法看到这些表情符号。有没有办法检测到这个?我正在尝试动态构建用户iOS版本支持的所有Emojis列表,但我遇到了一些麻烦。

2 个答案:

答案 0 :(得分:22)

澄清:表情符号只是Unicode字符空间中的一个字符,因此本解决方案适用于所有字符,而不仅仅是表情符号。

概要

要知道给定设备或操作系统上是否有Unicode字符(包括表情符号),请运行下面的unicodeAvailable()方法。

它的工作原理是将给定的字符 image 与已知的未定义的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
}

讨论

  1. 所有字符都将呈现为 png ,其大小(8)与

    中定义的相同

    static let refUnicodeSize: CGFloat = 8

  2. 未定义的字符U+1FFF图像在

    中计算一次

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

  3. 辅助方法可选择从Character

    创建 png

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

  4. 1。示例:针对3个表情符号

    进行测试
    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")
            }
        }
    }
    

    a few hundred characters

    辅助函数: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上找到此解决方案,并在Swift Recipes上找到详细的文章。

答案 1 :(得分:0)

仅供参考,发现我的应用程序有12.2版本不支持的13.2个表情符号后,我从此处使用了答案:How can I determine if a specific emoji character can be rendered by an iOS device?,对我来说真的很好。