1. 程式人生 > >WKWebView使用及注意點(預防踩坑)------強烈推薦閱讀!!!

WKWebView使用及注意點(預防踩坑)------強烈推薦閱讀!!!

iOS8之後,蘋果推出了WebKit這個框架,用來替換原有的UIWebView,新的控制元件優點多多,不一一敘述。由於一直在適配iOS7,就沒有去替換,現在仍掉了iOS7,以為很簡單的就替換過來了,然而在替換的過程中,卻遇到了很多坑。還有一點就是原來寫過一篇文章 Objective-C與JavaScript互動的那些事以為年代久遠的UIWebView已經作古,可這篇文章現在依然有一定的閱讀量。所以在決定在續一篇此文,以引導大家轉向WKWebView,並指出自己踩過的坑,讓大家少走彎路。

此篇文章的邏輯圖

1192353-3b1b2a629853d8b2.png

WKWebView簡單介紹

使用及注意點

WKWebView只能用程式碼建立,而且自身就支援了右滑返回手勢allowsBackForwardNavigationGestures和載入進度estimatedProgress等一些UIWebView不具備卻非常好用的屬性。在建立的時候,指定初始化方法中要求傳入一個WKWebViewConfiguration物件,一般我們使用預設配置就好,但是有些地方是要根據自己的情況去做更改。比如,配置中的allowsInlineMediaPlayback這個屬性,預設為NO,如果不做更改,網頁中內嵌的視訊就無法正常播放。

更改User-Agent

有時我們需要在User-Agent新增一些額外的資訊,這時就要更改預設的User-Agent在使用UIWebView的時候,可用如下程式碼(在使用UIWebView之前執行)全域性更改User-Agent:

1 2 3 4 5 6 7 8 9 10 11 // 獲取預設 User-AgentUIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero]; NSString *oldAgent = [webView stringByEvaluatingJavaScriptFromString:@
"navigator.userAgent"]; // 給User-Agent新增額外的資訊 NSString *newAgent = [NSString stringWithFormat:@"%@;%@", oldAgent, @"extra_user_agent"]; // 設定global User-Agent NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:newAgent, @"UserAgent", nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];

以上程式碼是全域性更改User-Agent,也就是說,App內所有的Web請求的User-Agent都被修改。替換為WKWebView後更改全域性User-Agent可以繼續使用上面的一段程式碼,或者改為用WKWebView獲取預設的User-Agent,程式碼如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 self.wkWebView = [[WKWebView alloc] initWithFrame:CGRectZero]; // 獲取預設 User-Agent[self.wkWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) {       NSString *oldAgent = result;     // 給User-Agent新增額外的資訊     NSString *newAgent = [NSString stringWithFormat:@"%@;%@", oldAgent, @"extra_user_agent"];   // 設定global User-Agent     NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newAgent, @"UserAgent", nil];    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; }];

對比發現,這兩種方法並沒有本質的區別,一點小區別在於一個是用UIWebView獲取的預設User-Agent,一個是用WKWebView獲取的預設User-Agent。上面方法的缺點也是很明顯的,就是App內所有Web請求的User-Agent全部被修改。

在iOS9,WKWebView提供了一個非常便捷的屬性去更改User-Agent,就是customUserAgent屬性。這樣使用起來不僅方便,也不會全域性更改User-Agent,可惜的是iOS9才有,如果適配iOS8,還是要使用上面的方法。

WKWebView的相關的代理方法

  • WKWebView的相關的代理方法分別在WKNavigationDelegate和WKUIDelegate以及WKScriptMessageHandler這個與JavaScript互動相關的代理方法。

  • WKNavigationDelegate: 此代理方法中除了原有的UIWebView的四個代理方法,還增加了其他的一些方法,具體可參考我下面給出的Demo。

  • WKUIDelegate: 此代理方法在使用中最好實現,否則遇到網頁alert的時候,如果此代理方法沒有實現,則不會出現彈框提示。

WKScriptMessageHandler: 此代理方法就是和JavaScript互動相關,具體介紹參考下面的專門講解。

