注意:這里使用undocumented api,使用該方法可能會(huì)影響您的product被AppStore拒絕上架!
也不記得最早是什么原因想去了解UIWebView的加載進(jìn)度和加載時(shí)間了,只是前段時(shí)間看文檔的時(shí)候發(fā)現(xiàn)WebKit里頭有相關(guān)的API,所以就nm看了下UIKit中的UIWebView的方法列表,發(fā)現(xiàn)他果然使用這些方法。雖然說(shuō)這些代理是屬于WebKit中的方法,WebKit屬于PrivateFramework,如果第三方應(yīng)用使用WebKit鐵定被拒絕的。但是UIWebView已經(jīng)使用了這些代理,如果用繼承的方式重寫(xiě)他的代理,那么還是有希望能夠通過(guò)的,當(dāng)然,我不保證,也不大關(guān)心。我只關(guān)心一種簡(jiǎn)單的查看網(wǎng)頁(yè)加載進(jìn)度和加載時(shí)間的方式。
我這里使用的方法是WebKit中關(guān)于加載資源的WebResourceLoadDelegate委托。 由于是API的使用,我就不詳細(xì)介紹每個(gè)API的東西了,有興趣的人自己看蘋(píng)果官網(wǎng)的WebResourceLoadDelegate文檔。我只簡(jiǎn)要介紹一下我使用的四個(gè),以及分別我在這四個(gè)地方做了什么事情。
-webView:identifierForInitialRequest:fromDataSource: 每個(gè)資源請(qǐng)求都會(huì)走一次這個(gè)回調(diào)函數(shù),所以在這個(gè)函數(shù)里可以統(tǒng)計(jì)這個(gè)頁(yè)面一共有多少資源請(qǐng)求。 -webView:resource:didFinishLoadingFromDataSource: -webView:resource:didFailLoadingWithError:fromDataSource: 這兩個(gè)方法是當(dāng)一個(gè)資源請(qǐng)求加載完成或者失敗的時(shí)候會(huì)被回調(diào)的,在這個(gè)函數(shù)里統(tǒng)計(jì)你已加載的資源。 用上面提到的回調(diào),你就可以實(shí)現(xiàn)類(lèi)似Opera瀏覽器的進(jìn)度條“10/86”這樣的進(jìn)度了。 那么,怎么計(jì)算請(qǐng)求時(shí)間呢? 我這里采用的是,當(dāng)開(kāi)始loadRequest的時(shí)候,開(kāi)始計(jì)算時(shí)間,當(dāng)已加載的資源總數(shù)(包括成功和失敗)等于網(wǎng)頁(yè)中的資源請(qǐng)求總數(shù)時(shí),就認(rèn)為已經(jīng)結(jié)束,計(jì)算一下時(shí)間使用,就是該頁(yè)面的加載耗時(shí)。 那么剩最后一個(gè)問(wèn)題,我如果在加載中間跳轉(zhuǎn)到其他頁(yè)面的話,這個(gè)時(shí)間該怎么算呢?這個(gè)就涉及到WebKit的另外的一些API了,這次就不討論了。
不過(guò)Demo中我有使用一個(gè)將就的計(jì)時(shí)方式,就是當(dāng)計(jì)時(shí)結(jié)束的時(shí)候,再收到一個(gè)資源請(qǐng)求的時(shí)候,我就認(rèn)為是開(kāi)啟新的計(jì)時(shí)。如果是在網(wǎng)頁(yè)加載途中請(qǐng)求新的頁(yè)面,他的表現(xiàn)也湊合,雖然不大準(zhǔn)確,因?yàn)闀?huì)漏算剛開(kāi)始的幾個(gè)資源請(qǐng)求,詳細(xì)可以看示例代碼。 |
|
來(lái)自: w1ids > 《待分類(lèi)》