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。

转载于:https://my.oschina.net/u/574036/blog/994260

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值