WKWebView使用過程中的坑

WKWebView下面新增自定義View

因為我們有個需求是在網頁下面在新增一個View,用來展示此連結內容的相關評論。在使用UIWebView的時候,做法非常簡單粗暴,在UIWebView的ScrollView後面新增一個自定義View,然後根據View的高度,在改變一下scrollView的contentSize屬性。以為WKWebView也可以這樣簡單粗暴的去搞一下,結果卻並不是這樣。

首先改變WKWebView的scrollView的contentSize屬性,系統會在下一次幀率重新整理的時候,再給你改變回原有的,這樣這條路就行不通了。我馬上想到了另一個辦法,改變scrollView的contentInset這個系統倒不會在變化回原來的,自以為完事大吉。後來過了兩天,發現有些頁面的部分割槽域的點選事件無法響應,百思不得其解,最後想到可能是設定的contentInset對其有了影響,事實上正是如此。查來查去,最後找到了一個解決辦法是,就是當頁面載入完成時,在網頁下面拼一個空白的div,高度就是你新增的View的高度,讓網頁多出一個空白區域,自定義的View就新增在這個空白的區域上面。這樣就完美解決了此問題。具體可參考Demo所寫,核心程式碼如下:

1 2

相關推薦

WKWebView使用注意(預防)------強烈推薦閱讀

iOS8之後,蘋果推出了WebKit這個框架,用來替換原有的UIWebView,新的控制元件優點多多,不一一敘述。由於一直在適配iOS7,就沒有去替換,現在仍掉了iOS7,以為很簡單的就替換過來了,然而在替換的過程中,卻遇到了很多坑。還有一點就是原來寫過一篇文章 Ob

WKWebView 使用注意(keng)

作者你好,我最近遇到相同的問題,需要在網頁尾部追加一個附加檢視。 看了你追加尾圖實現的效果,發現可以的。但是在下載Demo後,你可以測試下,如果github上,我選擇註冊時,是不是你追加的尾圖會遮蓋原網頁內容。我也不確定這個問題是不是因為JS造成的,望答覆。

WKWebView使用注意(keng)

iOS8之後,蘋果推出了WebKit這個框架,用來替換原有的UIWebView,新的控制元件優點多多,不一一敘述。由於一直在適配iOS7,就沒有去替換,現在仍掉了iOS7,以為很簡單的就替換過來了,然而在替換的過程中,卻遇到了很多坑。還有一點就是原來寫過一篇文章 Objec

將專案打成war包並用tomcat部署的方法,步驟注意

部署的遇到第一個問題,就是tomcat和jdk的環境問題: 首先 理解為啥要關注這二者的環境呢?他們還是有關係的–tomcat 作為比較流行的java Web伺服器也是用java來實現的一個比較大的軟體 它也必須在虛擬機器JVM上執行 。 而java很多運用都是用在web開發上 所以他們就聯絡在一起

vue Axios 使用注意

1、使用npm安裝 npm install axios 使用 cdn: <script src="https://unpkg.com/axios/dist/axios.min.js"></script>  2、引用 import Axios fr

HTTPS配置優化注意

Nginx官網反向代理時配置SSL證書,需要enable ngx_http_ssl_module模組,且需要支援的openssl開發版,預設配置引數比較少,但是可以根據實際情況對效能及安全性做成優化,具體如下! 一、SSL引數具體優化(這裡只填主要的) 1. ssl_protocols TLSv

Java中包裝類作用注意

轉載地址: https://blog.csdn.net/liu_005/article/details/79585956 Java中對每種基本型別都有一個對應的包裝類,這裡主要講解包裝類的作用和包裝類使用時的一些注意點。 包裝類的作用 作用主要有以下兩方面:  - 編

django 三種快取模式的使用注意

Django 快取模式的使用(主要針對RestFul設計模式的專案) 有三種模式: 全站使用快取模式(整個專案每個介面都會使用快取,缺點:所以介面都無法實時性獲取資料) 單獨檢視快取模式(單個介面使用快取) 區域性檢視快取模式 第一種:實現方式:         必須在 settings中設定 快取中介軟

