iOS 下如何一鍵調試 Push

來灣區工做的一項有趣之處,是能夠和來自徹底不一樣工程文化背景的程序員們碰撞交流,語言習慣,教育環境,思惟模式,工程經驗都存在不小的差別。來灣區半年有餘,這段時間下來有一點我感覺頗深,這邊的程序員很是強調作一件事的效率。在遇到一個有挑戰性的項目時,前期的設計討論調整很是頻繁以求最優路徑抵達目標,日常作項目時,各個程序員都有本身的工具箱和小腳原本應付各種場景。目的是都花最少許的時間幹最多的活,又或者是爲了避免加班 :)程序員

閒話不提,這篇文章和你們分享一個我以前調試 APN 的方式。vim

場景:測試又又又發現收不到 Push 了

測試同窗每隔一段時間就會發現 iPhone 又收不到 Push 了,這是常常發生在上家公司的場景(灣區好像不少公司都沒測試),最後調試下來緣由各不相同,但每次都免不了停下手頭的工做走一遍流程:數據線連手機,查看 uuid,啓動虛擬網卡,運行 WireShark 或者 tcpdump 抓包,排除 server 端問題,查看手機設置。等定位好問題至少已過去十多分鐘,白白浪費的十多分鐘。上述場景發生過幾回以後,我寫了個簡單的小工具來應對。bash

問題:如何提高效率

我但願能將網絡抓包這一流程儘量簡化,首先調試定位是不是 Apple 服務器沒有發送 Push,最好能一鍵完成操做。用腳本一步步來實現。服務器

第一步,連上測試 iPhone 以後,自動獲取 uuid網絡

咱們能夠在 terminal 用 system profiler 命令來獲取鏈接 mac 的 usb 設備:socket

system_profiler SPUSBDataType
複製代碼

system_profiler 是一個用來獲取當前系統軟硬件配置信息的命令,能夠經過 man system_profiler 查看詳細使用方法。上述命令執行結果以下:tcp

能夠清楚看到經過 usb 鏈接的 iPhone udid 數據(Serial Number),咱們用 sed 提取出目標信息便可:工具

system_profiler SPUSBDataType | sed -n -E 's/Serial Number: (.+)/\1/1p'
複製代碼

我只提取了第一個匹配結果,由於我通常只會經過 usb 連一個 iOS 設備。測試

第二步,建立虛擬網卡以便抓包ui

咱們只須要將上面提取的設備 udid 做爲參數傳人建立網卡命令:

system_profiler SPUSBDataType | sed -n -E 's/Serial Number: (.+)/\1/1p' | xargs rvictl -s
複製代碼

執行完上述命令,應該能看到以下輸出:

Starting device 198a630825ee39496411dc3e323039f2947fa16f [SUCCEEDED] with interface rvi0
複製代碼

第三步,啓動 tcpdump 監控虛擬網卡

同理,咱們只須要等 rvictl 命令執行完畢以後,啓動 tcpdump 便可。從第二步的輸出裏知道虛擬網卡的 id 爲 rvi0,因此咱們將命令修改以下:

system_profiler SPUSBDataType | sed -n -E 's/Serial Number: (.+)/\1/1p' | xargs rvictl -s | sudo tcpdump -i rvi0
複製代碼

首次 sudo tcpdump 的時候會須要輸入管理員密碼,若是一切正常,那麼會看到以下輸出:

tcpdump: WARNING: rvi0: That device doesn't support promiscuous mode (BIOCPROMISC: Operation not supported on socket) tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on rvi0, link-type PKTAP (Apple DLT_PKTAP), capture size 262144 bytes 複製代碼

第四步,調整參數

雖然咱們已經啓動了抓包流程,但咱們的目標是調試 push,因此咱們只對 APN 過來的網絡包感興趣,接下來要對 tcpdump 增長包的 filter,設置一些簡單參數。

這裏須要一點對 iOS APN 相關的瞭解,據我分析 APN 的數據通道狀況是:在 iOS 9 以前,Apple 有一個專門的長連接通道來推送應用的 push,並且端口號固定在 5223。從 iOS 9 開始,Apple 開始採用 HTTP 2.0,新建了一個綜合用處的 HTTP 2.0 長連接通道,這個綜合通道應該不止會推送 Push,因此抓包的時候會看到包的數量多於以前的 5223 通道。現狀是:Apple 在新版系統裏同時用了兩個通道,因此 APN 有時候走 5223,有時候又是走 HTTP 2.0,策略不明。

簡單分析以後,目標明確,咱們只須要對端口作限制便可。HTTP 2.0 毫無疑問會用 HTTPS,端口是走 443,因此咱們最後的命令調整以下:

system_profiler SPUSBDataType | sed -n -E 's/Serial Number: (.+)/\1/1p' | xargs rvictl -s | sudo tcpdump -i rvi0 src port 5223 or https
複製代碼

第五步,快捷啓動

咱們不可能每次都敲一邊上面這一長串命令,爲了操做方便,咱們能夠給命令加個 alias,編輯 .bash_profile:

vim ~/.bash_profile
複製代碼

加入命令別名:

alias apn="system_profiler SPUSBDataType | sed -n -E 's/Serial Number: (.+)/\1/1p' | xargs rvictl -s | sudo tcpdump -i rvi0 src port 5223 or https"
複製代碼

啓用配置

source ~/.bash_profile
複製代碼

第六步,驗收成果

下次測試同窗再來調試 Push 收不到的問題,插上 USB 以後,我只須要:

1 按 F2 啓動 Terminal(我 Mac 系統經過 BetterTouchTool 設置的快捷鍵)

2 輸入 apn 回車

Bingo,接下來就能夠喝口咖啡,安安靜靜看包了。

總結

上面的腳本只是將一些小工具結合利用,就能起到節約時間精力的療效,開發過程當中相似的例子有不少,總有一些工具或途徑能提高咱們的開發效率,多思考就有收穫,你們在日常工做時也能夠多琢磨下怎麼利用工具提升生產力。

因爲 FB 確實不用加班,個人空餘時間忽然多了起來,因此計劃着今年多更新點文章。文章的重點會放在思路心得分享上,以短篇好消化爲主。相似這篇文章目的在於分享用工具提高效率節約時間的思想。

相關文章
相關標籤/搜索