iOS Web 加载相关
- 主要使用两种技术: WebView & WebKit
- JS 交互: 通过监听 JS Request 并使用 evaluateJS 函数进行交互动作
- 每个 App 如果使用 webView 加载了网页, 就会根据 App 的 bundle 生成对应的 storage ,并且实际上, 操作 cookie 以及 storage 的对象是以 app 为单位的单例对象, 甚至是全局的单例对象, 不过在操作实际的缓存的时候回自动根据当前 app 进行选择
WebView 控件整理
-
概述:
原生的 webview 的整个框架提供的 API 特别少, 除了主要的 数据源, 加载回调 等必须函数之外, 就只提供了四个最基本的功能, 以及十个以内的网页属性设置.- WebView 提供的整体的所有功能:
1.加载流程 ( 数据源, 监听函数 - 几个监听阶段 ) - 监听阶段
* 数据源: 1.Request 2.HTMLString 3.HTML.Data
* 准备 - 加载
* 开始加载
* 加载成功
* 加载失败2.附加行为
* 基本功能: 1.刷新 2.停止加载 3.前进.后退 4.加载 JS 数据3.附加属性
* 页面缩放
* 是否检查电话号码
* 是否允许内联媒体回放
* 媒体回放需要用户操作
* 媒体回放允许 AirPlay
* 是否镇压增量渲染
* 键盘调起是否需要用户操作
* 是否允许画中画
* 是否允许链接预览
* WebPage 相关属性
WebKit 库整理
-
扩充之后的 Web 库相比较 WebView , 内容进行了细分, 因此扩展成为有 32 个类的大库, 但是整体进行分析之后, 除了主要的 WKWebView 类目, 剩余类目都以下四个方面展开:
- BackForwardList: 控件前后加载的网页集合, 数组形式
- Configuration: 配置类, 主要涉及页面属性设置等
- NavgationDelegage: 导航类, 主要涉及 WebView 的页面跳转问题
- UIDelegate: 界面类, 主要涉及 Feature. PreviewElement. 等
以下为详细的框架结构
/**
WebView 类库主文件, 主要功能分为以下四个模块
* WKBackForwardList
* Configuration
* NavgationDelegage
* UIDelegate
*/
#import
//常规宏定义文件 & 错误对象文件
#import
#import
#import
//浏览记录
#import // 被动信息类- WebView 加载过的页面数组
#import // 被动信息类- Item 内包含了页面的基本信息
//网页配置信息
/**
主要配置可配置一下方面
* 进程池
* 偏好设置
* 用户内容控制器
* 网站数据存储
* 杂项: .阻止过分渲染 .用户代理应用名称 .内联媒体播放器相关(画中画相关) .网页数据探测类型 .忽略页面缩放 .界面重定向策略 .URLScheme 相关管理 等
*/
#import
{
/**
FrameInfo -> SecurityOrginal
主要提供了当前网页的一系列相关信息
*/
#import // 被动信息类- 页面框架相关信息: 当前 view. 保密源. 请求对象. 是否为主框架.
#import // 被动信息类- 保密源详细信息: 协议. 主机地址. 端口号.
/**
URLSchemeHandler -> URLSchemeTask
主要提供了 URLScheme 的相关活动监听接口
*/
#import // 被动函数类- URLScheme 句柄协议: 提供了开始和结束的监听函数
#import // 被动函数类- URLSchemeTask 协议: 提供了请求信息, 以及 接收响应. 接收数据. 完成. 失败. 的函数
/**
主要提供了 WebView 的进程池, 用来优化内存等, 类似于 tableview 的重用, 没有操作权限.
*/
#import // 进程池
/**
主要提供了网页偏好设置的入口, 可以设置一些网页属性.
*/
#import // 主动设置类- 最小缩放比例. JS相关设置. 能否使用插件插件.
/**
UserContentController -> 1.ScriptMessageHandler 2.ContentRule 3.UserScript
主要功能是管理以上三种消息, 可以进行增删操作.
*/
#import //信息类- 用户脚本 脚本消息 页面过滤规则
{
/**
ScriptMessageHandler -> ScriptMessage
脚本消息相关
*/
#import // 被动函数类- 监听 JS 消息
#import // 被动信息类- 提供 JS 消息的相关数据
/**
ContentRuleListStore -> ContentRuleList
页面过滤规则相关
*/
#import // 主动函数类- ContentRule 的增删改编译
#import // 被动信息类- ContentRule 的标识符
/**
用户脚本相关操作以及属性获取
*/
#import // 主动函数+被动信息- 提供了 UserScript 的创建以及创建后的信息获取
}
/**
WebsitDataStore -> CookieStore & DataRecord
网站数据相关
*/
#import // 主动函数类- 提供了网站数据 & cookie 的删查功能
#import // 主动+被动函数类- 提供了 cookie 的增删查功能以及监听功能.
#import // 被动信息类- 提供网站数据
}
/**
NavigationDelegate -> Navigation. NavigationAction. NavigationResponse.
主要负责 WebView 在跳转时的相关信息传递以及函数监听
*/
#import
{
#import // 被动信息类- 主要为页面加载的进度做标识
#import // 被动信息类- 主要提供页面跳转行为的相关信息, 网页前后框架信息. 跳转请求对象. 跳转行为. 点击次数.
#import // 被动信息类- 主要提供跳转后接收到的响应信息
}
/**
UIDelegate -> OpenPanelParameters & PreviewElement
主要负责页面相关变动的监听, 包括: 页面创建&关闭. JS 运行 提示框&确认框&输入框时的拦截. 执行预览时的监听.
*/
#import
{
#import // 被动信息类- 提供了页面的 Feature 信息, 坐标. 宽高. 是否允许缩放. 工具条/状态栏/标签栏是否可见.
#import // 被动信息类- 是否允许多文件上传
/**
ActionItem -> ActionItemIdentifier & PreviewElementInfo
页面预览相关类目
*/
#import // 被动信息类- 预览元素信息, 只提供 url
#import // 被动信息类- 预览行为, 只有一个标识符属性用来标识预览行为的类型
#import // 被动信息类- 预览行为类型标识符, 通过判断常量字符串判断预览行为类型, 打开. 添加列表. 拷贝. 分享.
}
以下为每个类目的具体功能
#import
{
@Abstract: 装载 BackForwardItem 的列表, 记录了 WebView 加载过的网页, 将加载过的多个网页全部记录存储, 作为数组形式存在
@ API 整理:
1.获取当前 Item. 获取上一个 Item. 获取下一个 Item
2.根据 index 获取 Item, 获取前面的所有 Items. 获取后面的所有 Items
* 如果获取的 Item 超过了 List 的范围, 则会返回 nil.
}
#import
{
@Abstract: 记录 WebPageItem 的对象, 内部全是 readonly 属性, 主要提供了 URL 以及 title , 虽然有 init 函数, 但是因为没有 url 设置入口, 因此, 基本不会被用户使用.
@ API 整理:
1. URL
2. title
3. initialURL
}
#import
{
//关键网址: http://www.jb51.net/article/118145.htm
@Abstract: 本质上是可以对WebView的内容添加一些自定义的过滤规则, 属于 webView 的新增功能
@Abstract: 意译为内容管理列表, 实际使用方式不明
@ 功能使用思路: 提供一个 JSON 给 WebKit,这个 JSON 包括内容的触发规则(trigger)和对应的处理方式(action), 具体的使用需要再研究.
@ API 整理:
* 只有一个 identifier 属性, 且为 readonly 属性, 解释为 内容扩展表示的拷贝副本
}
#import
{
@Abstract: 属于 ContentRule 功能的组成部分, 主要是存储, 以及获取存储的 ContentRule 内容并编译.
@API:
1.重要: 存储 ContentRule 函数.
2.功能: 主要有, 编译. 查看. 移除. 获取可用. ~ 内容规则, 基本参数为 Identifier 以及 回调.
}
#import
{
@Abstract: 配置了 WKError 的错误域, 含有多个错误码.
@Classify: 9 种
未知错误.
网页内容进程终止.
webView 无效.
JS 解析发生异常.
JS 结果类型不支持.
ContentRule 编译失败. 查看失败. 移除失败. 版本匹配错误.
}
#import
{
@Abstract: 定义了平台以及处理器的版本宏定义.
}
#import
{
@Abstract: 网页的框架信息, 似乎就简单的是有关网页的框架信息的集合, 定义中解释为 Transient And DataOnly, 短暂且仅仅是数据的对象.
@Classfy:
内部只有只读信息的获取, 1.当前框架是主框架还是子框架 2.框架当前的请求对象( NSURLRequest ) 3.框架的安全源信息( WKSecurityOrginal: 其实就包含了 协议, host, 端口号 ) 4.包含此框架的网页的 webView
}
#import
{
@Abstract: 仅仅是 WK 框架用来管理 cookie 的对象
@Classfy: 至于关于 cookie 的增删改查函数, 以及监听函数, 监听函数使用 KVO 方式的代理监听
}
#import
{
@Abstract: 定义中描述为用来追踪网页加载过程的对象
@Classfy: 无函数, 无属性.
}
#import
{
@Abstract: 包含有关可能导致导航的操作的信息, 用于制定策略决策, 其实就是可能会导致 Nav 发生改变, 也就是页面发生跳转的行为对象.
@Classfy: 内部只包含属性信息, 都是指示页面跳转之间的联系的数据.
* 请求对象, 导航改变类型(枚举类型: 例如表单提交, 页面刷新等操作), 原框架, 目标框架
* 还有两个属性, NSEventModifierFlags 不知为什么, buttonNumber 似乎是鼠标点击次数
}
#import
{
@Abstract: 主要是用来监听加载过程的代理对象, 在 WK 中页面的跳转行为, 基本就被称作 navigation .
@Classfy:
相比较与 WebView 的 Process Method , Wk 的 Method 数量更多, 可监听的位置共详细, 除了基本的, 开始, 结束, 失败等函数, 增加以下函数.
* 接收到重定向的函数
* 接收到服务器要求验证身份的函数
* WKNavigationAction & 两个 Policy : Action 内部区分了多种
}
#import
{
@Abstract: 信息类-被动获取: 主要提供了 Request, 是否为主框架, 是否能展示 MIME 类型
}
#import
{
@Abstract: 信息类-被动获取: 包含一个已经指定好的的文件上传参数
@Classfy: 只有一个参数: 文件上传是否允许多个文件上传.
}
#import
{
@Abstrac: 信息类-主动设置: 网页偏好设置
@Classfy:
* 字体缩放尺寸
* 1. 是否可以执行 JS 2.JS 能否自动打开窗口
* Java 能否执行
* 是否允许插件
* 选项卡是否连接焦点?
}
#import
{
@Abstract: 信息类-被动获取: 就是预览操作的 item 对象, 内部只包含一个 item 的 identifier .
}
#import
{
@Abstract: 信息类-被动获取: 只包含了几个 PreviewActionIdentifier 类型的字符串, 应该是从哪里能获取一个 infoDict, 这个是 key .
}
#import
{
@Abstract: 信息类-被动获取: 预览元素信息, 其实只包含了预览元素的 url
}
#import
{
@Abstract: 进程池对象, 内部无任何数据函数, 但是因为涉及到网页内容进程, 对于内存管理 以及 多控件的网页加载机制, 应该是有可以推敲的地方.
}
#import
{
@Abstract: 信息类-被动获取: 只是有关网页发出的脚本消息的相关信息
@Classfy:
* 主要可读信息为: 信息体. 脚本框架信息. 消息发送对象的名称. 发出消息的网页对象.
}
#import
{
@Abstract: 函数类-代理被动监听: 只有一个代理协议, 用来监听 JS 消息运行/
}
#import
{
@Abstract: 信息类-被动获取, 本质就是一个安全的源地址的信息, 内部主要是三个属性: 协议, 主机地址, 端口号
}
#import
{
@Abstract: 内部只有一份协议, 协议中函数能监听 webview 开始加载, 以及 停止加载 UrlSchemeTask .
@Classfy: 函数中有两个参数: 调用的 webView 以及执行的 URLSchemeTask 对象.
}
#import
{
@Abstract: 内部只有一份协议, 协议中暴露了 task 对象的 Request, 同时, 还有几个不同状态的监听函数.
* 使用方式: 其实是将 Task 对象作为了一个小的功能模块对象.
@Classfy:
* 1.接收响应header 2.拼接数据 3.完成 4.失败
}
#import
{
@Abstract: 不太明了 Controller 的含义, 主要管理了有关页面内的三个主要对象 1.UserScript 2.ScriptMessageHandler 3.ContentRule , 包括了这些对象的增加以及删除函数. 类似于一个管理类.
}
#import
{
@Abstract: 数据对象: 主要含有 1. JS 代码 2. JS 注入时机枚举 3. JS 注入的框架是否为全局的 此外, 就只有一个初始化函数, 并且只能在初始化函数中设置以上属性, 其他时候属性为只读.
}
#import
{
@Abstract: 根据网址 ( DomainName ) 创建的数据存储对象, 对象的主要元素有两个, 1. 记录的名称( displayName ) 2. 存储数据的集合 , 集合中的字符串应该是 URL 数据, 文件中定义了多个字符串 key
}
#import
{
@Abstract: 主要作用是管理一个网站的数据对象( Record ), 可以进行查找以及删除操作, 与 WKWebsiteDataRecord 相关联, 因为操作的对象就是 WKWebsiteDataRecord 对象的集合, 如果不希望 webview 存储数据, 设置 Store 的不保存临时数据即可.
}
#import
{
@Abstract: 信息类-被动获取, 能获取关于窗口特色设置的信息, 即 WindowFeature , 实际上是 ContainingWiondow 的属性.
@Classfy: 可获取的主要是: 坐标 x. y. width. height. 以及 菜单条. 状态条. 工具条. 是否可见
}
#import
{
@Abstract: 不明所以的文件, 导入了 //#import 文件 kit 遗产?
}
#import
{
@Abstract: 是整个 WK 框架的核心, 围绕着加载网页, 衍生出了很多分支功能.
@Classfy: 脉络
* WKWebViewConfiguration: 网页本身的属性控制
* WKNavigationDelegate: 跳转控制相关
* WKUIDelegate: 用户交互相关
* BackForwardList:
}
#import
{
@Abstract: 分担了一部分 WebView 的主动功能, 属于主动部分
}
#import
{
@Abstract: 主要是分担了 WebView 的页面设置的部分, 相对来说, 属于被动部分
}
}