Skip to content

Instantly share code, notes, and snippets.

@storoj
Last active December 3, 2020 04:13
Show Gist options
  • Save storoj/e12914fb3d1e64e474ce38a21729f7e4 to your computer and use it in GitHub Desktop.
Save storoj/e12914fb3d1e64e474ce38a21729f7e4 to your computer and use it in GitHub Desktop.
Reverse Engineering of CoreEmoji.framework
import Foundation
guard let bundle = Bundle(identifier: "com.apple.CoreEmoji"), bundle.load() else {
fatalError()
}
let handle = dlopen(nil, RTLD_NOW)
typealias CEMCreateEmojiLocaleData_t = @convention(c) (CFLocaleIdentifier) -> CFTypeRef
let CEMCreateEmojiLocaleData = unsafeBitCast(dlsym(handle, "CEMCreateEmojiLocaleData"),
to: CEMCreateEmojiLocaleData_t.self)
typealias CEMEmojiLocaleDataCreateEmojiTokensForString_t = @convention(c) (CFTypeRef, CFString, UnsafeRawPointer?, UnsafeRawPointer?, Bool, Bool) -> CFArray
let CEMEmojiLocaleDataCreateEmojiTokensForString = unsafeBitCast(dlsym(handle, "CEMEmojiLocaleDataCreateEmojiTokensForString"),
to: CEMEmojiLocaleDataCreateEmojiTokensForString_t.self)
typealias CEMEmojiTokenGetString_t = @convention(c) (CFTypeRef) -> CFString
let CEMEmojiTokenGetString = unsafeBitCast(dlsym(handle, "CEMEmojiTokenGetString"),
to: CEMEmojiTokenGetString_t.self)
let localeId = CFLocaleGetIdentifier(CFLocaleCopyCurrent())!
let data = CEMCreateEmojiLocaleData(localeId)
let tokens = CEMEmojiLocaleDataCreateEmojiTokensForString(data, "facepalm" as CFString, nil, nil, false, true) as [CFTypeRef]
let emojis = NSOrderedSet(array: tokens.map(CEMEmojiTokenGetString)).array
print(emojis)
// [🤦‍♀️, 🤦‍♂️]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment