iOS Web 加載相關(guān)
- 主要使用兩種技術(shù): WebView & WebKit
- JS 交互: 通過(guò)監(jiān)聽 JS Request 并使用 evaluateJS 函數(shù)進(jìn)行交互動(dòng)作
- 每個(gè) App 如果使用 webView 加載了網(wǎng)頁(yè), 就會(huì)根據(jù) App 的 bundle 生成對(duì)應(yīng)的 storage ,并且實(shí)際上, 操作 cookie 以及 storage 的對(duì)象是以 app 為單位的單例對(duì)象, 甚至是全局的單例對(duì)象, 不過(guò)在操作實(shí)際的緩存的時(shí)候回自動(dòng)根據(jù)當(dāng)前 app 進(jìn)行選擇
WebView 控件整理
-
概述:
原生的 webview 的整個(gè)框架提供的 API 特別少, 除了主要的 數(shù)據(jù)源, 加載回調(diào) 等必須函數(shù)之外, 就只提供了四個(gè)最基本的功能, 以及十個(gè)以內(nèi)的網(wǎng)頁(yè)屬性設(shè)置.- WebView 提供的整體的所有功能:
1.加載流程 ( 數(shù)據(jù)源, 監(jiān)聽函數(shù) - 幾個(gè)監(jiān)聽階段 ) - 監(jiān)聽階段
* 數(shù)據(jù)源: 1.Request 2.HTMLString 3.HTML.Data
* 準(zhǔn)備 - 加載
* 開始加載
* 加載成功
* 加載失敗2.附加行為
* 基本功能: 1.刷新 2.停止加載 3.前進(jìn).后退 4.加載 JS 數(shù)據(jù)3.附加屬性
* 頁(yè)面縮放
* 是否檢查電話號(hào)碼
* 是否允許內(nèi)聯(lián)媒體回放
* 媒體回放需要用戶操作
* 媒體回放允許 AirPlay
* 是否鎮(zhèn)壓增量渲染
* 鍵盤調(diào)起是否需要用戶操作
* 是否允許畫中畫
* 是否允許鏈接預(yù)覽
* WebPage 相關(guān)屬性
WebKit 庫(kù)整理
-
擴(kuò)充之后的 Web 庫(kù)相比較 WebView , 內(nèi)容進(jìn)行了細(xì)分, 因此擴(kuò)展成為有 32 個(gè)類的大庫(kù), 但是整體進(jìn)行分析之后, 除了主要的 WKWebView 類目, 剩余類目都以下四個(gè)方面展開:
- BackForwardList: 控件前后加載的網(wǎng)頁(yè)集合, 數(shù)組形式
- Configuration: 配置類, 主要涉及頁(yè)面屬性設(shè)置等
- NavgationDelegage: 導(dǎo)航類, 主要涉及 WebView 的頁(yè)面跳轉(zhuǎn)問(wèn)題
- UIDelegate: 界面類, 主要涉及 Feature. PreviewElement. 等
以下為詳細(xì)的框架結(jié)構(gòu)
/**
WebView 類庫(kù)主文件, 主要功能分為以下四個(gè)模塊
* WKBackForwardList
* Configuration
* NavgationDelegage
* UIDelegate
*/
#import <WebKit/WKWebView.h>
//常規(guī)宏定義文件 & 錯(cuò)誤對(duì)象文件
#import <WebKit/WKFoundation.h>
#import <WebKit/WebKitLegacy.h>
#import <WebKit/WKError.h>
//瀏覽記錄
#import <WebKit/WKBackForwardList.h> // 被動(dòng)信息類- WebView 加載過(guò)的頁(yè)面數(shù)組
#import <WebKit/WKBackForwardListItem.h> // 被動(dòng)信息類- Item 內(nèi)包含了頁(yè)面的基本信息
//網(wǎng)頁(yè)配置信息
/**
主要配置可配置一下方面
* 進(jìn)程池
* 偏好設(shè)置
* 用戶內(nèi)容控制器
* 網(wǎng)站數(shù)據(jù)存儲(chǔ)
* 雜項(xiàng): .阻止過(guò)分渲染 .用戶代理應(yīng)用名稱 .內(nèi)聯(lián)媒體播放器相關(guān)(畫中畫相關(guān)) .網(wǎng)頁(yè)數(shù)據(jù)探測(cè)類型 .忽略頁(yè)面縮放 .界面重定向策略 .URLScheme 相關(guān)管理 等
*/
#import <WebKit/WKWebViewConfiguration.h>
{
/**
FrameInfo -> SecurityOrginal
主要提供了當(dāng)前網(wǎng)頁(yè)的一系列相關(guān)信息
*/
#import <WebKit/WKFrameInfo.h>// 被動(dòng)信息類- 頁(yè)面框架相關(guān)信息: 當(dāng)前 view. 保密源. 請(qǐng)求對(duì)象. 是否為主框架.
#import <WebKit/WKSecurityOrigin.h>// 被動(dòng)信息類- 保密源詳細(xì)信息: 協(xié)議. 主機(jī)地址. 端口號(hào).
/**
URLSchemeHandler -> URLSchemeTask
主要提供了 URLScheme 的相關(guān)活動(dòng)監(jiān)聽接口
*/
#import <WebKit/WKURLSchemeHandler.h>// 被動(dòng)函數(shù)類- URLScheme 句柄協(xié)議: 提供了開始和結(jié)束的監(jiān)聽函數(shù)
#import <WebKit/WKURLSchemeTask.h>// 被動(dòng)函數(shù)類- URLSchemeTask 協(xié)議: 提供了請(qǐng)求信息, 以及 接收響應(yīng). 接收數(shù)據(jù). 完成. 失敗. 的函數(shù)
/**
主要提供了 WebView 的進(jìn)程池, 用來(lái)優(yōu)化內(nèi)存等, 類似于 tableview 的重用, 沒(méi)有操作權(quán)限.
*/
#import <WebKit/WKProcessPool.h> // 進(jìn)程池
/**
主要提供了網(wǎng)頁(yè)偏好設(shè)置的入口, 可以設(shè)置一些網(wǎng)頁(yè)屬性.
*/
#import <WebKit/WKPreferences.h> // 主動(dòng)設(shè)置類- 最小縮放比例. JS相關(guān)設(shè)置. 能否使用插件插件.
/**
UserContentController -> 1.ScriptMessageHandler 2.ContentRule 3.UserScript
主要功能是管理以上三種消息, 可以進(jìn)行增刪操作.
*/
#import <WebKit/WKUserContentController.h> //信息類- 用戶腳本 腳本消息 頁(yè)面過(guò)濾規(guī)則
{
/**
ScriptMessageHandler -> ScriptMessage
腳本消息相關(guān)
*/
#import <WebKit/WKScriptMessageHandler.h>// 被動(dòng)函數(shù)類- 監(jiān)聽 JS 消息
#import <WebKit/WKScriptMessage.h>// 被動(dòng)信息類- 提供 JS 消息的相關(guān)數(shù)據(jù)
/**
ContentRuleListStore -> ContentRuleList
頁(yè)面過(guò)濾規(guī)則相關(guān)
*/
#import <WebKit/WKContentRuleListStore.h>// 主動(dòng)函數(shù)類- ContentRule 的增刪改編譯
#import <WebKit/WKContentRuleList.h>// 被動(dòng)信息類- ContentRule 的標(biāo)識(shí)符
/**
用戶腳本相關(guān)操作以及屬性獲取
*/
#import <WebKit/WKUserScript.h>// 主動(dòng)函數(shù)+被動(dòng)信息- 提供了 UserScript 的創(chuàng)建以及創(chuàng)建后的信息獲取
}
/**
WebsitDataStore -> CookieStore & DataRecord
網(wǎng)站數(shù)據(jù)相關(guān)
*/
#import <WebKit/WKWebsiteDataStore.h>// 主動(dòng)函數(shù)類- 提供了網(wǎng)站數(shù)據(jù) & cookie 的刪查功能
#import <WebKit/WKHTTPCookieStore.h>// 主動(dòng)+被動(dòng)函數(shù)類- 提供了 cookie 的增刪查功能以及監(jiān)聽功能.
#import <WebKit/WKWebsiteDataRecord.h>// 被動(dòng)信息類- 提供網(wǎng)站數(shù)據(jù)
}
/**
NavigationDelegate -> Navigation. NavigationAction. NavigationResponse.
主要負(fù)責(zé) WebView 在跳轉(zhuǎn)時(shí)的相關(guān)信息傳遞以及函數(shù)監(jiān)聽
*/
#import <WebKit/WKNavigationDelegate.h>
{
#import <WebKit/WKNavigation.h>// 被動(dòng)信息類- 主要為頁(yè)面加載的進(jìn)度做標(biāo)識(shí)
#import <WebKit/WKNavigationAction.h>// 被動(dòng)信息類- 主要提供頁(yè)面跳轉(zhuǎn)行為的相關(guān)信息, 網(wǎng)頁(yè)前后框架信息. 跳轉(zhuǎn)請(qǐng)求對(duì)象. 跳轉(zhuǎn)行為. 點(diǎn)擊次數(shù).
#import <WebKit/WKNavigationResponse.h>// 被動(dòng)信息類- 主要提供跳轉(zhuǎn)后接收到的響應(yīng)信息
}
/**
UIDelegate -> OpenPanelParameters & PreviewElement
主要負(fù)責(zé)頁(yè)面相關(guān)變動(dòng)的監(jiān)聽, 包括: 頁(yè)面創(chuàng)建&關(guān)閉. JS 運(yùn)行 提示框&確認(rèn)框&輸入框時(shí)的攔截. 執(zhí)行預(yù)覽時(shí)的監(jiān)聽.
*/
#import <WebKit/WKUIDelegate.h>
{
#import <WebKit/WKWindowFeatures.h>// 被動(dòng)信息類- 提供了頁(yè)面的 Feature 信息, 坐標(biāo). 寬高. 是否允許縮放. 工具條/狀態(tài)欄/標(biāo)簽欄是否可見.
#import <WebKit/WKOpenPanelParameters.h>// 被動(dòng)信息類- 是否允許多文件上傳
/**
ActionItem -> ActionItemIdentifier & PreviewElementInfo
頁(yè)面預(yù)覽相關(guān)類目
*/
#import <WebKit/WKPreviewElementInfo.h>// 被動(dòng)信息類- 預(yù)覽元素信息, 只提供 url
#import <WebKit/WKPreviewActionItem.h>// 被動(dòng)信息類- 預(yù)覽行為, 只有一個(gè)標(biāo)識(shí)符屬性用來(lái)標(biāo)識(shí)預(yù)覽行為的類型
#import <WebKit/WKPreviewActionItemIdentifiers.h>// 被動(dòng)信息類- 預(yù)覽行為類型標(biāo)識(shí)符, 通過(guò)判斷常量字符串判斷預(yù)覽行為類型, 打開. 添加列表. 拷貝. 分享.
}
以下為每個(gè)類目的具體功能
#import <WebKit/WKBackForwardList.h>
{
@Abstract: 裝載 BackForwardItem 的列表, 記錄了 WebView 加載過(guò)的網(wǎng)頁(yè), 將加載過(guò)的多個(gè)網(wǎng)頁(yè)全部記錄存儲(chǔ), 作為數(shù)組形式存在
@ API 整理:
1.獲取當(dāng)前 Item. 獲取上一個(gè) Item. 獲取下一個(gè) Item
2.根據(jù) index 獲取 Item, 獲取前面的所有 Items. 獲取后面的所有 Items
* 如果獲取的 Item 超過(guò)了 List 的范圍, 則會(huì)返回 nil.
}
#import <WebKit/WKBackForwardListItem.h>
{
@Abstract: 記錄 WebPageItem 的對(duì)象, 內(nèi)部全是 readonly 屬性, 主要提供了 URL 以及 title , 雖然有 init 函數(shù), 但是因?yàn)闆](méi)有 url 設(shè)置入口, 因此, 基本不會(huì)被用戶使用.
@ API 整理:
1. URL
2. title
3. initialURL
}
#import <WebKit/WKContentRuleList.h>
{
//關(guān)鍵網(wǎng)址: http://www.jb51.net/article/118145.htm
@Abstract: 本質(zhì)上是可以對(duì)WebView的內(nèi)容添加一些自定義的過(guò)濾規(guī)則, 屬于 webView 的新增功能
@Abstract: 意譯為內(nèi)容管理列表, 實(shí)際使用方式不明
@ 功能使用思路: 提供一個(gè) JSON 給 WebKit,這個(gè) JSON 包括內(nèi)容的觸發(fā)規(guī)則(trigger)和對(duì)應(yīng)的處理方式(action), 具體的使用需要再研究.
@ API 整理:
* 只有一個(gè) identifier 屬性, 且為 readonly 屬性, 解釋為 內(nèi)容擴(kuò)展表示的拷貝副本
}
#import <WebKit/WKContentRuleListStore.h>
{
@Abstract: 屬于 ContentRule 功能的組成部分, 主要是存儲(chǔ), 以及獲取存儲(chǔ)的 ContentRule 內(nèi)容并編譯.
@API:
1.重要: 存儲(chǔ) ContentRule 函數(shù).
2.功能: 主要有, 編譯. 查看. 移除. 獲取可用. ~ 內(nèi)容規(guī)則, 基本參數(shù)為 Identifier 以及 回調(diào).
}
#import <WebKit/WKError.h>
{
@Abstract: 配置了 WKError 的錯(cuò)誤域, 含有多個(gè)錯(cuò)誤碼.
@Classify: 9 種
未知錯(cuò)誤.
網(wǎng)頁(yè)內(nèi)容進(jìn)程終止.
webView 無(wú)效.
JS 解析發(fā)生異常.
JS 結(jié)果類型不支持.
ContentRule 編譯失敗. 查看失敗. 移除失敗. 版本匹配錯(cuò)誤.
}
#import <WebKit/WKFoundation.h>
{
@Abstract: 定義了平臺(tái)以及處理器的版本宏定義.
}
#import <WebKit/WKFrameInfo.h>
{
@Abstract: 網(wǎng)頁(yè)的框架信息, 似乎就簡(jiǎn)單的是有關(guān)網(wǎng)頁(yè)的框架信息的集合, 定義中解釋為 Transient And DataOnly, 短暫且僅僅是數(shù)據(jù)的對(duì)象.
@Classfy:
內(nèi)部只有只讀信息的獲取, 1.當(dāng)前框架是主框架還是子框架 2.框架當(dāng)前的請(qǐng)求對(duì)象( NSURLRequest ) 3.框架的安全源信息( WKSecurityOrginal: 其實(shí)就包含了 協(xié)議, host, 端口號(hào) ) 4.包含此框架的網(wǎng)頁(yè)的 webView
}
#import <WebKit/WKHTTPCookieStore.h>
{
@Abstract: 僅僅是 WK 框架用來(lái)管理 cookie 的對(duì)象
@Classfy: 至于關(guān)于 cookie 的增刪改查函數(shù), 以及監(jiān)聽函數(shù), 監(jiān)聽函數(shù)使用 KVO 方式的代理監(jiān)聽
}
#import <WebKit/WKNavigation.h>
{
@Abstract: 定義中描述為用來(lái)追蹤網(wǎng)頁(yè)加載過(guò)程的對(duì)象
@Classfy: 無(wú)函數(shù), 無(wú)屬性.
}
#import <WebKit/WKNavigationAction.h>
{
@Abstract: 包含有關(guān)可能導(dǎo)致導(dǎo)航的操作的信息, 用于制定策略決策, 其實(shí)就是可能會(huì)導(dǎo)致 Nav 發(fā)生改變, 也就是頁(yè)面發(fā)生跳轉(zhuǎn)的行為對(duì)象.
@Classfy: 內(nèi)部只包含屬性信息, 都是指示頁(yè)面跳轉(zhuǎn)之間的聯(lián)系的數(shù)據(jù).
* 請(qǐng)求對(duì)象, 導(dǎo)航改變類型(枚舉類型: 例如表單提交, 頁(yè)面刷新等操作), 原框架, 目標(biāo)框架
* 還有兩個(gè)屬性, NSEventModifierFlags 不知為什么, buttonNumber 似乎是鼠標(biāo)點(diǎn)擊次數(shù)
}
#import <WebKit/WKNavigationDelegate.h>
{
@Abstract: 主要是用來(lái)監(jiān)聽加載過(guò)程的代理對(duì)象, 在 WK 中頁(yè)面的跳轉(zhuǎn)行為, 基本就被稱作 navigation .
@Classfy:
相比較與 WebView 的 Process Method , Wk 的 Method 數(shù)量更多, 可監(jiān)聽的位置共詳細(xì), 除了基本的, 開始, 結(jié)束, 失敗等函數(shù), 增加以下函數(shù).
* 接收到重定向的函數(shù)
* 接收到服務(wù)器要求驗(yàn)證身份的函數(shù)
* WKNavigationAction & 兩個(gè) Policy : Action 內(nèi)部區(qū)分了多種
}
#import <WebKit/WKNavigationResponse.h>
{
@Abstract: 信息類-被動(dòng)獲取: 主要提供了 Request, 是否為主框架, 是否能展示 MIME 類型
}
#import <WebKit/WKOpenPanelParameters.h>
{
@Abstract: 信息類-被動(dòng)獲取: 包含一個(gè)已經(jīng)指定好的的文件上傳參數(shù)
@Classfy: 只有一個(gè)參數(shù): 文件上傳是否允許多個(gè)文件上傳.
}
#import <WebKit/WKPreferences.h>
{
@Abstrac: 信息類-主動(dòng)設(shè)置: 網(wǎng)頁(yè)偏好設(shè)置
@Classfy:
* 字體縮放尺寸
* 1. 是否可以執(zhí)行 JS 2.JS 能否自動(dòng)打開窗口
* Java 能否執(zhí)行
* 是否允許插件
* 選項(xiàng)卡是否連接焦點(diǎn)?
}
#import <WebKit/WKPreviewActionItem.h>
{
@Abstract: 信息類-被動(dòng)獲取: 就是預(yù)覽操作的 item 對(duì)象, 內(nèi)部只包含一個(gè) item 的 identifier .
}
#import <WebKit/WKPreviewActionItemIdentifiers.h>
{
@Abstract: 信息類-被動(dòng)獲取: 只包含了幾個(gè) PreviewActionIdentifier 類型的字符串, 應(yīng)該是從哪里能獲取一個(gè) infoDict, 這個(gè)是 key .
}
#import <WebKit/WKPreviewElementInfo.h>
{
@Abstract: 信息類-被動(dòng)獲取: 預(yù)覽元素信息, 其實(shí)只包含了預(yù)覽元素的 url
}
#import <WebKit/WKProcessPool.h>
{
@Abstract: 進(jìn)程池對(duì)象, 內(nèi)部無(wú)任何數(shù)據(jù)函數(shù), 但是因?yàn)樯婕暗骄W(wǎng)頁(yè)內(nèi)容進(jìn)程, 對(duì)于內(nèi)存管理 以及 多控件的網(wǎng)頁(yè)加載機(jī)制, 應(yīng)該是有可以推敲的地方.
}
#import <WebKit/WKScriptMessage.h>
{
@Abstract: 信息類-被動(dòng)獲取: 只是有關(guān)網(wǎng)頁(yè)發(fā)出的腳本消息的相關(guān)信息
@Classfy:
* 主要可讀信息為: 信息體. 腳本框架信息. 消息發(fā)送對(duì)象的名稱. 發(fā)出消息的網(wǎng)頁(yè)對(duì)象.
}
#import <WebKit/WKScriptMessageHandler.h>
{
@Abstract: 函數(shù)類-代理被動(dòng)監(jiān)聽: 只有一個(gè)代理協(xié)議, 用來(lái)監(jiān)聽 JS 消息運(yùn)行/
}
#import <WebKit/WKSecurityOrigin.h>
{
@Abstract: 信息類-被動(dòng)獲取, 本質(zhì)就是一個(gè)安全的源地址的信息, 內(nèi)部主要是三個(gè)屬性: 協(xié)議, 主機(jī)地址, 端口號(hào)
}
#import <WebKit/WKURLSchemeHandler.h>
{
@Abstract: 內(nèi)部只有一份協(xié)議, 協(xié)議中函數(shù)能監(jiān)聽 webview 開始加載, 以及 停止加載 UrlSchemeTask .
@Classfy: 函數(shù)中有兩個(gè)參數(shù): 調(diào)用的 webView 以及執(zhí)行的 URLSchemeTask 對(duì)象.
}
#import <WebKit/WKURLSchemeTask.h>
{
@Abstract: 內(nèi)部只有一份協(xié)議, 協(xié)議中暴露了 task 對(duì)象的 Request, 同時(shí), 還有幾個(gè)不同狀態(tài)的監(jiān)聽函數(shù).
* 使用方式: 其實(shí)是將 Task 對(duì)象作為了一個(gè)小的功能模塊對(duì)象.
@Classfy:
* 1.接收響應(yīng)header 2.拼接數(shù)據(jù) 3.完成 4.失敗
}
#import <WebKit/WKUserContentController.h>
{
@Abstract: 不太明了 Controller 的含義, 主要管理了有關(guān)頁(yè)面內(nèi)的三個(gè)主要對(duì)象 1.UserScript 2.ScriptMessageHandler 3.ContentRule , 包括了這些對(duì)象的增加以及刪除函數(shù). 類似于一個(gè)管理類.
}
#import <WebKit/WKUserScript.h>
{
@Abstract: 數(shù)據(jù)對(duì)象: 主要含有 1. JS 代碼 2. JS 注入時(shí)機(jī)枚舉 3. JS 注入的框架是否為全局的 此外, 就只有一個(gè)初始化函數(shù), 并且只能在初始化函數(shù)中設(shè)置以上屬性, 其他時(shí)候?qū)傩詾橹蛔x.
}
#import <WebKit/WKWebsiteDataRecord.h>
{
@Abstract: 根據(jù)網(wǎng)址 ( DomainName ) 創(chuàng)建的數(shù)據(jù)存儲(chǔ)對(duì)象, 對(duì)象的主要元素有兩個(gè), 1. 記錄的名稱( displayName ) 2. 存儲(chǔ)數(shù)據(jù)的集合 , 集合中的字符串應(yīng)該是 URL 數(shù)據(jù), 文件中定義了多個(gè)字符串 key
}
#import <WebKit/WKWebsiteDataStore.h>
{
@Abstract: 主要作用是管理一個(gè)網(wǎng)站的數(shù)據(jù)對(duì)象( Record ), 可以進(jìn)行查找以及刪除操作, 與 WKWebsiteDataRecord 相關(guān)聯(lián), 因?yàn)椴僮鞯膶?duì)象就是 WKWebsiteDataRecord 對(duì)象的集合, 如果不希望 webview 存儲(chǔ)數(shù)據(jù), 設(shè)置 Store 的不保存臨時(shí)數(shù)據(jù)即可.
}
#import <WebKit/WKWindowFeatures.h>
{
@Abstract: 信息類-被動(dòng)獲取, 能獲取關(guān)于窗口特色設(shè)置的信息, 即 WindowFeature , 實(shí)際上是 ContainingWiondow 的屬性.
@Classfy: 可獲取的主要是: 坐標(biāo) x. y. width. height. 以及 菜單條. 狀態(tài)條. 工具條. 是否可見
}
#import <WebKit/WebKitLegacy.h>
{
@Abstract: 不明所以的文件, 導(dǎo)入了 //#import <WebKitLegacy/WebKit.h> 文件 kit 遺產(chǎn)?
}
#import <WebKit/WKWebView.h>
{
@Abstract: 是整個(gè) WK 框架的核心, 圍繞著加載網(wǎng)頁(yè), 衍生出了很多分支功能.
@Classfy: 脈絡(luò)
* WKWebViewConfiguration: 網(wǎng)頁(yè)本身的屬性控制
* WKNavigationDelegate: 跳轉(zhuǎn)控制相關(guān)
* WKUIDelegate: 用戶交互相關(guān)
* BackForwardList:
}
#import <WebKit/WKUIDelegate.h>
{
@Abstract: 分擔(dān)了一部分 WebView 的主動(dòng)功能, 屬于主動(dòng)部分
}
#import <WebKit/WKWebViewConfiguration.h>
{
@Abstract: 主要是分擔(dān)了 WebView 的頁(yè)面設(shè)置的部分, 相對(duì)來(lái)說(shuō), 屬于被動(dòng)部分
}
}