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 = ; 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
Qt通过极光推送向app推送消息的更多相关文章
- iOS论App推送方案
1.APNS介绍(原生推送实现原理) 在iOS平台上,大部分应用是不允许在后台运行并连接网络的.在应用没有被运行的时候,只能通过 Apple Push Notification Service (AP ...
- 使用极光/友盟推送,APP进程杀死后为什么收不到推送(转)
为什么会存在这样的 问题,刚开始的时候我也搞不清楚,之前用极光的时候杀死程序后也会收到推送,但最近重新再去集成时就完全不好使了,这我就纳闷了,虽然Google在高版本上的android上面不建议线程守 ...
- [iOS]iPhone利用<极光推送>实现远程推送
准备: 1. 一个Xcode工程 2. 开发者账号 3. 真机 (重要,模拟器无法进行远程推送,因为模拟器没有UDID) 第一步:绑定工程的Bundle Identifer 首先当然要登录https: ...
- 如何用好消息推送为app拉新、留存、促活
作为移动端APP产品运营最重要的运营手段,JPush消息推送被越来越多的APP厂商所重视,在信息泛滥的移动互联网时代,手机APP应用安装得越来越多,小小的手机屏幕每天收到的消息推送也越来越多,站在用户 ...
- APP推送通知相关实现
关于推送通知,iOS推送主要是通过服务端来实现的,相关过程可以参考下面两篇文章: http://cshbbrain.iteye.com/blog/1859810 http://zxs198 ...
- JAVA实现多线程处理批量发送短信、APP推送
/** * 推送消息 APP.短信 * @param message * @throws Exception */ public void sendMsg(Message message) throw ...
- app推送中的通知和消息区别
最近在做mqtt及其他消息推送的功能,推送服务挺多的,小米推,极光推,华为推,个推等,当然还有苹果的apns.感觉都差不多,尝试了apns,小米推和个推,各个厂家都提供的有sdk,demo. 关于通知 ...
- 实现推送功能APP端需要完成的工作
推送功能简介 实现推送的流程如下: 从APP注册推送功能,到APNS服务器发送推送消息给设备,有五个步骤. 一旦推送注册完成,应用自身的服务器以provider的身份提供推送. APP端实现 在代码方 ...
- App设计:消息推送和界面路由跳转
概要 app消息推送.显示通知栏,点击跳转页面是很一般的功能了,下面以个推为例演示push集成,消息处理模块及app内部路由模块的简单设计. 推送 推送sdk集成 集成sdk步骤根据文档一步步做就行了 ...
随机推荐
- [转]SQL Server中临时表与表变量的区别
[转]http://blog.csdn.net/skyremember/archive/2009/03/05/3960687.aspx 我们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是 ...
- Dom4j下载及使用Dom4j读写XML简介
sitinspring(如坐春风)原创,转载请注明作者及出处. 要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4 ...
- 如何在ASP.NET Core应用中实现与第三方IoC/DI框架的整合?
我们知道整个ASP.NET Core建立在以ServiceCollection/ServiceProvider为核心的DI框架上,它甚至提供了扩展点使我们可以与第三方DI框架进行整合.对此比较了解的读 ...
- Tungsten Replicator学习总结
之前基于Tungsten Replicator实现了内部使用的分布式数据库的数据迁移工具,此文为当时调研Tungsten Replicator时的学习心得,创建于2015.7.22. 1 概述 1.1 ...
- [bzoj2957][楼房重建] (线段树)
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- Java重写与重载之间的区别
重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类 ...
- C#中yield关键字理解
yield关键字之前用得较少,但是在做项目开发的过程中也遇到了,当时有点迷惑,就顺便研究学习了一下,以下是个人理解,不到之处欢迎拍砖!废话就到这,上代码: class Program { static ...
- 修改linux默认ssh 端口
修改ssh的默认端口 1.编辑ssh配置文件: #vi /etc/ssh/ssh_config #vi /etc/ssh/sshd_config ...
- GTK+2.0学习——C指针回顾
工作需要,开始做GTK,但是很久没碰C了,来捡一下C的精华. 一.*和&的意义 *:指针运算符 &:取地址运算符 两者优先级一样,从右向左方向结合 二.指针和指针变量 指针:一个变量的 ...
- JSTL标签库--核心标签库
->JSTL的使用和EL表达式是分不开的 ->JSTL标签库分为5类 1.核心标签库(这里只介绍该标签库) 2.I18N格式化标签库 3.SQL标签库 4.XML标签库 5.函数标签库 - ...