1. 程式人生 > 實用技巧 >Xcode多程序除錯:WKWebView

Xcode多程序除錯:WKWebView

由於WKWebView使用的是多執行緒架構,渲染模組和網路模組都各自在一個單獨的程序裡面,因此,如果需要設定渲染模組或者網路模組裡面的斷點,需要做一些特殊處理。

舉個例子,假設在Xcode裡面設定了渲染模組裡面一個函式的符號斷點:

如果像平時一樣,執行工程期待斷點生效是不可能的。這是因為預設情況下,這個斷點是在主程序,例子裡面是TestWKServer程序,而主程序是沒有上面的RenderElement函式的,因此不會觸發斷點。

正確的操作是要將WKWebView的渲染程序和網路程序Attach到Xcode裡面。方法就是選擇Xcode的Debug選單,然後選擇Attach to Process by PID or Name...或者Attach to Process。

選擇Attach to Process by PID or Name...需要填入程序的PID或者程序的名字,對於WKWebView的渲染程序和網路程序來說,它們的名字分別是com.apple.WebKit.WebContent、com.apple.WebKit.Networking。

選擇Attach to Process會展開所有的程序列表,選擇需要Attach的程序就行。

那麼,這兩種有什麼差別呢?

由於Attach to Process需要被Attach的程序已經建立才行,但是我們有時候可能等程序被建立完畢才去Attach就會錯過斷點執行的時機,這時候Attach to Process by PID or Name...就會顯得很有用了。Attach to Process by PID or Name...在被Attach的程序還未建立時,就告訴Xcode:"我需要Attach這些程序,請在它們建立之後就立即Attach進來",這樣就不會錯過任何斷點時機了。

但是需要注意的是,由於你在除錯的時候,可能開著諸如Safari一類的程式,由於Safari使用WKWebView,也會有渲染程序和網路程序,當你通過Attach to Process by PID or Name...設定了需要Attach的程序名字,然後啟動你的工程,會發現Xcode確實Attach了渲染程序和網路程序,但是Attach的確是Safari的而不是你自己的(因為Safari的渲染程序和網路程序先於你的建立),這時候斷點也不會生效。

有兩種辦法解決上述問題:

1)退出Safari之類使用WKWebView的程式,確保除了自己的工程之外,不會有其他程式已經建立了WKWebView的渲染程序和網路程序。確認的方式是使用Attach to Process提供的程序列表,確認裡面沒有com.apple.WebKit.WebContent com.apple.WebKit.Networking程序;

2)使用Attach to Process,但是需要確保我們Attach的時候,程式還未執行我們想要斷點的函式。一個比較有用的方法是先在WKNavigationDelegate的-webView:decidePolicyForNavigationAction:preferences:decisionHandler:實現函式裡面設定一個斷點,當斷到這個函式時,渲染程序和網路程序已經建立,並且這兩個程序也還剛剛開始執行,一般來說,我們也來得及設定後續我們需要設定的斷點。這個時候就可以使用Attach to Process去Attach我們自己的渲染程序和網路程序,一個好用的規律是我們自己的渲染程序和網路程序是主程序的子程序,它們的PID非常相似(或者說相近),如果實在不確定哪個程序是我們自己的,就將列表裡面所有的com.apple.WebKit.WebContent、com.apple.WebKit.Networking程序Attach進來,只是這樣比較繁瑣。