技术分享|手机推送原理剖析指南


源宝导读:本文旨在对手机推送原理进行剖析和阐述,对业务开发做一些方向性的解惑。

一、手机推送的基本概念 ——什么是手机推送?

  • 百度词条:手机推送服务是指服务器 定向将信息实时送达手机的服务

词条中有2组概念:

第一组是“服务器”和“手机”,说明了一条推送消息从哪里启程(服务器),到哪里是终点(手机);

第二组是“定向”和“实时”,说明推送是可以指定接收者的,并且到达的速度非常快!

我们平时所说的“推送”,“通知”,“app推送”,“推送服务”,“通知消息”,“通知栏消息”等等,指的都是同一个。

1、在苹果手机中的样式

2、安卓手机中样式

3、推送原理

由于移动网络的限制,服务器并不能在没有连接的情况下主动发送信息到移动端。所以推送本质上都是由手机设备发起,与推送服务器建立起连接通道(TCP长连接),通道就是保障推送到达的关键。

在iOS系统中,推送服务器是由苹果公司维护,所有的应用均使用Apple 推送通知服务 (APNs) 来实现。

在android系统中,海外有谷歌的GMS,用于推送。GMS全称为GoogleMobile Service,即谷歌移动服务。当然由于众所周知的原因,国内是使用不上的。

APNs和GMS的推送原理基本一致,通过系统建立推送通道,所有应用均使用该通道,推送信息由该通道进行分发:

其中系统接收到推送信息有两种可做的行为,一种是通知,一种是透传。

通知:系统只负责弹出下拉栏列表,需要用户点击才能唤醒应用。

透传:系统将信息投递给相关的应用,应用实时收到信息,可以进行业务逻辑,前提是应用未被杀死。

它们的关系如下:

iOS系统由于国内可用APNs服务,所以到达率相当稳定。而android系统没有统一的推送,导致发展较为缓慢,大致可以分为三个阶段:

1、混沌期

Android早期版本对于app限制极少,app可以在后台一直活着,甚至被杀还能被自动拉起。这时候很多app建立了自己的长连接推送:

这时候自建推送的技术门槛还是挺高的,维护成本也高,用户体验也不好,经常出现性发热卡顿等情况,还会偷偷的上传用户行为,毕竟这和植入一个木马区别也不大。

2、门派林立期

随着android系统权限的收缩,很少有应用可以在后台活着了,很多应用根本就活不久。加上这时候各大厂已经形成了自己的体系,比如企鹅系,阿里系等等,大厂间的基础设施逐渐完善,应用活不久没关系,只要用户用了派系中的一个还是可以相互唤醒的。

而其他应用则可以抱团使用第三方的推送,第三方也可以实现使用同一推送间相互唤醒:

3、厂商掌权期

随着android版本的进一步提升,厂商们开始考虑各种用户体验问题,唤醒链也不好使了。为了电量和性能,app的生存现状堪忧。

第三方的如极光百度推送自建的推送越来越难到达了。各大手机厂商推出了自己的系统推送服务,扮演起了如苹果般的角色。

到了这个时候,推送的原理已经APNs基本一致了。

有些厂商比较有野心,像小米除了自家的系统推送外,也支持别的手机,但是此时它的工作原理就和极光一样,实现的是第三方推送了,所以到达率也和薛定谔的猫差不多,时灵时不灵。

小结:

到现在为止,国内拥有自主厂商通道主要有华为、小米、oppo、vivo、魅族,这几家合计占据85%以上的android市场份额,接入这几家厂商推送,可以保障大部分的机型推送能到达,至于其他小众品牌,只能依赖第三方推送,第三方推送大家起点都一样,能否到达就有点看缘分了。

推送能到达,不一定就能满足业务场景,像网络电话直接唤起应用的场景,在应用死亡的情况下,还是做不到的。

当然也有例外,比如微信支付宝等:

加油把自己app做到亿级用户,你也能有这样的特权!

