V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
nightspirit
V2EX  ›  iDev

关于ios推送问题。

  •  
  •   nightspirit · 2013-07-04 10:08:09 +08:00 · 4454 次点击
    这是一个创建于 4165 天前的主题,其中的信息可能已经有所发展或是发生改变。
    apns这个ios的推送技术,在服务器端会有一定的失败率吗?同事说这个成功率不能达到100%,求高手给个方案,怎么样能到100%?
    10 条回复    1970-01-01 08:00:00 +08:00
    llbgurs
        1
    llbgurs  
       2013-07-04 12:04:26 +08:00   ❤️ 1
    怎么可能到100%,网络难免卡一下,挂一下,只能自己处理,如果出错再重发了
    nightspirit
        2
    nightspirit  
    OP
       2013-07-04 19:00:44 +08:00
    那最多能到多少额?貌似在国内的服务器 因为被墙的原因,只能到30%-40%的成功率,成功率太低了,如果服务器在国外还能到80%左右,有没有什么办法能提高呢?
    so898
        3
    so898  
       2013-07-04 19:44:06 +08:00   ❤️ 1
    @nightspirit
    我去!哪个混蛋跟你说只有30%~40%的……

    APNS发送的时候不要只发就完了啊!一定要把苹果给你返回的值留下的!不成功就放回Queue里面继续发!
    你说要是国外的成功率都只有80%,那尼玛微信不早就被喷死了……
    哪来的这么信口开河的同事……
    fsw90628
        4
    fsw90628  
       2013-07-04 23:58:35 +08:00
    yuanalexwu
        5
    yuanalexwu  
       2013-07-05 11:50:06 +08:00   ❤️ 1
    发推送的时候给每个token加上一个identifier,方便发送失败的时候重新发送
    apnsPackFormat = "!BIIH" + str(tokenLength) + "sH" + str(payloadLength) + "s"
    message = struct.pack(apnsPackFormat,
    command,
    identifier,
    expiry,
    tokenLength,
    deviceToken,
    payloadLength,
    payload)
    ssl_conn.sendall(message)
    socket 建立后不停往服务器发(发送大量推送时候设置休眠,比如每发500个sleep(4)不然推送服务器可能会死机很长时间)
    # ssl socket 如果发送的过程中出现任何错误都可以去读取反馈信息,获得错误代码并做相应处理
    result = -1
    self.ssl_conn.settimeout(5)
    recive = self.ssl_conn.read(BUFF_SIZE)
    if recive:
    _, status, identifier = struct.unpack('!BBI', recive)
    if status == 8: # 8: Invalid token
    result = identifier
    return result

    处理其他错误参照@fsw90628贴上来的开发文档
    yuanalexwu
        6
    yuanalexwu  
       2013-07-05 12:03:06 +08:00
    你能保证的是根据发送的数量级,将信息发送到APNS服务器。但Apple也不guarantee 100%将信息发送到具体设备上 :3
    railgun
        7
    railgun  
       2013-07-05 15:23:03 +08:00   ❤️ 1
    APNS本身是不可靠的服务,苹果自己在文档里说了,但是也不是说它的成功率不高,只是说你的业务不应该依赖于APNS服务,比如说不能 没有收到推送,业务流程就跑不下去了。
    我用的时候基本上推送都能及时过来,除非用2g网络特别差的情况会有延迟。
    另外用楼上说到的feedback功能也是个能提高送达率的好方法。
    est
        8
    est  
       2013-07-05 15:50:16 +08:00
    你同事找了一个为自己烂代码逃脱的借口
    xiaogui
        9
    xiaogui  
       2013-07-05 15:52:06 +08:00
    成功率的确不能达到100%,因为有用户会已经把你的应用删掉了。
    nightspirit
        10
    nightspirit  
    OP
       2013-07-08 15:21:30 +08:00
    @xiaogui
    @railgun
    @yuanalexwu
    @fsw90628
    @so898
    感谢各位给的提示。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1069 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 20:11 · PVG 04:11 · LAX 12:11 · JFK 15:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.