【转】推送怎么玩

推送和移动互联的关系,已经密不可分。每天你收到的推送是各大app的强有力的吸引用户黏住用户的工具。

那我们来具体了解下推送吧。目前的两大平台ios和安卓的推送的实现是有很大差异的。以下分开描述。

IOS&android简要对比

IOS推送即APNS - Apple Push Notification Service,依托一个或几个系统常驻进程,是全局的(接管所有应用的消息推送)的独立于应用之外,是设备和苹果服务器之间的通讯,而非应用的提供商服务器。

比如,网易云课堂的服务器(Provider)给苹果公司对应的服务器(APNS)发出通知,然后再中转传送到设备(Devices)上。当你接收到通知,打开应用,才开始从云课堂服务器接收数据。

而android的推送是各应用有各自的单独后台进程和各自的服务器通讯,交换数据,来达到推送的目的。比如云课堂有自己单独的推送进程:com.netease.edu.study.enterprise:pushservice。


    当该进程被kill掉之后,则无法收到推送。IOS则不存在类似问题。 另外其实 Android 也有类似 APNS 的 GCM(Google Cloud Message),属于开发者可选,非强制。而 Google 不强制的结果就是:没人真正为用户的电池负责。也因为整个技术方案非强制, Android 的 Apps 在接收到推送后的表现更为灵活。

所以iOS 的消息推送机制使得应用本身不能有常驻的后台进程,系统的开销少,内存使用更少,而 Android 则开销更大。

推送的一般技术原理

要理解推送的实现原理,首先要了解device_token。

UDID - iOS Unique Device ID,是每个iphone的标识符,可以通过连接XCode查看到,如下图中的identifier就是该设备的UDID。

Bundle ID(Bundle Identifier):一款iOS应用的唯一标识,应用与Bundle ID之间是唯一对应关系。应用新建成功后,Bundle ID将不可修改,如必须修改只能创建一个新的应用,届时App ID、App Key和App Secret也将重新分配,旧版用户将无法收到针对新Bundle ID的推送。

苹果服务器根据我们这一台设备的UDID和app的bundleID混编而成的deviceToken,我们需要将这个deviceToken传送给我们的服务器端,或者登陆用户的时候作为参数传给服务器.这样一个用户对象就绑定了一个deviceToken.当需要给这个用户推送消息的时候,我们自己的后台服务器,就会找这个用户对应的deviceToken和要发送的推送内容,直接发送到苹果的apns服务器,然后由苹果的apns服务器将消息推送到该deviceToekn对应的手机上。

deviceToken是ios设备在APNS上的标识(苹果服务器根据我们这一台设备的UDID和app的bundleID混编而成的deviceToken)用于推送服务。每个设备上的每个app有两个deviceToken,一个用于开发测试,一个用于生产环境。应用需要每次启动的时候都去注册远程通知,注册成功, APNs 会返回一个设备的标识符即deviceToken 给 App,一个用户对象就绑定了一个deviceToken.当需要给这个用户推送消息的时候,我们自己的后台服务器,就会找这个用户对应的deviceToken和要发送的推送内容,直接发送到苹果的apns服务器,然后由苹果的apns服务器将消息推送到该deviceToekn对应的手机上。

在需要发送push时,我们的服务端就会取出要发送的设备的device token,然后以下图所示的结构,组成字符串,然后将其发送到的APNs

第一个部分是命令标示符,第二个部分是我们的deviceToken的长度,第三部分是我们的deviceToken字符串,第四部分是推送消息体(Payload)的长度,最后一部分也就是真正的消息内容了,里面包含了推送消息的基本信息,比如消息内容,应用Icon右上角显示多少数字以及推送消息到达时所播放的声音等。

整个过程是这样:

首先,设备安装了具有推送功能的应用, iOS设备在有网络的情况下会连接APNs推送服务器,连接过程中,APNS 服务器会验证device_token,连接成功后维持一个基于TCP 的长连接;Provider(我们自己的应用服务器)收到需要被推送的消息并结合被推送的 iOS设备的device_token一起打包发送给APNS服务器;APNS服务器将推送信息推送给指定device_token的iOS设备,iOS设备收到推送消息后通知我们的应用程序并显示和提示用户(声音、弹出框)。

安卓推送

GCM

Google Cloud Messaging是 Google 自己的一套推送服务,也是系统级别的,但是众所周知,Google 的服务在国内根本没法使用,只能放弃。

