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极光推送的简单封装。
    1. //********************************************************************
    2. // Copyright (C) 2016
    3. // All rights reserved.
    4. //
    5. // 文件名称:qJpush.h
    6. // 摘 要:对极光推送的封装
    7. //
    8. // 当前版本:v1.0
    9. // 修 改 人:
    10. // 修改时间:2016-03-31
    11. // 修改描述:
    12. //
    13. // 历史版本:
    14. // 历史作者:
    15. // 上次时间:2016-03-31
    16. // 历史描述:
    17. //********************************************************************
    18. #ifndef QJPUSH_H
    19. #define QJPUSH_H
    20.  
    21. #include <QObject>
    22. #include <QtNetwork/QNetworkAccessManager>
    23. #include <QtNetwork/QNetworkRequest>
    24. #include <QtNetwork/QNetworkReply>
    25. #include <QUrl>
    26. #include <QJsonParseError>
    27. #include <QJsonObject>
    28. #include "../librarys_global.h"
    29.  
    30. class LIBRARYS_EXPORT QJpush : public QObject
    31. {
    32. Q_OBJECT
    33.  
    34. public:
    35. QJpush(QObject *parent = nullptr);
    36. ~QJpush();
    37.  
    38. void pushAll(
    39. const QString &_alert,
    40. const QString &_title,
    41. const QString &_msg_content = "",
    42. const QString &_msg_title = ""); //所有用户
    43. void pushTag(
    44. const QString &_tag,
    45. const QString &_alert,
    46. const QString &_title,
    47. const QString &_msg_content = "",
    48. const QString &_msg_title = ""); //根据标签发送
    49.  
    50. private slots:
    51. void onFinished(QNetworkReply *reply);
    52. void slotSSLErrorDeal(QNetworkReply * reply, const QList<QSslError> & errors);
    53.  
    54. private:
    55. void jPush(
    56. const QString &_alert,
    57. const QString &_title,
    58. const QString &_msg_content,
    59. const QString &_msg_title,
    60. const QString &_tag /*= "all"*/);
    61.  
    62. QNetworkAccessManager *m_pNetworkAccManger;
    63. QNetworkRequest request;
    64. QUrl m_url;
    65. };
    66.  
    67. #endif // QJPUSH_H
    1. //********************************************************************
    2. // Copyright (C) 2016
    3. // All rights reserved.
    4. //
    5. // 文件名称:qJpush.cpp
    6. // 摘 要:对极光推送的封装
    7. //
    8. // 当前版本:v1.0
    9. // 修 改 人:
    10. // 修改时间:2016-03-31
    11. // 修改描述:
    12. //
    13. // 历史版本:
    14. // 历史作者:
    15. // 上次时间:2016-03-31
    16. // 历史描述:
    17. //********************************************************************
    18. #include "qJpush.h"
    19. #include <QJsonArray>
    20. #include <QFile>
    21. #include <QDir>
    22.  
    23. #include "singleton.h"
    24. #include "qUtils.h"
    25. #include "qlog.h"
    26.  
    27. const QString host = "https://api.jpush.cn/v3/push";
    28. const QString appKey = "自己的appKey";
    29. const QString masterSecret = "自己的masterSecret";
    30.  
    31. QString base64_encode(const QString &_srcStr)
    32. {
    33. QByteArray tmp_in(_srcStr.toUtf8());
    34. return QString(tmp_in.toBase64());
    35. }
    36.  
    37. QJpush::QJpush(QObject *parent)
    38. : QObject(parent),
    39. m_pNetworkAccManger(new QNetworkAccessManager(this))
    40. {
    41. //配置ssl协议
    42. QSslConfiguration config;
    43.  
    44. config.setPeerVerifyMode(QSslSocket::VerifyNone);
    45. config.setProtocol(QSsl::TlsV1_0);
    46. request.setSslConfiguration(config);
    47.  
    48. m_url.setUrl(host);
    49. request.setUrl(m_url);
    50.  
    51. QByteArray authorization;
    52. authorization = QString("Basic %1").arg(base64_encode(appKey + ":" + masterSecret)).toLatin1();
    53.  
    54. request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); //声明发送头为json格式
    55. request.setRawHeader("Authorization", authorization); //设置密钥
    56.  
    57. connect(m_pNetworkAccManger, SIGNAL(finished(QNetworkReply *)), this, SLOT(onFinished(QNetworkReply *)));
    58. connect(m_pNetworkAccManger, SIGNAL(sslErrors(QNetworkReply *, const QList<QSslError> &)),
    59. this, SLOT(slotSSLErrorDeal(QNetworkReply *, const QList<QSslError> &)));
    60. }
    61.  
    62. QJpush::~QJpush()
    63. {
    64.  
    65. }
    66.  
    67. //************************************
    68. // 函数名称: pushAll
    69. // 返回类型: void
    70. // 参数信息:
    71. // 函数说明: 向所有的用户推送消息
    72. //************************************
    73. void QJpush::pushAll(
    74. const QString &_alert,
    75. const QString &_title,
    76. const QString &_msg_content,
    77. const QString &_msg_title)
    78. {
    79. jPush(_alert, _title, _msg_content, _msg_title, "all");
    80. }
    81.  
    82. //************************************
    83. // 函数名称: pushTag
    84. // 返回类型: void
    85. // 参数信息:
    86. // 函数说明: 向特定的tag推送消息
    87. //************************************
    88. void QJpush::pushTag(
    89. const QString &_tag,
    90. const QString &_alert,
    91. const QString &_title,
    92. const QString &_msg_content,
    93. const QString &_msg_title)
    94. {
    95. jPush(_alert, _title, _msg_content, _msg_title, _tag);
    96. }
    97.  
    98. void QJpush::jPush(
    99. const QString &_alert,
    100. const QString &_title,
    101. const QString &_msg_content,
    102. const QString &_msg_title,
    103. const QString &_tag /*= "all"*/)
    104. {
    105. QJsonObject rootJsonObj, noteJsonObj, adrdNoteObj, msgNodeObj;
    106. QJsonDocument jsonDoc;
    107. QByteArray jsonArr;
    108.  
    109. rootJsonObj.insert("platform", "all"); //android 和ios平台
    110.  
    111. //设置tag
    112. if (_tag == "add")
    113. {
    114. rootJsonObj.insert("audience", "all"); //
    115. }
    116. else
    117. {
    118. QJsonArray arrObj;
    119. QJsonObject tagNodeObj;
    120.  
    121. QStringList slt = _tag.split("/");
    122. size_t sz = slt.size();
    123. for (int i = ; i < sz; ++i)
    124. {
    125. arrObj.insert(i, slt.at(i));
    126. }
    127.  
    128. tagNodeObj.insert("tag", arrObj);
    129. rootJsonObj.insert("audience", tagNodeObj); //
    130. }
    131.  
    132. //通知
    133. adrdNoteObj.insert("alert", _alert);
    134. adrdNoteObj.insert("title", _title);
    135.  
    136. //消息
    137. if (!_msg_title.isEmpty() && !_msg_content.isEmpty())
    138. {
    139. msgNodeObj.insert("msg_content", _msg_content);
    140. msgNodeObj.insert("content_type", "text");
    141. msgNodeObj.insert("title", _msg_title);
    142. rootJsonObj.insert("message", msgNodeObj);
    143. }
    144.  
    145. //
    146. noteJsonObj.insert("android", adrdNoteObj);
    147. rootJsonObj.insert("notification", noteJsonObj);
    148.  
    149. jsonDoc.setObject(rootJsonObj);
    150. jsonArr = jsonDoc.toJson(QJsonDocument::Compact);
    151. qDebug() << jsonDoc;
    152.  
    153. request.setHeader(QNetworkRequest::ContentLengthHeader, jsonArr.size());
    154. m_pNetworkAccManger->post(request, jsonArr);
    155. }
    156.  
    157. //发送结束槽
    158. void QJpush::onFinished(QNetworkReply *reply)
    159. {
    160. switch (reply->error())
    161. {
    162. case QNetworkReply::NoError:
    163. QLOG("QNetworkReply::NoError");
    164. break;
    165. case QNetworkReply::ContentNotFoundError:
    166. QLOG("QNetworkReply::ContentNotFoundError");
    167. break;
    168. default:
    169. QString str;
    170. QTextStream steam(&str);
    171. steam << "Have error" << reply->errorString() << " error " << reply->error() << endl;
    172. QLOG(str);
    173. }
    174.  
    175. delete reply;
    176. }
    177.  
    178. //ssl错误
    179. void QJpush::slotSSLErrorDeal(
    180. QNetworkReply * reply,
    181. const QList<QSslError> & errors)
    182. {
    183. QList<QSslError>::const_iterator conit = errors.begin();
    184. while (conit != errors.end())
    185. {
    186. QString sTemp = (*conit).errorString();
    187. QLOG(sTemp);
    188. qDebug() << (*conit).errorString();
    189. ++conit;
    190. }
    191. reply->ignoreSslErrors();
    192.  
    193. return;
    194. }
    1. QString jgPushTag("tag1/tag2");
    2. QString alertStr = "异常已处理";
    3. QJpush jpush;
    4.  
    5. 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. Make Things Move -- Javascript html5版(二)实现最基本的Sprite类和stage管理对象

    现在这几篇写的都是比较基础的东西,有过相应开发经验的朋友可直接忽略啦. 计算机模拟的动画都是由很多静态的一连串影像(sprite)在一定帧率(fps)内逐帧播放出来的. 对于js来说,我们可以用提供的 ...

  2. 联想E430Cwindow8系统换成win7

    垃圾win8系统各种不习惯,尤其无线网络老是自己断掉,忍无可忍只能换成win7,之前换过一次,没有成功,记得是提示硬盘模式要由GPT换成MBR. 这次换系统采用了PE里直接分区,格式化所有数据,然后g ...

  3. Struts2.1.8 + Spring3.0+ Hibernate3.2整合笔记

    body, p, th, td, li, ul, ol, h1, h2, h3, h4, h5, h6, pre { font-family: simsun; line-height: 1.4; } ...

  4. SVN 在 Xcode中的状态说明

    最近同事总是问我关于SVN状态的问题,‘C’是什么意思啦?‘A’是什么意思啦?等等一系列问题. 为了方便以后查阅,以及新同事的快速融入,特在此记录一下^_^. 当然了大家也可以google一下,一搜一 ...

  5. javascript的笔记

    好久没写东西了,最近有些迷茫(好吧,是借口),也是好久没有接触js的内容了,今天就借此契机,顺便复习下吧. 就看看javascript中的函数四大调用模式和this的关系 1.方法调用模式 当一个函数 ...

  6. WCF小实例以及三种宿主

    WCF小实例以及三种宿主 最近一直在学习WCF相关知识,下面将通过一个小实例对所学的知识进行简单的回顾:本实例是一个简单三层操作数据库,并且也简单实现的三种宿主(控制台宿主,IIS宿主以及Window ...

  7. POJ 1873 The Fortified Forest

    题意:是有n棵树,每棵的坐标,价值和长度已知,要砍掉若干根,用他们围住其他树,问损失价值最小的情况下又要长度足够围住其他树,砍掉哪些树.. 思路:先求要砍掉的哪些树,在求剩下的树求凸包,在判是否可行. ...

  8. for惠普2013实习生

    似乎快两个月了,惠普招实习生的时间好像确实有点久. 记得是从五月中旬的时候,惠普来学校招实习生的.因为没能够去腾讯,能拿到惠普的实习生offer也是我所愿了. 记得宣讲的那天,兴冲冲的过去了,惠普的一 ...

  9. Android 性能优化——内存篇

    一.android官方一些内存方面的内存tips 1.避免创建不必要的对象. 如尽量避免字符串的加号拼接,可以使用StringBuilder来拼接. 如果需要TextView设置多个字符串片段,可以使 ...

  10. HTTP could not register URL http://+:86/. 设置VS默认以管理员权限打开

      在使用visual studio 2013启动self host webapi时候碰到下面的错误: 详细错误信息如下: HTTP could not register URL http://+:8 ...