一、Native 开发中为什么需要 H5 容器
1. Native 开发的优点(至少说两点)?
- 可以直接调用各个平台的系统 API
- 体验较好,一般而言性能较高
2. Native 开发的缺点(至少说两点)?
- 需要各个平台编写对应的代码,基本不能共用代码
- 有bug或需求都要通过发版解决,发版周期比较长
3. H5 开发模式的优点?
- 灵活性强,服务端可以随时对 H5 的内容进行修改。
- 一套代码解决多端
4. H5 开发模式的缺点?
- 每次都需要下载完整的 UI 数据(html、css、js),弱网用户体验较差,流量消耗较大
- 无法调用系统文件系统,硬件资源等等。
二、UIWebView/WKWebView/NSURLProtocol
1. UIWebView/WKWebView的基本用法
2. NSURLProtocol 的基本用法
3. UIWebView 对比 WKWebView 说几句?
- WKWebView与UIWebView相比较,拥有更快的加载速度和性能,更低的内存占用
- 将UIWebViewDelegate和UIWebView重构成了14个类,3个协议,可以让开发者进行更加细致的配置
- WKWebView他有一个最致命的缺陷,就是WKWebView的请求不能被NSURLProtocol截获。而我们团队开发的app中对于H5容器最佳的优化点主要就在于使用NSURLProtocol技术对于H5进行离线包的处理和H5的图片和Native的图片公用一套缓存的技术。
4. NSURLProtocol 能拦截哪些请求?
- 不能拦截:
WKWebView
的所有请求 - 不能拦截:早些年基于 CFNetwork 实现的,比如 ASIHTTPRequest,其网络请求就无法被拦截
- 除了上面两点之外的几乎所有请求,都能拦截。包括 AFN 和 Alamofire 等等网络请求。
5. NSURLProtocol 对于能拦截的请求,能做些什么事情?
- 重定向网络请求,解决 DNS 域名劫持的问题
- 进行全局或局部的网络请求设置,比如修改请求地址、header 等
- 忽略网络请求,使用 H5 离线包或是缓存数据等
- 自定义网络请求的返回结果,比如过滤敏感信息
6. 如何拦截 WKWebView
虽然 NSURLProtocol 无法直接拦截 WKWebView,但其实还是有解决方案的。就是使用 WKBrowsingContextController 和 registerSchemeForCustomProtocol。
// 注册 scheme
Class cls = NSClassFromString(@"WKBrowsingContextController");
SEL sel = NSSelectorFromString(@"registerSchemeForCustomProtocol:");
if ([cls respondsToSelector:sel]) {
// 通过 http 和 https 的请求,同理可通过其他的 Scheme 但是要满足 URL Loading System
[cls performSelector:sel withObject:@"http"];
[cls performSelector:sel withObject:@"https"];
}
但由于这涉及到了私有方法,直接引用无法过苹果的机审,所以使用的时候需要对字符串做下处理,比如对方法名进行算法加密处理等,实测也是可以通过审核的。
网友评论