有人知道微信的push消息是怎么实现的吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
michaelfeng
V2EX    程序员

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

  •  
      michaelfeng 2014-01-27 20:07:42 +08:00 16845 次点击
    这是一个创建于 4330 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有人知道微信的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     Solana     2768 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 08:55 PVG 16:55 LAX 00:55 JFK 03:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86