Emoji desencryption de Unicode de Iphone para el envío de notifications push por APNs

Mi service web publica notifications push a APNs y APNs envían al dispositivo IOS de destino. Cuando los apns contienen Unicode emoji en la notificación de activación del cuerpo de alerta y Iphone no puede descifrar mi aplicación emoji ' \ uD83D \ uDE0A ' de Unicode ya mata.

La notificación push muestra el mismo ' \ uD83D \ uDE0A ', no se muestra el emoji en la barra de notifications de banners en la parte superior.

La aplicación de Android funciona bien gracias a que GCM despacha notifications push. Pero IOS no admite. Iphone-Ios solo admite este formatting ' \ ue415 '

Aquí codifica que desde ActiveMQ suscribirse a la carga de chat entrar en el service web

public void onPublish(UTF8Buffer topic, Buffer msg, Runnable ack) { try { String body = msg.utf8().toString(); if (logger.isInfoEnabled()) { logger.info("MQTT connection.listener.onPublish(), msg Received [" + body + "]"); } if (body.contains("\"cmd\":\"chat\"") && body.contains("\"is_sender_msg\":true")) { QueueMgr.addToChatQueue(body); //Changed true to false } else if(body.contains("\"cmd\":\"msg_seen\"")){ QueueMgr.addToChatReadSeenQueue(body); } } catch (Exception e) { e.printStackTrace(); } finally { ack.run(); } } 

Mi código para crear notifications push en java

 public static JSONObject constructePushJson(JSONObject jsonObject,String[] cloudkeyWithDevice) throws JSONException { if(cloudkeyWithDevice[0] != null){ JSONObject pnAPIdata = new JSONObject(); if(cloudkeyWithDevice[1].equals("a") || cloudkeyWithDevice[1].equals("d")){ pnAPIdata.put(com.anyorg.constants.AppConstants.FLD_CMD, com.anyorg.constants.AppConstants.CMD_ANDROID_PUSH); } else{ pnAPIdata.put(com.anyorg.constants.AppConstants.FLD_CMD, com.anyorg.constants.AppConstants.CMD_IOS_PUSH); } pnAPIdata.put(com.anyorg.constants.AppConstants.FLD_APP_TOKEN, com.anyorg.constants.AppConstants.DEFAULT_APP_TOKEN); pnAPIdata.put(com.anyorg.constants.AppConstants.FLD_DEVICE_TOKEN, cloudkeyWithDevice[0]); pnAPIdata.put(com.anyorg.constants.AppConstants.FLD_USER_ID, jsonObject.getInt(com.anyorg.constants.AppConstants.FLD_TO_USER_ID)); pnAPIdata.put(com.anyorg.constants.AppConstants.FLD_DEVICE_ID, 0); String alertMsg=StringEscapeUtils.unescapeJava(jsonObject.getString(com.anyorg.constants.AppConstants.FLD_BODY)); jsonObject.put(com.anyorg.constants.AppConstants.FLD_BODY,alertMsg); pnAPIdata.put(com.anyorg.constants.AppConstants.FLD_ALERT_MSG, "AryaConnect: "+alertMsg);//(jsonObject.isNull("body")) ? jsonObject.getString("from_user_name")+": Sent a file" : jsonObject.getString("from_user_name")+": "+jsonObject.getString("body") pnAPIdata.put(com.anyorg.constants.AppConstants.FLD_MSG, jsonObject);//jsonObject.getString(com.anyorg.constants.AppConstants.FLD_BODY) pnAPIdata.put(com.anyorg.constants.AppConstants.FLD_CALLBACK_URL, callbackUrl); pnAPIdata.put(com.anyorg.constants.AppConstants.MAC_ADDRESS_ID, jsonObject.getString("mobile_rec_id")); return pnAPIdata; } else{ return null; } } 

Publicar en código APN

 public class ANSNotificationDispatcher implements NotificationDispatcher { protected static final Logger logger = Logger .getLogger(ANSNotificationDispatcher.class); public static final String OS_NAME = AppConstants.OS_TYPE_IPHONE; String keystore; String password; boolean production; public ANSNotificationDispatcher() { try { keystore = AppConfig.getAPNKeystore(); password = AppConfig.getAPNKeystorePassword(); PushyAPNMgr.init(keystore, password, AppConfig.isAPNProdcution()); } catch (Throwable e) { e.printStackTrace(); } } private void push(Payload payload, String token, String userId, String deviceId) throws ConfigurationException, DeviceUnregistenetworkingException { // QueueManager.addToIOsQueue(payLoad, token, userId, ivUserDeviceId); long stime = System.currentTimeMillis(); try { PushyAPNMgr.push(token, payload.toString()); if (logger.isInfoEnabled()) logger.info("push(): APN PN userId [" + userId + "], device id [" + deviceId + "] payoad [" + payload + "] Response time [" + (System.currentTimeMillis() - stime) + "]ms"); } catch (Exception e) { e.printStackTrace(); throw new ConfigurationException(); } } public static Payload createComplexPayload(JSONObject jsonObject) { PushNotificationPayload complexPayload = null; try { complexPayload = createPayload(jsonObject); String msg = Common.getStringAsNull(jsonObject, AppConstants.FLD_MSG); if (!Common.isEmpty(msg)) { complexPayload.addCustomDictionary(AppConstants.FLD_MSG, msg); } if (logger.isInfoEnabled()) { logger.info("createComplexPayloadV2(): payload [" + complexPayload.getPayload().toString() + "]"); } } catch (JSONException e) { e.printStackTrace(); } return complexPayload; } public void dispatch(JSONObject jsonObject, String jsonData) throws NotificationException, DeviceUnregistenetworkingException, MultipleRegistartionIdException, ConfigurationException { String deviceToken = Common.getStringAsNull(jsonObject, AppConstants.FLD_DEVICE_TOKEN); if (Common.isEmpty(deviceToken)) { logger.error("dispatch(): device token is null, cmd [" + jsonData + "]"); return; } Payload payload = createComplexPayload(jsonObject); String userId = Common.getStringAsNull(jsonObject, AppConstants.FLD_USER_ID); String deviceId = Common.getStringAsNull(jsonObject, AppConstants.FLD_DEVICE_ID); push(payload, deviceToken, userId, deviceId); } public static void handleInvalidTokeException(String token) { } public static void handleDeviceUnregistenetworkingException(String token) { } 

}

Ios push notification gestionada por Ios OS

Ios push notification gestionada por Ios OS

Mi logging de Apache Catalina Registro de Apache Catalina Soy un desarrollador de la nube de web services que se enfrenta a este problema los últimos días solo para la aplicación IOS. Entonces, por favor, si algún cuerpo tiene conocimiento o hecho antes. por favor, aconsejame y refiérete alguna idea. Emoji en mi enlace de notifications push. https://mixpanel.com/help/questions/articles/how-do-i-send-custom-parameters-like-emoji-in-my-push-notifications Gracias

No deberías tener problemas con la deencoding html. Como dices, el punto de código para la cara sonriente es \ u263A. En PHP puedes representar eso en una cadena codificada en UTF8 como "\ xE2 \ x98 \ xBA"

El rayo (en realidad 'señal de alto voltaje') es \ u26A1 o "\ xE2 \ x9A \ xA1" en UTF-8.

Ambos caracteres están presentes en algunas fonts que no son emoji como símbolos Unicode normales. Puedes ver con:

 <?php header('Content-type: text/html; charset=utf-8'); echo "\xE2\x9A\xA1"; echo "\xE2\x98\xBA"; 

u otras cosas …

para los googlers json_encode () agrega double \

 $message = "\ue04a"; $body['aps'] = array( 'alert' => $message, 'sound' => 'default', 'type' => $type, 'param' => $param ); $payload = json_encode($body); $payload = str_replace("\", "\\", $payload); 

Verifique con esta doble dirección … creo que esto es útil para usted.

Finalmente, el problema de APN se resuelve en (Ios app) en el código de service web de Java mediante este process de encoding y deencoding de Unicode. ( unescapeJava y escapeJava ) de lib commons-lang-2.6.jar y la class org.apache.commons.lang.StringEscapeUtils

emojiBytes = alertMsg.getBytes ("UTF-8");
text = nueva cadena (emojiBytes, "UTF-8");

 private static PushNotificationPayload createPayload(JSONObject jsonObject) throws JSONException { String alertMsg = Common.getStringUnicodeAsNull1(jsonObject, AppConstants.FLD_ALERT_MSG); byte[] emojiBytes=null; String text=null; try { emojiBytes = alertMsg.getBytes("UTF-8"); text = new String(emojiBytes, "UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } //String emojiAsString = new String(emojiBytes, Charset.forName("UTF-8")); //System.out.println("@@@@@alertMsg: "+text); Integer badgeCnt; if (jsonObject.has(AppConstants.FLD_BADGE_CNT)){ badgeCnt = Common.getIntegerAsNull(jsonObject, AppConstants.FLD_BADGE_CNT); }else{ badgeCnt = AppConstants.VAL_ZERO; } PushNotificationPayload payload = createPayload(badgeCnt, text); return payload; } 

String alertMsg = Common.getStringUnicodeAsNull1 (jsonObject, AppConstants.FLD_ALERT_MSG);

 public static String getStringUnicodeAsNull1(JSONObject jsonObject, String key) { try { if(jsonObject.isNull(key)) return null; else return StringEscapeUtils.unescapeJava(jsonObject.getString(key)); } catch (JSONException je) { return null; } } 

introduzca la descripción de la imagen aquí Respetado señor y señora, si hay alguna otra solución de java APNs emoji Unicode en IOS Push Notification.

Entonces, por favor, dame algunos consejos.
Gracias