当前位置: 首页 > 科技观察

iOS下如何一键调试Push

时间:2023-03-12 19:45:50 科技观察

在湾区工作的一个有趣的地方就是可以和来自完全不同工程文化背景的程序员碰撞交流。语言习惯、教育环境、思维方式、工程经验都存在。差别不小。来湾区半年多了。这段时间,我深有感触。这里的程序员非常注重做一件事情的效率。当遇到具有挑战性的项目时,前期的设计讨论和调整非常频繁,以期找到达到目标的最佳路径。在做项目的时候,每个程序员都有自己的工具箱和小脚本来应对各种场景。目的是花最少的时间做最多的工作,或者不加班:)闲话少说,这篇文章给大家分享一个我以前调试APN的方法。场景:测试发现无法再次接收到Push。测试同学会发现,iPhone过段时间就收不到Push了。这是以前公司经常发生的场景(好像湾区很多公司都没有测试过)。***调试的原因各不相同,但每次都难免要停下手头的工作走一遍流程:手机连接数据线,查看uuid,启动虚拟网卡,运行WireShark或者tcpdump抓包,排除服务器端问题,检查手机设置。从定位到问题起码十分钟过去了,十多分钟就白白浪费了。上面的场景发生了几次之后,我写了一个简单的小工具来应对。问题:如何提高效率希望能尽量简化网络抓包的过程。首先调试定位苹果服务器是不是没有发送Push,最后一键即可完成操作。跟着剧本一步步来。第一步是在连接到测试iPhone后自动获取uuid。我们可以在终端中使用systemprofiler命令获取mac连接的usb设备:system_profilerSPUSBDataTypesystem_profiler是一个用来获取当前系统软硬件配置信息的命令,可以通过mansystem_profiler查看详细使用方法。上面命令的执行结果如下:可以清楚的看到通过usb连接的iPhoneudid数据(序列号),我们可以使用sed提取目标信息:system_profilerSPUSBDataType|sed-n-E's/SerialNumber:(.+)/\1/1p'我只提取了第一个匹配项,因为我通常只有一个通过USB连接的iOS设备。第二步是创建一个虚拟网卡来抓包。我们只需要将上面提取的设备udid作为参数传入即可创建网卡命令:system_profilerSPUSBDataType|sed-n-E's/SerialNumber:(.+)/\1/1p'|xargsrvictl-s执行以上命令后,你应该看到以下输出:Startingdevice198a630825ee39496411dc3e323039f2947fa16f[SUCCEEDED]withinterfacervi0第三步是启动tcpdump来监控虚拟网卡。同样,我们只需要在执行完rvictl命令后,启动tcpdump即可。从第二步的输出我们知道虚拟网卡的id是rvi0,所以我们修改命令如下:system_profilerSPUSBDataType|sed-n-E's/SerialNumber:(.+)/\1/1p'|xargsrvictl-s|sudotcpdump-irvi0***sudotcpdump需要输入管理员密码,如果一切正常,那么你会看到如下输出:,use-vor-vvforfullprotocoldecodelisteningonrvi0,link-typePKTAP(AppleDLT_PKTAP),capturesize262144bytes第四步调整参数。虽然我们已经启动了抓包过程,但我们的目标是调试推送,所以我们只对来自APN的网络数据包感兴趣。接下来,我们需要将数据包添加到tcpdump过滤器中,设置一些简单的参数。这里需要稍微了解一下iOSAPN。根据我对APN数据通道情况的分析:在iOS9之前,苹果有专门的长链接通道来推送应用的推送,端口号固定为5223。从iOS9开始,Apple开始采用HTTP2.0,并创建了一个全新的综合HTTP2.0长链接通道。这个综合通道应该不只是推送Push,所以抓包的时候会看到包数比之前的5223通道多了。现状是:Apple在新版系统中同时使用两个通道,所以APN有时使用5223,有时使用HTTP2.0,策略不详。经过简单分析,目标很明确,我们只需要限制端口即可。HTTP2.0无疑会使用HTTPS,端口为443,所以我们最新的命令调整如下:第五步,快速入门我们不可能每次都敲上面那一长串的命令,为了方便操作,我们可以给命令添加一个别名,编辑.bash_profile:vim~/.bash_profile添加命令别名:aliasapn="system_profilerSPUSBDataType|sed-n-E's/SerialNumber:(.+)/\1/1p'|xargsrvictl-s|sudotcpdump-irvi0srcport5223orhttps"enableconfigurationsource~/.bash_profile第六步,检查并接受结果下次同学将测试调试Push收不到的问题,插上USB后,我只需要:按F2启动Terminal(我Mac系统BetterTouchTool设置的快捷键)输入apn回车Bingo,然后我可以一边喝咖啡一边静静地看着包裹。综上所述,上面的脚本只是一些小工具的组合,可以省时省力。开发过程中类似的例子还有很多。总有一些工具或者方法可以提高我们的开发效率。多想就会有收获。大家也可以多思考平时工作中如何使用工具来提高生产力。由于FB不用加班,突然空闲时间多了,所以今年打算多更新几篇文章。文章的重点将放在思想和经验的分享上,主要是易于消化的小故事。这篇文章的目的是分享使用工具来提高效率和节省时间的想法。