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 = ; 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

Qt通过极光推送向app推送消息的更多相关文章

  1. iOS论App推送方案

    1.APNS介绍(原生推送实现原理) 在iOS平台上,大部分应用是不允许在后台运行并连接网络的.在应用没有被运行的时候,只能通过 Apple Push Notification Service (AP ...

  2. 使用极光/友盟推送,APP进程杀死后为什么收不到推送(转)

    为什么会存在这样的 问题,刚开始的时候我也搞不清楚,之前用极光的时候杀死程序后也会收到推送,但最近重新再去集成时就完全不好使了,这我就纳闷了,虽然Google在高版本上的android上面不建议线程守 ...

  3. [iOS]iPhone利用<极光推送>实现远程推送

    准备: 1. 一个Xcode工程 2. 开发者账号 3. 真机 (重要,模拟器无法进行远程推送,因为模拟器没有UDID) 第一步:绑定工程的Bundle Identifer 首先当然要登录https: ...

  4. 如何用好消息推送为app拉新、留存、促活

    作为移动端APP产品运营最重要的运营手段,JPush消息推送被越来越多的APP厂商所重视,在信息泛滥的移动互联网时代,手机APP应用安装得越来越多,小小的手机屏幕每天收到的消息推送也越来越多,站在用户 ...

  5. APP推送通知相关实现

      关于推送通知,iOS推送主要是通过服务端来实现的,相关过程可以参考下面两篇文章:   http://cshbbrain.iteye.com/blog/1859810   http://zxs198 ...

  6. JAVA实现多线程处理批量发送短信、APP推送

    /** * 推送消息 APP.短信 * @param message * @throws Exception */ public void sendMsg(Message message) throw ...

  7. app推送中的通知和消息区别

    最近在做mqtt及其他消息推送的功能,推送服务挺多的,小米推,极光推,华为推,个推等,当然还有苹果的apns.感觉都差不多,尝试了apns,小米推和个推,各个厂家都提供的有sdk,demo. 关于通知 ...

  8. 实现推送功能APP端需要完成的工作

    推送功能简介 实现推送的流程如下: 从APP注册推送功能,到APNS服务器发送推送消息给设备,有五个步骤. 一旦推送注册完成,应用自身的服务器以provider的身份提供推送. APP端实现 在代码方 ...

  9. App设计:消息推送和界面路由跳转

    概要 app消息推送.显示通知栏,点击跳转页面是很一般的功能了,下面以个推为例演示push集成,消息处理模块及app内部路由模块的简单设计. 推送 推送sdk集成 集成sdk步骤根据文档一步步做就行了 ...

随机推荐

  1. iOS单元测试

    参考下面的链接 ,写的还不错 http://gaohaijun.blog.163.com/blog/static/176698271201151052325749/

  2. wp7之换肤原理简单分析

    wp7之换肤原理简单分析 纠结很久...感觉勉强过得去啦.还望各位大牛指点江山 百度找到这篇参考文章http://www.cnblogs.com/sonyye/archive/2012/03/12/2 ...

  3. WCF客户端与服务端通信简单入门教程

    服务端 1.新建空白解决方案,然后再空白解决方案中新建:WCF服务应用程序.建完后如图: 2.删掉自动生成的IService1.cs和Service.svc并添加WCF服务文件StudentServi ...

  4. WEB相关知识和Tomcat服务器

    WEB相关知识 1.Internet上供外界访问的Web资源分为: 静态web资源:指web页面中供人们浏览的数据始终是不变的. 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间 ...

  5. TOGAF架构开发方法(ADM)之架构变更管理阶段

    TOGAF架构开发方法(ADM)之架构变更管理阶段 1.10 架构变更管理(Architecture Change Management) 企业架构开发方法各阶段——架构变更管理 1.10.1 目标 ...

  6. 分享一个javascript alert精简框架

    如果你不喜欢浏览器自带的alert你可以尝试总共不超过10KB somke js  下载地址:http://smoke-js.com/ 使用方法 somke.alert("hello wor ...

  7. Eclipse代码自动提示设置

    以前百度过如何设置Eclipse代码自动提示,但是本人记性不好,所以把这个方法写成一篇日志,这样以后就不用百度了,直接看自己的博客就是了,而且还增加了自己博客的点击量.以下是从各个地方看到总结的方法: ...

  8. android应用程序fps meter[帧数显示]的分析 —— 浅谈root的风险 (1)

    fps meter是常用的检测帧率的软件,该软件需要root权限才能工作,一直比较好奇它一个apk是如何知道系统当前的帧率情况的,就针对此apk分析了一下其工作原理. Apk组成 首先看一下apk的组 ...

  9. Data Guard组件等相关介绍

    1.Data Guard组件介绍  Data Guard架构归类为3个主要的组件. Data Guard 重做传输服务  重做传输服务用来将主数据库生成的重做数据传输给备用数据库. Data Guar ...

  10. openstack中的floating ip与阿里云的公网ip

    项目组因业务需求使用openstack搭建了一个私有云,本想在vm上搭建一个ftp.源是vsftpd.所有配置都完成了,在远程登录的时候却出现了 这个问题. 初一看以为是文件夹权限的问题,可上上下下全 ...