二、业务实践

那么一个业务如何实现接入自己的推送呢?

简单描述一下大致的流程:

1、推送都会生成一个设备ID,这个设备ID在一段时间内维持不变。在app启动的时候应该就可以获取到。

2、将这个设备ID和用户绑定起来,做映射关系。

3、业务推送到用户的时候,就转换成设备ID访问厂商推送接口。

4、厂商推送将信息送达用户。

注意点:

1、厂商推送接口一般为http接口,每次访问有设备数量限制,而且有些还有调用频率限制,一个好的实践是异步批量调用,队列+切片是常用的做法。

2、有些厂商会提供回调接口,用来反馈到达的情况,可以看情况使用。

准备工作:

iOS:需要推送证书,在苹果的开发者平台向苹果公司申请,使用时候证书和代码实现要在一起。

Android:各个平台要求不一样,大致如下:

平台

地址

需要填写的参数

小米

https://dev.mi.com/console/appservice/push.html

XIAOMI_APP_ID、XIAOMI_APP_KEY

OPPO

https://push.oppo.com/

OPPO_APP_KEY、OPPO_APP_SECRET

VIVO

https://dev.vivo.com.cn/openAbility/pushNews

VIVO_APP_ID、VIVO_APP_KEY

魅族

http://push.meizu.com/

MEIZU_APP_ID、MEIZU_APP_KEY

可能遇到的问题:

推送收不到!

推送收不到分为2种情况,一种是从来没有收到过推送;一种是原本推送服务使用正常,突然收不到推送了!

对于前者,一般在程序开发阶段就能解决问题,相对比较简单; 对于后者,情况就复杂一些了。针对后者出现的情况,需要做如下方向上的排查:

- 手机能否联网,网络是否通畅?无网时是不能收到推送的。

- 手机系统近期是否有发布新的版本,用户更新到了新的版本?如果是,则可能需要对新版本做适应性的配置。

- APP的代码,和服务端的代码,近期是否有与推送功能相关的改动?如果有,请排查代码影响。

iOS推送证书的有效期长度一般为1年,在申请时即可看到过期时间!如果使用了第三方服务,第三方仅可以保管证书,不能更新证书。因此推送证书过期后需要重新申请新的证书,并上传到第三方。

部分第三方服务提供者,在证书过期时未能给到明显的提示。该问题的在排查时也比较隐蔽,不易发现,因此需要多加注意。

若使用了三方的付费服务,也应该检查余额是否充足,欠费时推送服务会被停止。不过相对于证书过期问题的提示,欠费的催缴提示会格外明显,基本不可能被忽略!比如发送多份提醒邮件,或第三方客服直接给相关的负责人打电话提醒需要充值续费 。

如果以上情况经过排查后均没有问题,则需要考虑一些不常见的场景和偶发性的情况,包括但不限于如下所述:

- 用户对手机进行了恢复出厂设置,之后尚未允许授予APP推送功能权限

- 用户对APP的推送权限进行了手动关闭

- 信号差、网络波动导致推送明显延迟或丢失

- 手机系统偶尔出现的bug导致推送接收失败

- 手机系统提供商的推送服务器问题

- 其他未知原因…………

解决问题三步曲:

第一步:删除APP,重新下载安装后打开,在询问是否允许授予推送权限时,点击“允许” ,然后进行推送测试!

第二步:若第一步未能奏效,请重启手机,然后进行推送测试!

第三步:说出来你可能不信,如果第二步仍未奏效,请删除APP后重启手机,重启后下载新的APP,打开并允许接收推送,然后进行推送测试!

除此之外根据推送的原理,如果不在厂商推送的机型,是极有可能收不到的。

解决的办法:

1、社会工程学。引导客户设置通知权限,开启白名单。可以提高到达率,主要机制是让应用不死那么快,第三方(如小米)可以活着接受到推送。

Android可以参考云助手的推送设置方式:https://tenants.fdccloud.com/wzsversion/pub-view/wzshelper-for-phone-list

