Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to know if an Emoji is supported in iOS?

Tags:

I'm building an iOS App, and Emojis play a big part in it.

In iOS 10.2, new emojis were released.

I'm pretty sure that if someone has iOS 8, for example, they wouldn't actually be able to see these emojis. Is there a way to detect this? I'm trying to dynamically build a list of all the Emojis that are supported on the user's iOS version, but I'm having a bit of trouble.

like image 665
David Avatar asked Dec 25 '16 05:12

David


People also ask

Why can't I see some emojis on my iPhone?

If you don't see the emoji keyboard, make sure that it's added. Go to Settings > General and tap Keyboard. Tap Keyboards, then tap Add New Keyboard. Tap Emoji.

Do iOS and Android have the same emojis?

Emoji are created by the Unicode Consortium and they are a part of the “Unicode” standard. That simply means emoji are essentially a standard that anyone can incorporate into their product. That's why every operating system has the same emoji.

Does iOS 14.6 have emojis?

Today Apple has released iOS 14.6, just a few weeks after unveiling a large number of new emojis in iOS 14.5. While today's update doesn't feature any further new emojis, it does update apperance of the people climbing emojis, and could well be the last Apple emoji update before Unicode's 2021 recommendations are made.


1 Answers

Clarification: an Emoji is merely a character in the Unicode Character space, so the present solution works for all characters, not just Emoji.

Synopsis

To know if a Unicode character (including an Emoji) is available on a given device or OS, run the unicodeAvailable() method below.

It works by comparing a given character image against a known undefined Unicode character U+1FFF.

unicodeAvailable(), a Character extension

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 } 

Discussion

  1. All characters will be rendered as a png at the same size (8) as defined once in

    static let refUnicodeSize: CGFloat = 8

  2. The undefined character U+1FFF image is calculated once in

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

  3. A helper method optionally creates a png from a Character

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

1. Example: Test against 3 emoji

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

3 characters

2. Example: Test a range of Unicode characters

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


Helper function: Character to 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 } 

► Find this solution on GitHub and a detailed article on Swift Recipes.

like image 89
SwiftArchitect Avatar answered Oct 07 '22 18:10

SwiftArchitect