APP消息推送(APP Push)解决方案-服务端工作逻辑和实现



一、APP 推送概述:

App推送消息是我们常见的一种app消息提醒方式。
我们的实现需要第三方的支持,实现方式是后台通过接口将Push请求发送至第三方,第三方实现在App所在设备上的推送。

二、APP推送后台处理逻辑:

在与推送平台交互时,后台需要向第三方发送两部分信息, 推送目标终端标示+推送内容

1、推送目标终端标示:

APP推送需要定位目标终端,也就是说要给那台设备进行推送,
简单的情况下,单设备推送,我们需要拿到一个终端ID的概念,用于定位目标设备,
注:不同渠道中使用的单设备ID方式也不尽相同,以下用TokenID来表示这个终端ID的概念。
而实际推送渠道中往往还有自定义的功能,比如通过打标签的方式将TokenID进行划分,达到批量差异化的效果。

2、推送内容:

即指通过API接口参数的定义终端上收到的Push消息的内容和格式。
其中IOS的推送消息在展示上区别于安卓的一点是没有title,title的部分只能是默认的APP名称,而安卓的部分虽然默认值也是APP名称,但是也支持自定义title。

三、后端实现:


通过上述的处理逻辑可得知,后端首先需要登记客户端的TokenId,然后保持TokenID的有效性更新,然后在需要发送APP推送时拿到用户的有效TokenID,
然后使用TokenID和已有的内容信息通过API与三方Push服务交互,完成推送。
即后端的实现分为两部分:
1、TokenID的登记
2、App Push API的调用

注:以下示例中有两个元素为本项目的特殊情况:
其中product_id是因为当前项目中客户端同时有多个版本,不同版本需要推送独立处理,但在同一张表内统一记登记;
而login_id跟member_id同时存在是因为当前系统中存在共享账户的情况,一般账号账户一对一的情况login_id和member_id是绑定的,不需要同时重复登记。

1、TokenID的登记:

以下是现项目使用的TokenID登记表结构:
/*==============================================================*/
/* Table: sys_app_push_token                                    */
/*==============================================================*/
create table sys_app_push_token
(record_id            int(11) not null auto_increment,login_id             int(11),member_id            int(11),push_token           varchar(200),visit_device         int(4) comment '3:Android;4:IOS',product_id           varchar(20) default '0' comment '',push_channel         int(4) default 1 comment '1:IOS信鸽,2:华为,3:小米,4:极光',nstatus              int(4) not null default 0 comment '状态:0:申请中;1:生效;2:失效;3:删除;4:历史记录',create_userid        int(11) not null default 0,create_time          varchar(20) character set utf8 not null default "",edit_userid          int(11) not null default 0,edit_time            varchar(20) character set utf8 not null default "",this_remark          text,description          text,create_ordernum      varchar(30) character set utf8 comment '记录创建时的流水号',last_ordernum        varchar(30) character set utf8 comment '记录最后一次编辑时的流水号',primary key (record_id)
)
ENGINE  = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
auto_increment = 10000
row_format = COMPACT;alter table sys_app_push_token comment 'app推送token表';/*==============================================================*/
/* Index: Index_1                                               */
/*==============================================================*/
create index Index_1 on sys_app_push_token
(record_id
);

以下是APP上传TokenID接口上传参数列表:




注:其中,推送渠道绝对在做Push时使用哪家API,参数的判定交由客户端进行处理,后端直接登记判定结果。