iOS记得给权限:

1、钞能力。如果是强时效性的业务,建议增加短信、电话等通知。

2、努力把自己变成强势的一方,比如每天都亿级活跃用户。

其他的问题:

特殊场景:如网络电话等,可以和厂商谈合作,但都有极高的门槛。

其他的需求欢迎咨询移动超级app一组。

最后欢迎使用移动appcloud提供的mpush插件和对各厂商封装的PHP-SDK

PHP-SDK:https://packagist.org/packages/yunchuang/push

mpush文档地址:https://appcloud-static.mypaas.com.cn/plugin/readme/mpush/1.2.4/index.html

----- END ------

作者简介

弓同学: 研发工程师,目前负责超级APP平台相关工作。

也许您还想看:

记AWSS3在iOS端的一次改造事件

移动平台对于跨平台技术方案的探索

更多明源云·天际开放平台场景案例与开发小知识,可以关注明源云天际开发者社区公众号:

【集成】新一代集成开放平台——星图你了解吗?

【建模】ERP日志分表,提升海量日志存取性能

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IO控制命令

ioctl 控制套接字IO行为,获取套接字未决IO的信息。 向套接字发送ioctl命令的函数有两个 一个是源于winsock1 的 ioctlsocket 另一个是 winsock2 新引进的 WSAIoctl ioctl的常用命令: FIONBIO:将套接字设置于非阻塞模式 FIONREAD:返回套接字上…

闽高校计算机二级c语言模拟器,闽高校计算机二级C语言模拟卷及答案.doc

