Qt通过极光推送向app推送消息

  1. 简介 

      最近在做个项目,当客服端收到防盗的消息通知时向手机app推送一个消息,告知有防盗报警。这么小的功能没必要自己写个推送端,极光推送免费而且推送的成功率高,已经能满足我们的需求了。

       极光推送的文档大家可以到极光推送的官网查看(http://docs.jiguang.cn/),由于我们这是是使用Qt C++开发的极光推送并没有提供c++的封装,这里我们选择rest API的方式推送,rest API的推送方式的demo以及json格式在http://docs.jiguang.cn/server/rest_api_v3_push/可以看 到。rest API的推送方式可以直接通过curl等工具构造适合的json发送即可。以下是可
  2. 极光推送平台
    注册极光推送后进入自己的管理平台即可看到自己的appKey和masterSecret以及下载自己的app Example

  3. QT极光推送的简单封装。
    //********************************************************************
    // Copyright (C) 2016   
    // All rights reserved.
    //
    // 文件名称:qJpush.h
    // 摘    要:对极光推送的封装
    //
    // 当前版本:v1.0
    // 修 改 人:
    // 修改时间:2016-03-31
    // 修改描述:
    //
    // 历史版本:
    // 历史作者:
    // 上次时间:2016-03-31
    // 历史描述:
    //********************************************************************
    #ifndef QJPUSH_H
    #define QJPUSH_H
    
    #include <QObject>
    #include <QtNetwork/QNetworkAccessManager>
    #include <QtNetwork/QNetworkRequest>
    #include <QtNetwork/QNetworkReply>
    #include <QUrl>
    #include <QJsonParseError>
    #include <QJsonObject>
    #include "../librarys_global.h"
    
    class LIBRARYS_EXPORT QJpush : public QObject
    {
        Q_OBJECT
    
    public:
        QJpush(QObject *parent = nullptr);
        ~QJpush();
    
        void pushAll(
            const QString &_alert,
            const QString &_title,
            const QString &_msg_content = "",
            const QString &_msg_title = "");     //所有用户
        void pushTag(
            const QString &_tag,
            const QString &_alert,
            const QString &_title,
            const QString &_msg_content = "",
            const QString &_msg_title = "");    //根据标签发送
    
    private slots:
        void onFinished(QNetworkReply *reply);
        void slotSSLErrorDeal(QNetworkReply * reply, const QList<QSslError> & errors);
    
    private:
        void jPush(
            const QString &_alert,
            const QString &_title,
            const QString &_msg_content,
            const QString &_msg_title,
            const QString &_tag /*= "all"*/);
    
    
        QNetworkAccessManager *m_pNetworkAccManger;
        QNetworkRequest request;
        QUrl m_url;
    };
    
    #endif // QJPUSH_H
    //********************************************************************
    // Copyright (C) 2016
    // All rights reserved.
    //
    // 文件名称:qJpush.cpp
    // 摘    要:对极光推送的封装
    //
    // 当前版本:v1.0
    // 修 改 人:
    // 修改时间:2016-03-31
    // 修改描述:
    //
    // 历史版本:
    // 历史作者:
    // 上次时间:2016-03-31
    // 历史描述:
    //********************************************************************
    #include "qJpush.h"
    #include <QJsonArray>
    #include <QFile>
    #include <QDir>
    
    #include "singleton.h"
    #include "qUtils.h"
    #include "qlog.h"
    
    const QString host = "https://api.jpush.cn/v3/push";
    const QString appKey = "自己的appKey";
    const QString masterSecret = "自己的masterSecret";
    
    QString base64_encode(const QString &_srcStr)
    {
        QByteArray tmp_in(_srcStr.toUtf8());
        return QString(tmp_in.toBase64());
    }
    
    QJpush::QJpush(QObject *parent)
    : QObject(parent),
    m_pNetworkAccManger(new QNetworkAccessManager(this))
    {
        //配置ssl协议
        QSslConfiguration config;
    
        config.setPeerVerifyMode(QSslSocket::VerifyNone);
        config.setProtocol(QSsl::TlsV1_0);
        request.setSslConfiguration(config);
    
        m_url.setUrl(host);
        request.setUrl(m_url);
    
        QByteArray authorization;
        authorization = QString("Basic %1").arg(base64_encode(appKey + ":" + masterSecret)).toLatin1();
    
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");    //声明发送头为json格式
        request.setRawHeader("Authorization", authorization);    //设置密钥
    
        connect(m_pNetworkAccManger, SIGNAL(finished(QNetworkReply *)), this, SLOT(onFinished(QNetworkReply *)));
        connect(m_pNetworkAccManger, SIGNAL(sslErrors(QNetworkReply *, const QList<QSslError> &)),
            this, SLOT(slotSSLErrorDeal(QNetworkReply *, const QList<QSslError> &)));
    }
    
    QJpush::~QJpush()
    {
    
    }
    
    //************************************
    // 函数名称: pushAll
    // 返回类型: void
    // 参数信息: 
    // 函数说明: 向所有的用户推送消息
    //************************************
    void QJpush::pushAll(
        const QString &_alert,
        const QString &_title,
        const QString &_msg_content,
        const QString &_msg_title)
    {
        jPush(_alert, _title, _msg_content, _msg_title, "all");
    }
    
    //************************************
    // 函数名称: pushTag
    // 返回类型: void
    // 参数信息: 
    // 函数说明: 向特定的tag推送消息
    //************************************
    void QJpush::pushTag(
        const QString &_tag,
        const QString &_alert,
        const QString &_title,
        const QString &_msg_content,
        const QString &_msg_title)
    {
        jPush(_alert, _title, _msg_content, _msg_title, _tag);
    }
    
    void QJpush::jPush(
        const QString &_alert,
        const QString &_title,
        const QString &_msg_content,
        const QString &_msg_title,
        const QString &_tag /*= "all"*/)
    {
        QJsonObject rootJsonObj, noteJsonObj, adrdNoteObj, msgNodeObj;
        QJsonDocument jsonDoc;
        QByteArray jsonArr;
    
        rootJsonObj.insert("platform", "all");    //android 和ios平台
    
        //设置tag
        if (_tag == "add")
        {
            rootJsonObj.insert("audience", "all");    //
        }
        else
        {
            QJsonArray arrObj;
            QJsonObject tagNodeObj;
    
            QStringList slt = _tag.split("/");
            size_t sz = slt.size();
            for (int i = 0; i < sz; ++i)
            {
                arrObj.insert(i, slt.at(i));
            }
    
            tagNodeObj.insert("tag", arrObj);
            rootJsonObj.insert("audience", tagNodeObj);    //
        }
    
        //通知
        adrdNoteObj.insert("alert", _alert);
        adrdNoteObj.insert("title", _title);
    
        //消息
        if (!_msg_title.isEmpty() && !_msg_content.isEmpty())
        {
            msgNodeObj.insert("msg_content", _msg_content);
            msgNodeObj.insert("content_type", "text");
            msgNodeObj.insert("title", _msg_title);
            rootJsonObj.insert("message", msgNodeObj);
        }
    
        //
        noteJsonObj.insert("android", adrdNoteObj);
        rootJsonObj.insert("notification", noteJsonObj);
    
        jsonDoc.setObject(rootJsonObj);
        jsonArr = jsonDoc.toJson(QJsonDocument::Compact);
        qDebug() << jsonDoc;
    
        request.setHeader(QNetworkRequest::ContentLengthHeader, jsonArr.size());
        m_pNetworkAccManger->post(request, jsonArr);
    }
    
    //发送结束槽
    void QJpush::onFinished(QNetworkReply *reply)
    {
        switch (reply->error())
        {
        case QNetworkReply::NoError:
            QLOG("QNetworkReply::NoError");
            break;
        case QNetworkReply::ContentNotFoundError:
            QLOG("QNetworkReply::ContentNotFoundError");
            break;
        default:
            QString str;
            QTextStream steam(&str);
            steam << "Have error" << reply->errorString() << " error " << reply->error() << endl;
            QLOG(str);
        }
    
        delete reply;
    }
    
    //ssl错误
    void QJpush::slotSSLErrorDeal(
        QNetworkReply * reply,
        const QList<QSslError> & errors)
    {
        QList<QSslError>::const_iterator conit = errors.begin();
        while (conit != errors.end())
        {
            QString sTemp = (*conit).errorString();
            QLOG(sTemp);
            qDebug() << (*conit).errorString();
            ++conit;
        }
        reply->ignoreSslErrors();
    
        return;
    }
    QString jgPushTag("tag1/tag2");    
    QString alertStr = "异常已处理";
    QJpush jpush;
    
    jpush.pushTag(jgPushTag, alertStr, "通知", alertStr, "消息");

    编译成的项目要包含openssl的libeay32.dll和ssleay32.dll。

  4. 转载请注明出处:http://www.cnblogs.com/fyluyg/p/5703605.html
posted on 2016-07-25 15:45  漂泊的浮萍  阅读(1202)  评论(0编辑  收藏  举报