• 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
  • 相关阅读:
    dotnet Framework 源代码 类库的意思
    dotnet Framework 源代码 类库的意思
    dotnet Framework 源代码 · Ink
    dotnet Framework 源代码 · Ink
    dotnet core 用值初始化整个数组
    dotnet core 用值初始化整个数组
    dotnet core 隐藏控制台
    dotnet core 隐藏控制台
    PHP mt_rand() 函数
    PHP mt_getrandmax() 函数
  • 原文地址:https://www.cnblogs.com/fyluyg/p/5703605.html
Copyright © 2020-2023  润新知