【问题标题】:Iphone emoji Unicode decode issue for push notification dispatch by APNsAPNs 推送通知发送的 Iphone emoji Unicode 解码问题
【发布时间】:2016-12-23 23:44:19
【问题描述】:

我的网络服务向 APN 发布推送通知,并将 APN 发送到目标 IOS 设备。 当 apns 在警报正文推送通知中包含 Unicode 表情符号并且 Iphone os 无法解码我的 Unicode 表情符号 '\uD83D\uDE0A' 应用程序已经杀死。

推送通知显示相同的“\uD83D\uDE0A”,顶部的横幅通知栏上没有显示表情符号。

GCM 发送推送通知,Android 应用运行良好,但 IOS 不支持。 Iphone-Ios 仅支持这种格式 '\ue415'

此处来自 ActiveMQ 订阅聊天负载的代码进入网络服务

            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();
            }
        }

我在 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;
    }

}

发布到 APNs 代码

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,
        DeviceUnregisteredException {

    // 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, DeviceUnregisteredException,
        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 handleDeviceUnregisteredException(String token) {
}

}

由 Ios OS 管理的 Ios 推送通知

我的 Apache Catalina 日志 我是一名 Web 服务云开发人员,最近一天仅针对 Ios 应用程序面临此问题。所以请,如果某些机构有知识或以前做过。请建议并向我推荐一些想法。 我的推送通知链接中的表情符号。 https://mixpanel.com/help/questions/articles/how-do-i-send-custom-parameters-like-emoji-in-my-push-notifications 谢谢

【问题讨论】:

  • 它在应用程序终止或未运行状态期间由 ios os 自动管理。所以请通过关注的苹果公司更正您的 unicode 格式。
  • 尝试在 unicode 字符串之间放置一个空格,同时在此处检查您的代码:arashnorouzi.wordpress.com/2011/08/31/…
  • 感谢 Woodstock,但用户可以在聊天期间在我们的应用程序中放置没有任何空间的表情符号。 android 运行良好且完美的地方。
  • @SoumyaDas 我想知道问题是否出在 unicode 字符串上。如果您使用我提供的链接中的代码,它们是否有效?
  • 是的先生,我知道这种格式有效,我已经多次访问这种类型的网站。案例是我在我的网络服务代码端解码它的位置和原因。请看一下我的java代码。 Thnaks@伍德斯托克

标签: java ios unicode apple-push-notifications javapns


【解决方案1】:

最后,通过这个 Unicode 编码和解码过程,在 Java Web 服务代码(Ios 应用程序)中解决 APNs 问题。 (unescapeJava 和 escapeJava) 来自 lib commons-lang-2.6.jar 和类 org.apache.commons.lang.StringEscapeUtils

emojiBytes = alertMsg.getBytes("UTF-8");
text = new String(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;
}

字符串 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;
    }
}

尊敬的先生和女士,如果 IOS 推送通知上有 java APNs emoji Unicode 的任何其他解决方案。

那么请给我一些提示。
谢谢

【讨论】:

  • 调用alertMsg.getBytes 后跟new String,都具有相同的字符集,与执行nothing 相同。 这是一个往返身份操作。它不会以任何方式更改或修复您的字符串。你会得到与text = alertMsg; 完全相同的结果。
  • 先生,我尝试了这个过程,但它发送推送通知表情符号???? @VGR
【解决方案2】:

您不必为 html 解码而烦恼。正如您所说,笑脸的代码点是 \u263A。在 PHP 中,您可以在 UTF8 编码的字符串中将其表示为 "\xE2\x98\xBA"

闪电(实际上是“高压标志”)在 UTF-8 中是 \u26A1 或 "\xE2\x9A\xA1"。

这两个字符都作为常规 Unicode 符号出现在一些非表情符号字体中。你可以看到:

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

或者其他的……

为谷歌员工。 json_encode() 加双倍 \

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

$payload = json_encode($body);
$payload = str_replace("\", "\\", $payload);

请用这两种方式检查...我认为这对你有帮助。

【讨论】:

  • 尊敬的 iPhoneDev,我在 java web 服务端的问题。如果我通过 static '"String alertMsz="\ue04a hi"; ',它的工作原理
猜你喜欢
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2015-12-29
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多