轮询

轮询是最简单的与服务器保持通信的方式,即循环向服务器通信。这个方案的特点就是通信由客户端主动发起,你需要自己实现轮询消息队列、频率等等参数,在功耗和效果间做权衡,类似于TCP的短连接。

SMS

这个其实就是借助短信来实现信息的展示,只不过把短信内容展示到了Notification中,这个方案,到达率确实高,毕竟短信是比较可靠、稳定的,但劣势也很明显,就是成本很高,而且在Android平台上,短信的权限比较开放,容易被劫持。

长连接

长连接和前面提到的短连接,都是基于Socket连接的方式,他们的区别在与,短连接是每次数据传输完毕后就断开连接,而长连接不会。所以,基于轮询的方式,每次都要进行链路的连接,性能消耗更大,基于长连接的方式,就是对这点的改进。应用一旦与服务器连接成功,并不会主动断开连接,后面的通信都基于这个通道。目前大部分的推送服务都是基于长连接的推送,在后台维护一个Service,维持应用与服务端之间的TCP长连接。目前基本上是最多选择的方案。

但是目前基于成本上的考虑,大多数中小型公司都会选择使用第三方推送服务。

第三方推送服务

目前来说做的比较好的推送服务大概有小米推送、腾讯信鸽推送、百度推送、极光推送、友盟推送等。这些推送服务大都有以下特点:

免费

当然部分公司也有收费的,号称更稳定、推送到达率更高,但大部分都还是用的免费版。

服务会被杀死

由于 Android 系统的机制,后台推送 Service 会被各种主动的或是被动的行为给杀死,而服务一旦被杀死,意味着就接收不到推送消息。

多个 app 共用一条推送通道

什么意思呢?就是如果有多个 app 都使用了同一家推送服务,那么这些 app 共用一条消息通道,即使你家的 app 推送服务被杀死了,那么只要用户打开了其他集成该推送服务的 app ,你家的推送就能接受到消息。比如云课堂企业版现在使用的小米推送服务,云课堂企业版被杀死了,但是手机上只要其它也使用小米推送的app的进程还在,云课堂企业版还是能接收到推送消息。

每家的推送服务都号称推送到达率很高,号称自己家的推送服务更不容易被杀死,号称自己的推送更稳定更有保证,然而我要说的是,各家都差不多,技术上你能实现的,别家一样能实现,到达率也都差不多,据我观察平均推送到达率能达到 70% 左右都算不错的了,那么到底该怎么选择呢?

有一点比较特殊的是有些推送服务有自己家品牌的手机,比如小米有自己的手机,而在 MIUI 系统上小米推送是作为系统级的服务,不会被杀死,毕竟一家人,总不至于傻到把自己家的服务给干掉吧?所以这就是一个巨大的优势了。类似的华为推送服务在自己家的手机系统上也不会被杀死。

各大手机厂商都宣传自己家的手机市场份额第一,然而我要说的是如今市场上的 Android 手机只分小米手机跟其他手机,什么意思?就是小米手机是目前市场份额第一,而且远远领先其他手机,这个在我们自己家 app 的数据上看就是这样,而这里有一份友盟发布的 Android 设备活跃的排名数据,地址在这里:http://www.umindex.com

以小米手机的市场份额,加上小米推送在 MIUI 上不被杀死这一大特性,致使选择小米推送是第一选择。目前云课堂企业版安卓也选择了小米推送服务(哈哈)。

所以,你可以选择直接集成某个第三方推送,如果你想要把推送更优化下,那么可以集成多个推送服务,针对不同的渠道用不同的推送,比如小米渠道用小米推送,华为渠道用华为推送,其他渠道用信鸽推送等,但是这种也比较麻烦,具体怎么做看自己利弊权衡。

时间: 2024-08-25 00:53:32

【转】推送怎么玩的相关文章

iOS 玩转推送通知

转自:http://www.cocoachina.com/ios/20160316/15665.html 前言 推送通知,想必大家都很熟悉,关于原理之类的,这里就不过多阐述.在这里我们主要介绍下iOS8及iOS9之后关于推送的新功能.大家可能见过听说过,但可能有一些朋友并没有上手做过.这篇文章便给大家详细介绍推送中的快捷按钮及快捷回复等功能的实现. 快捷点赞,如微博点赞功能 效果图大家可以先看下: 首先先说如何为自己的推送添加快捷功能,该Demo中的动作 “赞”,代码如下: //创建消息上面要添