以下是TokenID登记接口处理方法
	@Transactional(readOnly=false)public boolean uploadMemberPushTokenEnt(TrainVansContext trainVansContext) {try {//check already datatrainVansContext.getTrainVansRequest().put("login_id", TrainVansUtils.getMV(trainVansContext.getTrainVansRequest(), "login_login_id"));// get All memberRelationtrainVansContext.getTrainVansRequest().put("relation_type", TrainVansUtils.getMV(trainVansContext.getTrainVansRequest(), "visit_role"));List<Map<String,Object>> memberRelationList = SpringContextHandler.getBean(MemberService.class).getRelateMemberListByLoginId(trainVansContext);for(Map<String,Object> memberRelateMap : memberRelationList){//trainVansContext.getTrainVansRequest().put("member_id", TrainVansUtils.getMV(memberRelateMap, "member_id"));Map tokenMap = SpringContextHandler.getBean(AppPushService.class).getPushTokenMapByLoginMap(trainVansContext.getTrainVansRequest());//disable already dataif(tokenMap != null){if(!TrainVansUtils.getMV(tokenMap, "push_token").equals(TrainVansUtils.getMV(trainVansContext.getTrainVansRequest(), "push_token"))){//trainVansContext.getTrainVansRequest().put("record_id", TrainVansUtils.getMV(tokenMap, "record_id"));if(!SpringContextHandler.getBean(AppPushService.class).updateDiabledThePushToken(trainVansContext)){throw new RuntimeException("TranVans_Operate_Exception");}//insert new dataif(!SpringContextHandler.getBean(AppPushService.class).insertPushTokenRecord(trainVansContext)){throw new RuntimeException("TranVans_Operate_Exception");}} }else{//insert new dataif(!SpringContextHandler.getBean(AppPushService.class).insertPushTokenRecord(trainVansContext)){throw new RuntimeException("TranVans_Operate_Exception");}}}return true;} catch (Exception e) {TrainVansUtils.setRetInfo(trainVansContext, "10005001","Register TokenID Error");e.printStackTrace();throw new RuntimeException("TranVans_Operate_Exception");}}

注:方法外部有一个关于对应本账号的对账户列表的遍历,遍历中的处理部分为TokenID的登记处理操作。

2、APP Push API 的调用


推送渠道:
APP推送不仅仅要求在APP打开状态时或者后台运行时进行消息推送,更多的场景是在移动终端关闭APP的场景下进行消息推送,
渠道的优劣无非在于两个维度,送达率和送达效率。
其中安卓推送的渠道较为杂乱,其中华为和小米提供的PUSH服务对于自平台的移动终端支持的较为完善,而没有厂商提供PUSH服务的终端只能通过
第三方服务来进行对接。

对于现有的这些渠道进行如下总结:
1、IOS:信鸽推送,这个推送在我门公司中经历了三个项目,推送效果稳定。API接入也方便, 是IOS端的不二选择。
2、Android-华为:华为自平台。
3、Android-小米:小米自平台。
4、Android-其他:目前使用的是“极光推送”。在理想状态下送达率和送达效率表现很好,但并不如以上三家渠道稳定。

在进行调用时可根据之前定义的push_channel分发给各自的渠道,各渠道的具体对接请各自查看官网,API都很完善。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1381942.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

app消息推送的详细实现教程

实现的主要思想 app实现消息推送&#xff0c;利用的是第三方的个推平台&#xff0c;后端将需要推送的内容通过第三方个推服务器传递给手机端。 具体前端打包配置 根据上图可知&#xff0c;采用的打包软件是Hbuilder X,在模块配置的时候&#xff0c;勾选push模块中的uniPush。…

App消息推送的原理

文章目录 1. 基本概念2. iOS和Android消息推送原理对比2.1 iOS2.1.1 基本原理2.1.2 优劣势 2.2 Android2.2.1 基本原理2.2.2 优劣势 3. Android消息推送原理3.1 操作系统有自身的消息推送功能&#xff08;系统级别&#xff09;3.2 三种基本的推送方式&#xff1a;Push、Pull 和…

php实现app消息推送

如何用php实现APP消息推送 现在有很多的消息推送厂商&#xff0c;比如阿里云的消息推送&#xff0c;极光推送&#xff0c;融云的消息推送。他们的原理都是把sdk内置在app里面&#xff0c;达到消息推送的目的&#xff0c;通过一张图来了解一下&#xff0c;看不懂不要紧&#xf…

Android,ios,安卓app推送消息通知,java后台向手机推送app的通知教程

文章目录 一、业务介绍1.1 产品简介1.2 名词解释1.3 消息推送流程 二、应用创建三、客户端 SDK 集成3.1 Android3.2 iOS 四、服务端推送4.1 服务端消息下发流程&#xff08;必读&#xff09;4.2 开发者中心后台4.3 推送代码 五、参数说明 一、业务介绍 1.1 产品简介 个推是商…

App消息推送概述

消息推送介绍 消息推送&#xff08;Push&#xff09;&#xff0c;是指从云端服务器到手机终端的消息推送通道&#xff0c;运营人员可以通过自己产品后台或者第三方推送通道对用户移动设备进行主动的消息推送。通过消息推送&#xff0c;目标用户可以在移动设备通知和状态栏看到…

PushDeer:一种无APP的通知推送解决方案

概述 去年六月&#xff0c;我曾写下一篇博客介绍如何 借助 ServerChan 实现个人微信通知推送&#xff0c;在那篇文章中介绍了 ServerChan 及其使用方法&#xff0c;总的来说&#xff0c;对于简单的通知需求&#xff0c;使用 ServerChan 是非常简单有效的。但是实际使用起来&…

一文让你知道关于App推送那些事

推送相关介绍 在用户未打开App时&#xff0c;服务端向用户推送服务器最新的消息数据&#xff0c;称为推送。消息推送在移动开发中用到的场景非常多&#xff0c;比如典电商类app的商品促销活动&#xff0c;资讯类的app的新闻推送等等。在实际开发中&#xff0c;我们常常会根据产…

关于ISO27701隐私信息安全管理体系介绍

01 什么是ISO27701 ISO27701是对ISO27001信息安全管理和ISO27002安全控制的隐私扩展&#xff0c;全称《安全技术—扩展ISO27001和ISO27002的隐私信息管理—要求与指南》&#xff0c;是ISO标准委员会以ISO 27001为基准&#xff0c;以ISO27552为蓝本&#xff0c;建立发布的隐私…

双向循环链表、dancing links

目录 双向循环链表 力扣 426. 将二叉搜索树转化为排序的双向链表 十字交叉双向循环链表&#xff08;dancing links&#xff09; 精确覆盖问题 dancing links X算法&#xff08;V1递归版&#xff09; POJ 3740 Easy Finding 数独 X算法优化 X算法&#xff08;V2非递归…

jpg照片太大怎么压缩变小?jpg如何缩小图片大小kb?

我们平时在接收过多的jpg格式图片的时候&#xff0c;越大的图片虽然越清晰&#xff0c;但是接收和储存起来就非常不方便&#xff0c;那么有没有什么办法可以将jpg图片压缩呢&#xff1f;其实现在可以通过在线图片处理工具来完成jpg压缩&#xff08;https://www.yasuotu.com/jpg…

html宽度一变小图形就上去,如何把图片大小变小?

我们在布局图片列表时&#xff0c;通常我们要控制图片的高度和宽度这样来达到图片统一。我们在HTML布局时候直接在图片img标签加宽度和高度属性即可控制图片高和宽。 一、html img图片标签高度宽度设置 我们可以直接在图片标签设置宽度width和高度height&#xff0c;这里需要注…

ChatGPT等人工智能编写文章的内容今后将成为常态

BuzzFeed股价上涨200%可能标志着“转向人工智能”媒体趋势的开始。 周四&#xff0c;一份内部备忘录被华尔街日报透露BuzzFeed正计划使用ChatGPT聊天机器人-风格文本合成技术来自OpenAI&#xff0c;用于创建个性化盘问和将来可能的其他内容。消息传出后&#xff0c;BuzzFeed的…

照片怎么转换大小?怎么把图片尺寸变小?

平时在使用QQ截图之后&#xff0c;发现图片尺寸过大不方便上传&#xff0c;该怎么解决图片大小转换问题呢&#xff1f;本文将介绍一款图片改大小&#xff08;https://www.yasuotu.com/size&#xff09;工具&#xff0c;可以在线处理图片尺寸&#xff0c;打开浏览器即可调整图片…

照片大小kb怎么调整变小?

伴随着工作和生活的需要&#xff0c;图片的应用遍及我们生活和工作的方方面面&#xff0c;随之我们的电子设备上面累积的图片文件也越来越多。因为图片使用的场景不同&#xff0c;所以对图片的大小也有不同的要求&#xff0c;那就要求我们学会调整照片大小的方法&#xff0c;会…

如何压缩照片大小-照片无损压缩办法

图片大家都不陌生&#xff0c;于生活于工作我们都能接触到&#xff0c;但并不是原图片什么样&#xff0c;我们都可以直接进行使用的。很多图片的质量虽然特别的高清&#xff0c;但是它的体积也像特别大&#xff0c;这时候无论我们是传输给他人&#xff0c;还是上传到各个社交媒…

C#,数值计算——抛物线插值与Brent方法(Parabolic Interpolation and Brent‘s Method)的计算方法与源程序

using System; namespace Legalsoft.Truffer { /// <summary> /// 抛物线插值与Brent方法 /// Parabolic Interpolation and Brents Method /// </summary> public class Brent : Bracketmethod { public double xmin { get; set…

【Linux操作系统】深入理解Linux系统编程中的open函数

在Linux系统编程中&#xff0c;open函数是一个非常重要的系统调用函数&#xff0c;它用于打开或创建一个文件&#xff0c;并返回一个文件描述符。本文将详细介绍open函数的用法&#xff0c;并给出具体的代码示例。 文章目录 1. 函数原型2. 函数参数2.1 flags参数2.2 mode参数 …

34. 应用监控【监控端点配置】

当一个 Spring Boot 项目运行时&#xff0c;开发者需要对 Spring Boot 项目进行实时监控来获取项目的运行情况&#xff0c;在项目出错时能够实现自动报警等。 Spring Boot 提供了actuator 来帮助开发者获取应用程序的实时运行数据。开发者可以选择使用 HTTP 端点或JMX来管理和监…

数据监控平台

数据监控平台 监控平台需要实时监控业务指标数据&#xff0c;系统特点&#xff1a;高并发&#xff0c;大数据&#xff0c;低延迟。主要使用的技术&#xff1a; HBase存储海量数据&#xff0c;ScriptEngine引擎&#xff0c;MySQL分表&#xff0c;Redis集群。 高并发&#xf…

应用监控系统

做这个系统其实当时的想法是开放给开发&#xff0c;然后开发自己做一些自己需要的监控&#xff0c;以便最早发现问题&#xff0c;但是做完发现跟nagios\zabbix重复的相当严重&#xff0c;其实应该在nagios\zabbix上继续开发一下应该会更好&#xff0c;先贴出来吧&#xff01; 一…