闽高校计算机二级C语言模拟卷及答案.doc (54页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!9.90 积分一、单项选择题(每小题2分,共20分)1.以下4组用户定义标识符中&#xf…

重磅!中国最赚钱的公司,要上市了!

全世界只有3.14 % 的人关注了数据与算法之美12月31日,中国烟草子公司中烟国际(香港)神秘地向香港交易所递交了IPO的材料,赶上了2018年的末班车。嫡子上市,中国烟草自己向众人掀起了裙裾一角。过去三年,中烟…

浅谈VS2012单元测试

1、先建一个工程此工程带有待测试的方法 2、在解决方案中建立单元测试 3、在测试项目中添加测试项目的引用 4、写测试用例 namespace UnitTestProject1 {[TestClass]public class UnitTest1{[TestMethod]public void TestMethod1(){var restClient (IRestClient)new JsonServi…

我写代码时的小倔强

分享自己写代码时的好习惯,让你的编程能力突飞猛进!大家好,我是鱼皮,上回说到,很多同学在学编程时不注重代码质量,养成坏习惯的同时,失去了提升自己编程能力的机会。还没读上篇文章的同学&#…

c语言管理系统信息以文件保存,求大神给一份能用的c语言的学籍管理系统:且能进行文件保存...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#pragma comment(lib,"libmysql.lib")void showmenu(){system("cls");prinft("\n\n\n\n\n");prinft("\t ┏━━━━━━━━━━━━━━━━━━━━━━━┓ \n");prin…

10个舍不得删的高质量公号

全世界有3.14 % 的人已经关注了数据与算法之美在信息爆炸的时代快节奏的生活里 你是否曾有一瞬间觉得忙碌而空虚?以下10个优质公众号能让你在闲暇的时候不断的提升自我,拓宽视野愿以书卷气,行我路千里历史学资讯ID:tongbanlishi▲…

数据初始化

成员初始化:java保证所有变量在使用前必须初始化。对于方法的局部变量,java以编译时错误的形式来保证,所以如果写成:void f(){int i;i; //Error.. i not initialized}会得到一条错误信息,告诉你i 可能尚未初始化。当然…

ML.NET Cookbook:(7)如何训练回归模型?

通常,为了在ML.NET中训练任何模型,您将经历三个步骤:弄清楚训练数据如何以IDataView形式进入ML.NET。将“学习管道”构建为一系列基本的“运算符”(估计器)。在管道上调用Fit以获得经过训练的模型。示例文件[1]:featur…

android动画送礼物,Android仿直播类app赠送礼物功能

直播界面实现的是播放本地的视频文件:/*** 直播界面,用于对接直播功能*/public class LiveFrag extends Fragment {private ImageView img_thumb;private VideoView video_view;NullableOverridepublic View onCreateView(NonNull LayoutInflater inflat…

一张纸一幅图,竟然提高了10倍的学习和工作效率!?

人类大脑的容量远远超出一般人的想象,时到21世纪的今天,我们对大脑的运用远远不够。大脑机能的使用率基于我们的思维模式,而思维导图正是开发大脑中最有效的利器!之前小木给大家推荐了一套基于少儿大脑思维开发的书籍——东尼博赞…

ftp 使用

先假设有一FTP服务器,FTP服务器:qint.ithot.net,用户名:username 密码:user1234。在本地电脑D:盘创建一个文件夹"qint"。将要上传的文件复制到d:\qint里。通过FTP命令将文件从本地上传&#xf…

C# 消息队列之MSMQ

首先说一下,消息队列 (MSMQ Microsoft Message Queuing)是MS提供的服务,也就是Windows操作系统的功能,并不是.Net提供的。消息队列(MSMQ)技术使得运行于不同时间的应用程序能够在各种各样的网络和可能暂时脱机的系统之…

单调谐回路谐振放大器等效电路分析_手把手教你如何分析三极管电路

三极管有静态和动态两种工作状态。未加信号时三极管的直流工作状态称为静态,此时各极电流称为静态电流。给三极管加入交流信号之后的工作电流称为动态工作电流,这时三极管是交流工作状态,即动态。一个完整的三极管电路分析有4步:直…

android工程jrr版本怎么改,ionic3 生成android 如何控制versionCode版本号

POJ 1321 DFS题意:POJ少见的中文题,福利啊. 思路: 一开始也没有思路呃呃呃 . 裸搜,连样例都过不去...参照了网上的题解:一行一行DFS 茅塞顿开啊. #include #in ...SlickGrid example 4: 过滤ompoment" syntax. But ng-annotate doesnt understand ".co ...…

惊呆了!竟然还有这样的操作!

2018已成为过去,2019的序幕已经悄然打开!2019开年钜惠盛大来袭!(福利在最后!!!)Python专场Python快速入门实战(59.9)人工智能的浪潮下,Python因其…

弹出消息对话框类

using System.Text; namespace DotNet.Utilities { //页面中弹出对话框 public class MessageBox { private MessageBox() { } #region 显示消息提示对话框 /// <summary> /// 显示消息提示对话框 /// <…

使用 .NET 升级助手将.NET Framework应用迁移到.NET 5

从.NET Framework 迁移到.NET 5 犹如搬家&#xff0c;我们都知道搬家是很痛苦的&#xff0c;我们请求搬家公司来减轻我们的压力&#xff0c;.NET 升级助手 的作用就类似我们聘请的搬家公司&#xff0c;帮助我们处理繁重乏味的迁移工作。.NET 升级助手是一个全局命令行工具&…

java 逐行写入csv_go|使用go读写CSV文件

生成CSV文件package mainimport ("encoding/csv""log""os")var data [][]string{{"tom", "18", "beijing"}, {"jon", "19", "shanghai"}}func main() {file, err : os.Create(&qu…

用android ndk编译ffmpeg,AndroidNDK交叉编译FFMPEG

1. 简介在进行安卓音视频开发时&#xff0c;利用安卓NDK工具交叉编译FFmpeg&#xff0c;生成可供安卓平台调用的FFmpeg库是最基础的工作。本篇文章介绍了利用NDK进行FFmpeg编译的具体过程&#xff0c;以及如何在Linux和windows系统下交叉编译出适用于不同安卓平台的FFmpeg库文件…