编辑 | blame | 历史 | 原始文档
//发送
public MobileMessage sendMessage(Message message) throws Exception {
    MobileMessage msg = new MobileMessage();
    msg.setUserId(userId);
    msg.setContent(message.getContent());
    msg.setDocId(mailId);
    msg.setUrl(url);
    msg.setPayload(getPayload(mailId, message.getType().name(), message.getContent()));
    msg.setTitle("邮件提醒");
    msg.setType(message.getType());
    //构造消息Intent
    msg.setIntent(formatIntent(msg));
    msg.setClientId(message.getClientId());

    try {
        PushResult pushResult = pushToSingleOfNotify(client, msg);

    } catch (Exception e) {
        e.printStackTrace();
        //发送异常
    }

    return pushToUser(msg);
}

private static PushResult pushToSingleOfNotify(PushClient client, MobileMessage moMsg) {
    PushResult pushResult = new PushResult();
    pushResult.setClientId(client.getClientId());


    try {

        IGtPush push = new IGtPush(configProvider.get().getAppKey(), configProvider.get().getMasterSecret());

        SingleMessage message = new SingleMessage();
        if (client.getOs() == MobileOS.ANDROID) {

            message.setData(getTransmissionTemplate(client, moMsg));

            moMsg.setWay(MobileMessage.MobileMessageWay.TRANSMISSION);

            Integer time = configProvider.get().getAndroidOfflineExpireTime();
            if (time != null && time > 0) {
                message.setOffline(true);
                message.setOfflineExpireTime(time);
            }
        } else {
            message.setData(getTransmissionTemplate(client, moMsg));
            moMsg.setWay(MobileMessage.MobileMessageWay.TRANSMISSION);
            //ios要离线,才可以后台接收到推送
            message.setOffline(true);
            message.setOfflineExpireTime(3600 * 1000 * 4);
        }

        Target target = new Target();
        target.setAppId(configProvider.get().getAppId());
        target.setClientId(client.getClientId());

        IPushResult ret = null;
        try {
            ret = push.pushMessageToSingle(message, target);
        } catch (RequestException e) {
            e.printStackTrace();
            ret = push.pushMessageToSingle(message, target, e.getRequestId());
        }

        if (ret != null) {
            Tools.log(ret.getResponse().toString());

            String result = ret.getResponse().get("result").toString();
            Object status = ret.getResponse().get("status");
            pushResult.setResponseMsg(result);
            moMsg.setErrMsg(result);
            moMsg.setClientStatus("successed_offline".equals(status) ? MobileMessage.ClientStatus.OFFLINE : MobileMessage.ClientStatus.ONLINE);
            if ("ok".equals(result)) {
                moMsg.setState(MessageState.SENDED);
            } else {
                moMsg.setState(MessageState.FAIL);
            }
            return pushResult;
        } else {
            Tools.log("服务器响应异常");
            pushResult.setResponseMsg("server error");
            moMsg.setErrMsg("server error");
            moMsg.setState(MessageState.FAIL);
            return pushResult;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return pushResult;
}

//透传消息
private static TransmissionTemplate getTransmissionTemplate(PushClient client, MobileMessage moMsg) {
    TransmissionTemplate template = new TransmissionTemplate();
    template.setAppId(configProvider.get().getAppId());
    template.setAppkey(configProvider.get().getAppKey());
    template.setTransmissionType(2);
    template.setTransmissionContent(moMsg.getPayload());

    APNPayload apnPayload = new APNPayload();
    //在已有数字基础上加1显示,设置为-1时,在已有数字上减1显示,设置为数字时,显示指定数字
    if (configProvider.get().getIosBadge())
        apnPayload.setAutoBadge("+1");
    apnPayload.setContentAvailable(1);
    //无声设置为"com.gexin.ios.silence"
    apnPayload.setSound(client.getSound() ? "default" : "com.gexin.ios.silence");
    APNPayload.DictionaryAlertMsg dictionaryAlertMsg = new APNPayload.DictionaryAlertMsg();
    dictionaryAlertMsg.setBody(moMsg.getContentString());
    //        if (title != null)
    dictionaryAlertMsg.setTitle(moMsg.getTitle() == null ? appName : moMsg.getTitle());

    apnPayload.setAlertMsg(dictionaryAlertMsg);
    apnPayload.addCustomMsg("type", moMsg.getType());
    apnPayload.addCustomMsg("id", moMsg.getDocId());

    template.setAPNInfo(apnPayload);
    Notify notify = new Notify();
    notify.setTitle(moMsg.getTitle());
    notify.setContent(moMsg.getContentString());
    notify.setIntent(moMsg.getIntent() == null
            ? "intent:#Intent;launchFlags=0x14000000;component=" + configProvider.get().getPackageName() + "/io.dcloud.PandoraEntry;end"
            : "intent:" + moMsg.getIntent());

    notify.setType(GtReq.NotifyInfo.Type._intent);
    template.set3rdNotifyInfo(notify);

    return template;
}


private String formatIntent(MobileMessage msg) throws UnsupportedEncodingException {

    return "#Intent;" +
            "launchFlags=0x14000000;" +
            "component=" + configProvider.get().getPackageName() + "/io.dcloud.PandoraEntry;" +
            "S.UP-OL-SU=true;" +
            "S.title=" + URLEncoder.encode(msg.getTitle(), "UTF-8") + ";" +
            "S.content=" + URLEncoder.encode(msg.getContentString(), "UTF-8") + ";" +
            "S.payload=" + URLEncoder.encode(msg.getPayload(), "UTF-8") + ";" +
            "end";
}

private String getPayload(String id, String type, String msg) {
    JSONObject payload = new JSONObject();
    payload.put("id", id);
    payload.put("type", type);
    payload.put("msg", msg);
    return payload.toString();
}

private String getPayloadUrl(String msg, String url) {
    JSONObject payload = new JSONObject();
    payload.put("id", "");
    payload.put("type", "URL");
    payload.put("msg", msg);
    payload.put("content", msg);
    payload.put("url", url);
    return payload.toString();
}