<progress id="zvesa"></progress>

  1. <dd id="zvesa"></dd>

        <button id="zvesa"><acronym id="zvesa"></acronym></button>

        <dd id="zvesa"></dd>

        WebKit in iOS 8 | 不掏蜂窩的熊

           信息來源:時間:2020-04-08 23:26:02
          夏天到了,WWDC和AKB48總選舉也到了。話說當昨天看到癱癱拿到第一的時候,真是發自內心的欣喜。但去年寫了AKB48總選舉,今年談談正事。保留著對瀏覽器的余熱,讓我們說說iOS 8 的WebKit吧。
        WWDC 2014前幾天,就有人發現了蘋果向WebKit開源項目提交了一些很令人興奮的代碼,暗示了OS X和iOS,特別是iOS上的WebKit架構有所變化。果不其然,WWDC上公布了iOS的新框架WebKit.framework,正式推出了新的網頁瀏覽控件WKWebView。
        曾經的UIWebView
        WebKit在給人的印象,是一個瀏覽引擎,貌似只是和網頁有關,其實在OS X和iOS上,多于一行的文字渲染,都和WebKit有關。瀏覽網頁,在iOS上,使用的是UIKit.framework的UIWebView;在OS X上,使用的是WebKit.framework的WebView。
        更多細節不討論,但讓人最不解的就是,到底受限于什么條件,蘋果在推出iOS的時候,封裝了一個貌似很簡潔,其實功能受限、效率低下的UIWebView。我揣摩了一下蘋果的小心眼,當時得出的結論是:
        一個高度封裝、接口簡單的API,很符合蘋果的風(niao)格(xing):「Stay foolish!」。千萬不要以為這是句激勵的話,其實是說,你們這些開發者用就行了,關心那么多的細節干什么。就像對待iPhone用戶一樣,系統升級我都幫你們做好了,你們何必關心刷機這種無意義的事情!
        保持Safari的領先優勢,這種優勢體現在私有API和JIT上。Safari不使用UIWebView,使用的是UIWebBrowserView和UIScrollView(實際上UIWebView就是這兩者的封裝),但也屬于UIKit.framework,在進程模型、頁面渲染方面,并沒有和UIWebView有本質的區別。第三方瀏覽器,開啟JIT是無望了,但大量功能的缺失,都是通過使用私有API來彌補,實際上并無太大區別。
        iOS 8 的WKWebView
        Anders Carlsson,Safari以及WebKit工程師,也是這一次「Introducing the Modern WebKit API」的主講人,一上來就說,總有開發者,特別是iOS平臺上的,向他們抱怨說,開發者需要一個功能更加強大的網頁瀏覽控件,然后,他們就推出了「The Modern WebKit API」。(「Modern」這個詞,簡直用得出神入化,驚天地泣鬼神,很好體現了蘋果的壕氣。)
        具體有什么變化呢:
        OS X和iOS使用統一的framework和WKWebView,意味著可移植性提高了,也意味著iOS上開放了更多的API。
        更好的性能,如對網頁滑動的響應。
        更好的JavaScript引擎。4倍?反正很少人在意蘋果廣告語中提到的數字。
        內置前進后退手勢。
        更有效的JS和App的交互。
        最重頭的,新的多進程模型。
        API
        蘋果終于想通了一個事情:OS X上的WebView,功能很強大,可惜沒人用,第三方瀏覽器用的都是自己的引擎,因此無法上架AppStore,可是誰在意呢;iOS上的UIWebView,功能少得不忍直視,用自家的引擎嘛,又上不了AppStore。而在iOS平臺,能否上架AppStore,可是事關生死的事情,這點連Chrome都不得不低頭。
        從公開的API來看,之前開發者面對的是UIWebView只是一個頭文件,現在面對的是一整個framework。大致瀏覽了下功能,相比于iOS的UIWebView,功能增強了一個Level;相比于OS X的WebView,功能缺失了一個Level。扯平了。
        今天我用之前的Demo,將UIWebView替換成WKWebView,基本可以無縫替換。那么相比于UIWebView,WKWebView還開放了什么呢?
        基本屬性:網頁加載進度、網頁標題,這些網頁的最最基本的屬性,終于齊了。
        前進后退手勢:在UIWebView實現過這個功能的我,深知此功能之復雜,當看到這個的時候,整個人都鳥肌了。
        WKPreferences:對應WebView的WebViewPreference,相比UIWebView,增加了禁用JavaScript功能,但沒有無圖模式,差評。
        WKUserContentController:JS通訊相關,App注入JS時,可以指定時機(加載開始或加載結束)和范圍(MainFrame或所有Frame);另外內置JS Bridge。
        WKProcessPool:和多進程模型相關,目前功能未知。
        WKBackForwardList:前進后退列表,良心好評。
        WKNavigationDelegate:類似于WebView里的WebFrameLoadDelegate,功能稍稍閹割了下,但基本能用。
        WKUIDelegate:UI相關的回調。如新窗口打開、頁面alert彈框等的處理回調。
        更多細節,可以查看WebKit Objective-C Framework Reference。
        總的來說,蘋果鼓起勇氣,第一次開放了如此多的接口,但卻仍然不夠徹底。這些功能,在UIWebView時代,都可以用私有API解決;而使用了WKWebView之后,在某些方面,依然顯得不夠用的樣子——比方說HTTP和HTTPS驗證,仍然沒有公開接口可以處理;另外WebResourceLoadDelegate的缺失,也是一大痛點。
        2014.7.8 iOS8 beta3 更新Webkit.framework,如下:
        同步調用的JS接口。和-[UIWebView stringByEvaluatingJavaScriptFromString:]相比,JS結果是異步而非同步返回的,返回結果為id而非NSString。
        WKNavigationDelegate增加了驗證回調接口,可以解決HTTP和HTTPS驗證問題
        性能
        待續
        多進程模型
        待續
        參考
        WebKit Objective-C Framework Reference
        Introducing the Modern WebKit API
        GitHub/WebKit
        原創文章,版權聲明:自由轉載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
        轉載請注明出處:http://www.hotobear.com/
        | Tagged: iOS, iOS 8, WebKit

        蜘蛛池