应用卸载时PacketTunnel扩展发送最后网络请求失败的方案问询
卸载时PacketTunnel Provider发送最后一次请求失败的底层尝试方案
- 直接上BSD套接字:别用NSURLSession这类高层框架,手动用C级的
socket()、connect()、send()构建TCP/UDP包发送。高层框架可能在卸载流程里已经被系统限制资源,底层套接字说不定还能苟住几秒。 - 绕个弯用本地通知触发:在stopTunnel里先调用
notify_post发个自定义本地通知,然后在通知回调里做网络请求。直接在stopTunnel里发可能被系统拦截,通过通知触发说不定能避开这个限制。 - 写本地文件靠关联进程转发:如果有和主应用绑定的其他后台进程,把要上报的数据写到共享沙盒的文件里,让关联进程读取后帮忙发送。要是没关联进程这条就pass。
- 换成UDP协议试试:TCP要三次握手,卸载时系统可能已经切断了连接通道,UDP是无连接的,直接扔数据包,哪怕大概率丢包,但万一能送达呢?适合这种一次性上报的场景。
- 手动解析DNS后直连IP:用
getaddrinfo自己解析目标域名的IP,然后直接往这个IP发请求,跳过系统DNS服务可能的限制,减少一层依赖。 - 用CFNetwork底层API:比如
CFHTTPMessageCreateRequest、CFReadStreamCreateForHTTPRequest这类Core Foundation级别的接口,比NSURLSession更底层,说不定在stopTunnel阶段还能正常工作。
内容的提问来源于stack exchange,提问作者fuzi
相关产品推荐
相关产品推荐