Unity進階篇:主執行緒和子執行緒概念注意

先理解一下什麼是執行緒: 執行緒是作業系統級別的概念,現代作業系統都實現並且支援執行緒,執行緒的排程對應用開發者是透明的,開發者無法預期某執行緒在何時被排程執行。基於此,一般那種隨機出現的BUG,多與

《NETTY官方文件》4.1的新特性注意

原文連結  譯者:裘卡 此文件涵蓋了netty4.0到4.1值得關注的變更點及新特性。 儘管我們盡力做到對4.0的向後相容,4.1仍包含了一些無法完全向後相容4.0的特性。請確保升級之後對應用進行重新編譯。 在重新編譯應用以後,你會看到一些deprecation的警告。請一定按照提示修改為相應

《NETTY官方文件》4.0的新特性注意

原文連結 譯者:裘卡 此文件涵蓋了此次Netty大版本中值得關注的變更點及新特性,以幫助你將自己的應用順利移植到新版本。 專案結構變更 基於netty已經不再是JBoss.org的一部分,我們將包名從 org.jboss.netty 變更為 io.netty。 二進位制jar包也被分割成了

MVC 檢視助手書寫規範注意

  @Html.TextBoxFor() 講解(其他類似的 @Html.LabelFor 等)同理   @Html.TextBoxFor(model => model.SearchParams.Name, new { @class = "col-md-12 sea

scala基本語法注意

首先我們要知道,scala的語法中"(1).to(10)"是可以寫成"1 to 10"的。在通常情況寫,這種表示式的寫法是從左到右結合的,除了用":"結尾的方法外。用":"結尾的方法屬於從右到左結合的。例如:List的"::"方法,在List中"::"的定義如下:

Java 讀取 properties 配置檔案的幾種方式注意

1、引言 java開發中,經常需要讀取配置檔案,有時即使我們方法是對的,但是就是讀取不到需要的內容,會報下面的錯: java.io.FileNotFoundException: sr/configure/config.properties (No such file or dir

NodeJS模組和ES6模組系統語法注意

社群模組規範: 1.CommonJS規範 規範實現者: NodeJS 服務端 Browserify 瀏覽器 2.AMD規範 全稱 非同步模組定義 規範實現者: RequireJS 瀏覽器 3.CMD規範 通用模組定義 規範實現者: seaJS 服務端和瀏覽器通用 官方模組規範 1.ESM規範 就是E

公寓專案基本功能實現的編寫流程注意

eclipse:登入/登出=>admin後臺管理介面jsp=>list=>分頁=>詳情=>修改=>新增=>刪除=>搜尋=>設定使用者許可權 資料庫:建立資料庫=>按照專案需求建立9個表,設定欄位和主鍵、外來鍵 建立util工具包:U

寒假作業安排注意

C語言程式設計I—寒假作業安排 (來自於C語言彭琛老師) 各位親愛的同學們: 寒假愉快!為了寒假的大好時光不被浪費,我為大家留下了一些需要思考並認真完成而且沒有標準正確答案的作業內容,但是作業格式還是有要求哦! 1.介紹自己,建部落格 建立個人部落格,在 http://www.cnblogs.com 上註冊開

group_concat的用法 注意

group_concat的預設分隔符是“,”,若要改為其他分隔符,則使用SEPARATOR來指定, 例如: mysql> SELECT student_id, GROUP_CONCAT(courses_id SEPARATOR '@#$') AS courses FR

vue專案使用vw佈局注意

注意事項 1. 在ios端img標籤的圖片不顯示,安卓可正常顯示 解決方案: 不可以為img設定任何css樣式,只可以在為img的父盒子設定樣式,img的大小靠百分比設定。 程式碼示例:

thinkphp模板變數輸出的幾種情況注意

其實在thinkphp中模板變數輸出是有幾種不同的情況的,剛開始接觸thinkphp的時候不是很瞭解,現在來稍微總結一下。 第一種將某個標籤的name屬性作為變數,這個時候在模板中這個變數的寫法是像