En iOS el soporte para emoticonos está incorporado en el propio sistema operativo. Como desarrollador no debes hacer nada especial para que tus aplicaciones soporten los distintos emoticonos. De hecho es el usuario quien, si quiere usar emoticonos, debe añadir un teclado a la configuración de teclados de su dispositivo: el teclado Emoji. Para ver cómo añadir el teclado Emoji puede consultarse el siguiente enlace de la documentación de Apple: iOS: Cómo utilizar Emoji.
Una vez el usuario haya añadido el teclado Emoji cuando quiera añadir un emoticono, simplemente debe cambiar a dicho teclado y podrá introducir emoticonos. La siguiente captura de pantalla muestra una aplicación iOS que contiene un campo de texto estándar al que se le ha añadido un emoticono:
Lo que debemos conocer, como desarrolladores, es que iOS aprovecha un rango de valores no usado del estándar Unicode para los emoticonos. Es decir, un objeto NSString puede contener emoticonos sin ningún problema. La siguiente captura de pantalla muestra el valor de la propiedad text del campo de texto (propiedad que contiene el texto que haya entrado el usuario):
Vemos que incluso XCode nos muestra el emoticono en la ventana de expresiones. Pero... ¿cuál es el valor Unicode de dicho carácter? Para averiguarlo podemos usar el método characterAtIndex: de la clase NSString que devuelve un carácter según el índice. Dicho método devuelve un unichar (que realmente es un unsigned short). Así si ejecutamos el código:
unichar character = [text characterAtIndex:5];
podremos observar que el valor concreto de este carácter es d83d (el valor está en hexadecimal).
Como curiosidad comentar que se puede usar la función CFStringTransform para transformar una cadena que contenga emoticonos a otra cadena que contenga las descripciones de dichos emoticonos:
NSString* text = _txtEmoticons.text;
NSMutableString* mutable = [text mutableCopy];
CFMutableStringRef mutableRef =(__bridge CFMutableStringRef)mutable;
CFStringTransform(mutableRef,NULL, kCFStringTransformToUnicodeName, false);
Al ejecutar dicho código el valor contenido en mutable (asumiendo que entramos la cadena anterior) es:
Aunque seguramente, lo que más te puede interesar alguna vez es detectar si una cadena contiene algún emoticono. En este caso, lo mejor es usar una expresión regular que mire si la cadena tiene caracteres en el rango Unicode usado en iOS para los emoticonos:
NSString* text = _txtEmoticons.text;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]" options:NSRegularExpressionCaseInsensitive error:nil];
NSUInteger emojiCount = [regex numberOfMatchesInString:text options:NSMatchingWithTransparentBounds range:NSMakeRange(0, [text length])];
Al ejecutar este código la variable emojiCount contendrá el número de emoticonos contenidos en la cadena:
En resumen, en este post hemos visto cómo iOS tiene soporte nativo para emoticonos (que se codifican mediante caracteres Unicode) y hemos visto algunos mecanismos para poder saber si una cadena (NSString) contiene emoticonos y para lidiar con ellos.