有人知道微信的push消息是怎么实现的吗?

2014-01-27 20:07:42 +08:00
 michaelfeng
有人知道微信的push消息是怎么实现的吗?

这里有两种,一种是通过apple的Notification Center,另一种就是关掉或者开着notification center都会收到的push。

想知道后者是怎么实现的,大家一起探讨下。基本上http和https的pushlet或者long poll的方式是可以排除的。然后经过几次测试发现好像用的是tcp,udp之类的底层协议完成的

本农自己知道的能想到的实现方式是socket+long poll的模型实现,但还不清楚是否还有其他的tcp ip的底层的其他实现方式。

在这里求教,望同学指点
16325 次点击
所在节点    程序员
23 条回复
leadworld
2014-01-27 21:27:36 +08:00
估计是tcp长连接、或者udp。
wzxjohn
2014-01-27 22:21:37 +08:00
@leadworld 微信开长连接会被喷到死吧。。。
michaelfeng
2014-01-27 22:32:49 +08:00
@leadworld 后来发现是使用的apple的notification center实现的,然后又
michaelfeng
2014-01-27 22:34:33 +08:00
@leadworld 后来发现是使用的apple的notification center实现的,然后又去看了下sdk里面关于notification center的部分,没有细讲有个大概的流程,也在其他论坛里有人讲了下他们的想法。可能也是通过tcp或者udp等底层的方式实现,不得而知
michaelfeng
2014-01-27 22:34:48 +08:00
@wzxjohn 后来发现是使用的apple的notification center实现的,然后又去看了下sdk里面关于notification center的部分,没有细讲有个大概的流程,也在其他论坛里有人讲了下他们的想法。可能也是通过tcp或者udp等底层的方式实现,不得而知
itommy
2014-01-27 22:38:42 +08:00
确定有把微信从notification center关掉后还能收到push的方法?
lightening
2014-01-27 23:11:15 +08:00
@michaelfeng
@itommy
我觉得你关掉的只是通知吧,但是微信还有 In-app notification,如果不在微信设置里关掉,应该还是会弹出通知,只是不是通过 notification center 的。
standin000
2014-01-27 23:40:18 +08:00
@lightening 不通过notification center, 如何在后台运行?
itommy
2014-01-27 23:47:03 +08:00
@lightening 理论上应该是只要屏幕上不在运行这个app了,就只能通过 notification center 来推送了。
vixvix
2014-01-28 00:07:08 +08:00
如果iOS的话notification分push和local. 如果app还在background的话可以做local. App要支持local的话provisioning profile同样要也要设置成支持push才能收到。

详细请看:
https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Introduction.html
lightening
2014-01-28 00:30:28 +08:00
@standin000 @itommy
接到给微信的推送消息,微信会被唤醒吗?如果他被唤醒,就能不通过通知中心发送了?

其实我从来没有关掉过微信的通知,不知道他被关掉了还能推送.
explon
2014-01-28 00:59:00 +08:00
@lightening 你都没试过还在这说半天我真服了你,我还以为有什么高级技术可以绕过通知中心呢!
lightening
2014-01-28 01:00:50 +08:00
@explon 恩……是我错了…… 可是谁能告诉我微信的 in-app notification 到底是什么啊!
cocorosiekz
2014-01-28 10:13:00 +08:00
自己加个定时器,然后到时推送,这不就是local push吗,android里头见到过,ios肯定也有啊,这是最基础的
camus
2014-01-28 11:46:57 +08:00
应该和COC差不多的方式,自带一个计时器,比如建筑升级,到点了就算在飞行模式也弹提醒
另外一个就是推送了,有人攻击你了,就实时推送一条下来了
darcy
2014-01-28 14:18:27 +08:00
没看过微信的源码,说一点大致的吧(QQ/Qzone)采用的方式,理论上都大相径庭的。
我们会把push分为在线push(自己的push通道)和离线push(苹果的push)

如果用户当前在线,就走自己的通道,有可能是长链接也有可能是http轮询,视具体网络状况而定
如果用户不在线,服务器才发苹果的push消息


所以,(你用微信在)网络特别烂的时候,可能发现已经阅读了一条消息,等一下却又收到了它的push信息。
chisj
2014-01-28 16:11:52 +08:00
我没发现微信的推送和其他app的推送有什么不同。
Smartype
2014-01-28 17:09:25 +08:00
@cocorosiekz iOS 才不容许你这么干。iOS 拼命杜绝平庸的工程师瞎搞。给你选了apple认为的最合适的方式。

Push是系统提供的。应用和系统注册,系统维护一个到Apple的长连接,然后这个连接在系统休眠的时候支持wod,wake up on data.从WiFi/Cell收到数据后apsd被唤醒,继而相应的应用在后台被运行,等到用户可能点击push notification banner, 如果用户点击了banner,应用被放到前台,并告知应用收到相应的push。应用就可以处理了。这个应用的push是要经过apple中转的。

应用也可以自己实现push, 方法有voip, 或者是现在的background refresh。
voip 时间方式的典型是Sparrow,可惜Apple也不容许,因为它不是voip应用。实现方式就是自己注册一个socket fd到系统,这个socket fd支持wod,这个socket有数据的时候,应用被唤醒10秒。你可以接收数据,然后发送一个local notification.

background refresh 系统不保证什么时候调用。
cocorosiekz
2014-01-28 17:29:43 +08:00
@Smartype 好吧。。。第二个没怎么看懂,什么是voip?Apple只允许voip?
Smartype
2014-01-28 17:38:23 +08:00
@cocorosiekz voip 是一种应用类型,如果是你设计Skype,你将怎么处理/等待呼叫?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/98517

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX