94 条评论 至 “iPhone的Push(推送通知)功能原理浅析”

  1. beak 说:

    看了你的文章,受益匪浅
    但是还是有几个问题:按照你说的话,那是不是有锁版的机器除了签订合同是不是就没有别的办法能正常使用push了?无锁版的如果是刷的自定义固件,是不是也是等于废了PUSH?那是否可以通过在刷自定义固件之后恢复在刷之前itunes激活之后备份的com.apple.apsd.plist文件来恢复PUSH功能呢?
    烦请指教,谢谢!

    • 晓晓 说:

      那是不是有锁版的机器除了签订合同是不是就没有别的办法能正常使用push了?

      不是这样的。有锁版的iPhone可以先用对应的SIM卡激活。或者如文中所说,打补丁。

      关于无锁版刷自定义固件的问题。不好意思,我没用过无锁版本,所以不是很清楚。但是自定义固件本身也是内置blackra1n,仅在有锁版本下执行的吧?嘛,具体不清楚

      备份com.apple.apsd.plist是不够的。因为建立TLS链接需要设备证书(device)和密钥(key),而这两者还与keychain文件内的某些内容保持一致。这里的一致性问题我没有考察过。但是如果完整备份这些文件,或许是可行的。

      • beak 说:

        谢谢!受教了!

        • 晓晓 说:

          啊啦,客气客气哈~

          • beak 说:

            关于某论坛的Pushfix_D补丁你有些话没有说
            请问能私聊不?

            • 晓晓 说:

              并非不方便说。只是写作该文的时候,关于那个补丁的信息还没确认。

              这几个补丁的具体实现细节,我个人没有太深入。所以很多结论现在说还为时过早。等确认了,我会把结论写上来的。

              • beak 说:

                了解~~~

              • Dylean 说:

                补充:
                所有的Pushfix,他的根本都是一样的。
                使用的都是DevTeam的Pushfix工具:
                使用Nimble获取Certificate
                使用Inject写入Certificate

                另外,Lz知道第二次加密是几位加密么?知道这么在这样加密的情况下重复的概率是多少么?
                PushFix 1.0已经完全无法使用

                现在想顺利push只有3个办法:
                1:购买无锁版的iPhone
                2:使用原运营商的Sim激活
                3:购买使用PushFix2.0 (每个生成Certificate都是唯一的)

                如果除去上面三种方法,唯一能做的也就是使用同样的Certificate,加密产生不同的令牌。

                PushFix_D做的仅仅是让以前的Pushfix补丁重新可以工作,仅此而已。That's all。

                另外我想说,不断的生成唯一的Certificate并不难,而且技术是公开的。
                但是这些pushfix都是作者无偿提供给大家使用的,本身就是义务的。

                收费的pushfix2.0作者收的也是幸苦费而已。

                • 晓晓 说:

                  啊拉拉,非常感谢你的补充!

                  由于我对加密技术本身不是特别了解,所以之前得出准确的判断都比较困难呢~还是你的描述一语中的~

                  不过你开头的话稍微有点偏离啦——

                  pushfix的作者在pushfix 1.0出来之后,就开始提供手工制作的唯一的证书(certificate)
                  而后来的pushfix 2.0,虽然是deb安装,但也是从pushfix.info服务器上,下载对应imei码的证书

                  ——因此他只用了inject写入。

                  当然,写作这篇文章的目的,并非指责Pushfix以及Pushfix_D。它确实可以凑合用。

                  但这种方法确确实实存在的缺憾,不写出来的话,大概对不住某论坛里那群收到QQ串消息的人吧。

                  顺便,腾讯还得为串消息的情况背个黑锅,蛮可怜的。

                  嘛,还是很感谢你的长篇解释哈!

  2. lovee 说:

    SSL证书贵的一塌糊涂,偶本来想弄一个的,结果一个两万多日元,而且还每年都得付款- -b

  3. gugu 说:

    你好,为什么我用sim卡激活后再越狱解锁的还是无法使用push,有锁版3G

    • 晓晓 说:

      描述太粗略了……

      请自行检查一下/var/mobile/Library/Preferences/com.apple.apsd.plist 文件状态……

      用DFU模式重新刷官方固件再来会比较靠谱。而且最好保证你的iPhone网络连接是畅通的——至少要能够让iPhone连接到APNS。

  4. gugu 说:

    我本来push是有时收到有时收不到,所以我把com.apple.apsd.plist 119字节给删除了,然后DFU刷机,自带卡激活后越狱解锁,可是现在怎么也下不到这个文件了...

    • 晓晓 说:

      囧。你的网络环境有问题。大概连接不到APNS。换个SIM卡重新来,然后安装一个Push的程序,分别看看在手机网络下和Wi-Fi下能否连接到APNS了。

      最好在获得了设备令牌(device token)之后,再解锁。

  5. gugu 说:

    能否把你的那个文件发给我试试

  6. coolxll 说:

    好文章,收藏了

  7. Harrydotter 说:

    港版3GS,使用移动神州行SIM卡。
    如果一开始使用wifi接入网络,并且登陆QQ,然后关闭QQ,QQ能够正常执行push信息。并且在此前提下即便是关闭了wifi,QQ也能成功push。
    如果一开始就没用wifi接入,手机重启或者开飞行过后,直接用cmnet让QQ登陆,关闭QQ后完全无法接收到push的信息。
    为了针对此问题进行验证,我甚至尝试了重新恢复iPhone到官方固件,未越狱前提下,仅仅安装QQ,仍然如此,就是说第一次必须在wifi环境下登陆QQ,之后才能收到push,并且离开wifi环境后gprs仅能保持较短时间push正常工作。稍长时间后也失效。
    之后我又对ebuddy pro进行了测试,居然和QQ一样的结果。

    把威锋上所有关于QQ push的帖子都翻了一遍,和我一样情况的人也有几个。最后更离谱的是某兄换了联通卡就全ok了。难道……移动的问题?我宁肯相信这是因为节假日的原因……关闭什么为了缓解压力?

    • 晓晓 说:

      确实.你猜得没错.

      移动似乎关闭了Push用的5XXX端口(具体忘了,待查).3天后我会把具体的信息补充到文章中(使用netstat命令查看Push链接建立状态)

      不过,终归这是移动的问题.
      还是归顺联通吧...呵呵

  8. 二进制的猫 说:

    你好,我是大陆一位1代用户。我也出现了EDGE无法独立建立到服务器5223的连接的情况。
    真是头疼啊。。。
    你有什么解决办法没有啊?
    lizhiruyoyo@gmail.com谢谢了~

  9. Harrydotter 说:

    另外一种担心,针对5223端口使用的软件有很多googletalk等等都使用5223端口。其他移动网络的Gphone似乎没动静。那么我就开始担心移动是不是对17.149.36.118下手了……

  10. 二进制的猫 说:

    我又做了某实验,可能不是移动做的手脚。。。可能是苹果。。。

  11. Raz 说:

    读你的文章非常受教,我真的很想用PUSH但是我现在的情况和IPHONE要求我只能破解加解锁(因为服务商不提供)

    所以我想知道,PUSHFIX2.0是一个一直都会有效的方式么?

    另外,如果我重刷了以后再装PUSHFIX,我购买的KEY还会有用么?

    谢谢!!

  12. Raz 说:

    我刚刚在看PUSHFIX 2.0的说明,上面说如果软件弹出“connect to itunes to use push notifications",那就是某些程序对push system造成了损坏,必须找出问题的根源,如果有必要,必须重刷,在没有这个消息的情况下才能安装PUSHFIX 2.0

    我有这个消息...囧。。。

  13. 风的朋友 说:

    QQ 会发生Push错的问题,其他软件应该也会吧,好像没有听说过?

  14. rez0041 说:

    那难道我是那个幸运的人,不可能啊?我现在的push唯一发现的有两个,一个是邮件,当然像你所说,用的是GMAIL,这个可能是原本就有的,还有一个是APP商店,有新的软件升级就会在右上角提醒我,我的PUSH是关闭状态的,游戏的PUSH我就没收,其实我觉得PUSH也就是让用户更及时的知道最新动态吧,其实就是类似RSS了。

    • 晓晓 说:

      邮件不是使用push技术,麻烦看下文章末尾的说明。App商店更不是,而是大概1小时自动联网检查一次的。

      至于push的用法,每个人都不一样咯

  15. seenxu 说:

    想问一下如果购买的是iphone 3gs无锁港版,是不是也会有无法正常使用push的可能?

  16. zix 说:

    你好。我是港版3gs.以前推送不知道为什么忽然失灵了。我就装了那个推送补丁。结果发现还是用不了
    后来我就恢复固件重新刷机了。奇怪的是后来我没装推送补丁了。但是qq的推送居然会和别人串。这是为什么?难道恢复固件删不掉那个补丁吗?

    • 晓晓 说:

      你使用了itunes的“从备份恢复”的功能吧。那个功能会备份恢复你之前的证书啥的……

      • zix 说:

        这……那该怎么办啊…我不恢复备份资料不是都丢了
        还原网络设置有用么?

      • zix 说:

        你说的确实很有道理……
        前天我看了你的文章,把/var/mobile/Library/Preferences/com.apple.apsd.plist 这个文件干脆删除了。然后我还原网路设置,这个文件又出来了
        是重新生成了还是我无意间自动从备份恢复我就不知道了…

        现在我不知道会不会和别人串。但是偶尔推送还是失灵
        我刚才在家实验。wcdma的环境下。我重新申请了个qq号发消息。第一条总是收不到,再发一条大部分时候都能收到推送。这是qq显示2.然后再发推送都正常。
        这时我打开qq,再关闭。重复以上过程。还是第一条收不到……这是什么原因……

  17. HarryDotter 说:

    今天更新了QQ3.3.1,突然想起来push这件事儿。再次在cmnet单独接入的环境下尝试了一下,很正常。看来移动年后重新开放5223的端口映射了。

  18. Tetsu 说:

    感谢站长那么细致的解释了整个push功能工作流程

    最近出来个push doctor,应该也是生成令牌的方式,不过,安装很麻烦,我今儿早上起折腾到下午搞不定。

    买了个Push fix 2.0也是搞了半天才发现,这push貌似一定会去走手机网络优先,貌似我的wifi很难连上push server

    所以我就收不到push信息,我当时想md,这6刀白花了啊

    后来把3G关了,Edge连上了。。。push功能也就正常使用了

    再操狗熊的联通,3G信号弱得跟粑粑一样

    • 晓晓 说:

      关于wifi下连接不上push的情况,你有看文章末尾的内容么?

      • Tetsu 说:

        我看了。。。我手动添加了8.8.8.8了

        但是,还是无法通过wifi push的,在pushfix里面提供的测试软件中,我可以看见这条

        STATUS: Connected over cell...而不是wifi

        下一条则是: Push is Blocked over WIFI?

        • 晓晓 说:

          看来是你的wifi问题嘛。。。不过如果搞不定的话,我也没有别的什么方案了呃。push doctor我没用过,不过看介绍,似乎已经实现了unique的证书,应该也没有任何问题了才对的⋯⋯

        • HarryDotter 说:

          现在好了么?7号那天腾讯自己的问题,不管联通移动还是wifi接入电信,很多人都没法push。现在已经好了。

  19. [...] 文章转载自:http://xiaolife.com/wordpress/an-introduce-to-iphone-push/ [...]

  20. 摇滚 说:

    从blogsearch搜到了这篇文章,真的很不错,希望能看到更多的新内容,已经订阅了rssfeed,祝博主好运:)

  21. rushwing 说:

    请问如何关闭路由器的DNS转发功能呢?我找了半天没找到(DNS forwording)
    我的无线路由是思科的WRH54G,刷的 DD-WRT的固件

    另外,DNS设置成8.8.8.8有任何意义吗?还是只是把DNS设置成一个invalid的DNS而已?

    • 晓晓 说:

      8.8.8.8是google的DNS。不是invalid。
      至于是否有意义,你可以自己试试。目前唯一已知对此有影响的网络因素就是这个了。

      DNS转发功能不是所有的路由器都有关闭选项的……

  22. [...] 的文章,我就不多分析了,流程如下图,使用TLS/SSL 保证连接的安全性。 iPhone的Push(推送通知)功能原理浅析 再论iPhone Push Notification:腰身柔软易推倒? 偷窥iPhone Push [...]

  23. [...] 感谢原文作者晓晓翻译,否则我不会这么认真翻译出来的。这里是他/她原文的链接。 至于Push的修复,可以看我之前的一篇文章,里面详述了很多种方法。 [...]

  24. Wang 说:

    "TLS链接一旦建立,在没有数据的情况下,只需要每隔15分钟进行一次保活的握手,因此几乎不占流量。而一旦因为意外原因导致链接中断,iPhone会不断重新尝试建立TLS链接,直到成功。

    "

    这里的15分钟是iphone默认强制的,还是可以配置的?

    "而一旦因为意外原因导致链接中断,iPhone会不断重新尝试建立TLS链接,直到成功"--->这句话的原文在哪里可以找到,我在APPLE网站上找不到这个描述,能否帮忙确认一下,谢谢

  25. cohen 说:

    晓晓,如果我的iphone刷官方固件后,先用att的卡激活了,然后用黑雨越狱的话。
    我激活后的证书会在iphone里么?还能实现push么?

  26. 小斌 说:

    学习了。我压根就没那个push文件。。哭泣。。。

  27. jackeyzhou 说:

    我这里通过pushfix_D修复了push

    查看了/var/mobile/Library/Preferences/com.apple.apsd.plist

    也的确是119字节,之前是没有这个文件

    照理说应该是已经成功取得了设备令牌

    但是一开始的时候可以PUSH成功,但是没几分钟就又不能用了

    QQ、Pushme.to都是一样的情况

    不管是在WIFI还是在CMNET下面都是一样

    我是日版的41周前,刷的自制系统,基带是04.28的

    请教这样的情况会是什么问题呢,谢谢

    • 晓晓 说:

      换个方式修复吧。pushfix_D导致的问题。

      • jackeyzhou 说:

        已经用Push Doctor修复了

        试了以下几个环境,都没有发现问题,仅供参考

        1、WIFI关闭DNS转发,使用202.96.209.5,202.96.209.133等公用DNS
        2、WIFI关闭DNS转发,使用8.8.8.8,4.4.4.4的DNS
        3、WIFI开启DNS转发
        4、EDGE网络(左上角显示E)
        5、GPRS网络(左上角显示O)

        然而在CMWAP的网络下,PUSH失败

        没有联通的3G卡,没有办法测试3G下面的PUSH

        还是感谢你的文章,受益匪浅

  28. Cohen 说:

    求助晓晓T.T。。我找同学借了张att的卡。。准备激活的。但是我重刷官方3。12固件,然后用这张卡激活。。itunes里面到是进入到iphone的设置界面了,可以管理同步iphone了。
    但问题是iphone主界面弹出,“正在激活 请稍候”。。。几乎就没什么进展了。。用att的卡在中国没信号。。难道一定要在att卡有信号的情况下才能激活么?那为什么itunes上的iphone的管理界面都出来了?

  29. Cohen 说:

    那还是用push doctor方案了。。ms反映不错。。

    谢谢晓晓回应

  30. franks 说:

    谢谢楼主.

    那如果我现在有一个有效的SSL证书,那有什么办法可以生成一个device certificate然后解决Push串号的问题?

发表评论