如何确定iOS设备是否可以呈现特定的表情符号字符?

随着iOS 9.1的发布,我们得到了许多很酷的新表情符号,如taco(🌮)! 我正在开发一个应用程序,我希望在支持它们的设备上显示新的表情符号字符,但将它们隐藏在不支持它们的设备上。 有没有办法确定是否可以在应用程序运行的设备上呈现给定的表情符号字符(包含在NSString中)?

经过大量的挖掘和实验后,我想出了一个解决方案,我将在下面发布一个答案,但如果有更好的方法,请告诉我。

// Determine if the emoji character provided in the string can be rendered on this OS version + (BOOL)isEmojiSupported:(NSString *)emoji { NSData *data = [string dataUsingEncoding:NSUTF32LittleEndianStringEncoding]; UTF32Char emojiValue; [data getBytes:&emojiValue length:sizeof(emojiValue)]; // Convert UTF32Char to UniChar surrogate pair. // Found here: http://stackoverflow.com/questions/13005091/how-to-tell-if-a-particular-font-has-a-specific-glyph-64k# UniChar characters[2] = { }; CFIndex length = (CFStringGetSurrogatePairForLongCharacter(emojiValue, characters) ? 2 : 1); CGGlyph glyphs[2] = { }; CTFontRef ctFont = CTFontCreateWithName((CFStringRef)@"AppleColorEmoji", 0.0, NULL); // If we don't get back any glyphs for the characters array, it's not supported BOOL ret = CTFontGetGlyphsForCharacters(ctFont, characters, glyphs, length); CFRelease(ctFont); return ret; 

}

在回答上面的Swift问题时,这里有一个Swift版本,主要基于这个问题的答案: 从表情符号中获取代理对

 func isEmojiSupported(emoji: String) -> Bool { let uniChars = Array(emoji.utf16) let font = CTFontCreateWithName("AppleColorEmoji", 0.0, nil) var glyphs: [CGGlyph] = [0, 0] return CTFontGetGlyphsForCharacters(font, uniChars, &glyphs, uniChars.count) }