Qt通过极光推送向app推送消息
- 简介
最近在做个项目,当客服端收到防盗的消息通知时向手机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发送即可。以下是可 - 极光推送平台
注册极光推送后进入自己的管理平台即可看到自己的appKey和masterSecret以及下载自己的app Example - 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。
- 转载请注明出处:http://www.cnblogs.com/fyluyg/p/5703605.html