玩转ios友盟远程推送,16年5月图文防坑版

最近有个程序员妹子在做远程推送的时候遇到了困难,求助本帅.尽管本帅也是多彩的绘图工具,从没做过远程推送,但是本着互相帮助,共同进步的原则,本帅还是掩饰了自己的彩笔身份,耗时三天(休息时间)帮她完成了推送功能.PS:三天只打了一局dota,你们就知道这有多难,多耗时了.(其实并没有,真正做过一次就知道这其实很简单了,现在有程序媛再找本帅做推送,简直就是分分钟的事). 对不起请允许我这一次! 鉴于这次做推送的时间绝大多数都浪费在了"寻找教程->教程有误(更新不及时)->寻找教程"

玩转iOS开发 - 消息推送

消息推送 原文地址:https://www.cnblogs.com/zhchoutai/p/8550881.html

推送通知

推送通知的作用: 可以让不在前台运行的app 告知用户app内部发生了什么事情 推送通知的呈现效果: 1.在屏幕顶部显示一条横幅 2.在屏幕中间弹出一个UIAlertView 3.锁屏状态下也可以呈现 4.呈现推送通知的同时还可以更新app图标的数字 5.播放音效 用户接收的通知 都会展示在通知中心  如何打开通知中心:从屏幕顶部往下滑 就可以打开通知中心 推送通知的呈现效果设置: 1.显示横幅还是UIAlerView 取决于用户的设置 2.用户也可以决定是否要开启以下4个功能: 是否显示app

简析推送通知概念

一.远程推送通知 远程推送服务,又称为APNs(Apple Push Notification Services).简单推送流程如下: 二.极光推送通知 JPush iOS Push 包括 2 个部分,APNs 推送(代理),与 JPush 应用内消息. 1.APNs 推送,JPush 代理开发者的应用(需要基于开发者提供的应用证书),向苹果 APNs 服务器推送.由 APNs Server 推送到 iOS 设备上. 2.JPush 应用内推送部分,即 App 启动时,内嵌的 JPush SDK

消息推送平台乱象和趋势

最近笔者关注了一下推送这个领域,来给大家说说目前的推送的现状,我的一些想法以及这个行业的一些趋势判断.文章分两大部分,分别是消息的用户打扰以及消息通道和各推送平台的趋势. 消息的用户打扰 目前每日全网下发的推送消息大概是120亿条,这些消息主要在Android设备上,平均每个Android用户每天会收到30条以上的消息, 为什么呢,主要是因为Android手机生态的原因,关闭消息太难. 所以Android设备的用户每天生活在消息的轰炸之中,从业内的一些数据来看,现在Android的一条推送,从展

适配 iOS 8 时遇到的问题两则:远程推送和 Unwind Segue

原文:http://imtx.me/archives/1910.html 昨天我在微博上吐槽:iOS 8 / Xcode 6 真是史上对开发者最糟糕的版本了.收到很多朋友表达同感. 之所以这么说,倒不是针对 iOS 8 本身的特性来说的,相反,iOS 8 开放的那些扩展机制以及各种 Kit 对开发者来说是非常好. 我抱怨的是 Apple 最近对软件质量的控制不太好,上次发一个让手机不工作的 iOS 8.0.1 就不说了,iOS 8 / Xcode 6 本身充满了非常多的 Bug.Xcode 作为

UILocalNotification ios本地推送

Notification是智能手机应用编程中非常常用的一种传递信息的机制,而且可以非常好的节省资源,不用消耗资源来不停地检查信息状态(Pooling),在iOS下应用分为两种不同的Notification种类,本地和远程.本地的Notification由iOS下NotificationManager统一管理,只需要将封装好的本地Notification对象加入到系统Notification管理机制队列中,系统会在指定的时间激发将本地Notification,应用只需设计好处理Notificati

iOS10 推送必看 UNNotificationContentExtension

来源:徐不同(@2016徐小爷) 链接:http://www.jianshu.com/p/45933f5450a4 大伙久等啦~这绝对是最全最详细的 UNNotificationContentExtension讲解哟~ 这篇文章中,我会给大家补充完推送内容的后续部分,希望大家看完这篇文章后,便可以轻松的玩转推送了. 1.UNNotificationContentExtension 1.1.UNNotificationContentExtension简介 简单来说,UNNotificationCo