V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
michaelfeng
V2EX  ›  程序员

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

  •  
  •   michaelfeng · 2014-01-27 20:07:42 +08:00 · 16449 次点击
    这是一个创建于 3954 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有人知道微信的push消息是怎么实现的吗?

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

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

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

    在这里求教,望同学指点
    23 条回复    1970-01-01 08:00:00 +08:00
    l9S1ZHbn4KO3vq4i
        1
    l9S1ZHbn4KO3vq4i  
       2014-01-27 21:27:36 +08:00
    估计是tcp长连接、或者udp。
    wzxjohn
        2
    wzxjohn  
       2014-01-27 22:21:37 +08:00
    @leadworld 微信开长连接会被喷到死吧。。。
    michaelfeng
        3
    michaelfeng  
    OP
       2014-01-27 22:32:49 +08:00
    @leadworld 后来发现是使用的apple的notification center实现的,然后又
    michaelfeng
        4
    michaelfeng  
    OP
       2014-01-27 22:34:33 +08:00
    @leadworld 后来发现是使用的apple的notification center实现的,然后又去看了下sdk里面关于notification center的部分,没有细讲有个大概的流程,也在其他论坛里有人讲了下他们的想法。可能也是通过tcp或者udp等底层的方式实现,不得而知
    michaelfeng
        5
    michaelfeng  
    OP
       2014-01-27 22:34:48 +08:00
    @wzxjohn 后来发现是使用的apple的notification center实现的,然后又去看了下sdk里面关于notification center的部分,没有细讲有个大概的流程,也在其他论坛里有人讲了下他们的想法。可能也是通过tcp或者udp等底层的方式实现,不得而知
    itommy
        6
    itommy  
       2014-01-27 22:38:42 +08:00 via iPhone
    确定有把微信从notification center关掉后还能收到push的方法?
    lightening
        7
    lightening  
       2014-01-27 23:11:15 +08:00
    @michaelfeng
    @itommy
    我觉得你关掉的只是通知吧,但是微信还有 In-app notification,如果不在微信设置里关掉,应该还是会弹出通知,只是不是通过 notification center 的。
    standin000
        8
    standin000  
       2014-01-27 23:40:18 +08:00
    @lightening 不通过notification center, 如何在后台运行?
    itommy
        9
    itommy  
       2014-01-27 23:47:03 +08:00 via iPhone
    @lightening 理论上应该是只要屏幕上不在运行这个app了,就只能通过 notification center 来推送了。
    vixvix
        10
    vixvix  
       2014-01-28 00:07:08 +08:00   ❤️ 1
    如果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
        11
    lightening  
       2014-01-28 00:30:28 +08:00
    @standin000 @itommy
    接到给微信的推送消息,微信会被唤醒吗?如果他被唤醒,就能不通过通知中心发送了?

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

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


    所以,(你用微信在)网络特别烂的时候,可能发现已经阅读了一条消息,等一下却又收到了它的push信息。
    chisj
        17
    chisj  
       2014-01-28 16:11:52 +08:00
    我没发现微信的推送和其他app的推送有什么不同。
    Smartype
        18
    Smartype  
       2014-01-28 17:09:25 +08:00   ❤️ 2
    @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
        19
    cocorosiekz  
       2014-01-28 17:29:43 +08:00
    @Smartype 好吧。。。第二个没怎么看懂,什么是voip?Apple只允许voip?
    Smartype
        20
    Smartype  
       2014-01-28 17:38:23 +08:00
    @cocorosiekz voip 是一种应用类型,如果是你设计Skype,你将怎么处理/等待呼叫?
    cocorosiekz
        21
    cocorosiekz  
       2014-01-28 17:53:58 +08:00
    @Smartype 不懂。。。求解答
    chmlai
        22
    chmlai  
       2014-01-28 18:43:38 +08:00
    一般都是:
    应用在后台用的是苹果的推送服务;
    应用在前台用的是TCP长连接.
    apu159
        23
    apu159  
       2014-01-29 21:41:13 +08:00
    不用GCM的app 都是扯淡!国内只发现 淘宝 用的是GCM
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2282 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:10 · PVG 00:10 · LAX 08:10 · JFK 11:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.