iOS 自动适配的 WebView 封装 (上)

简介: iOS 自动适配的 WebView 封装 (上)

针对 iOS 不同版本下 WebView 的碎片化,进行整理封装,主要功能是根据系统版本自动选择 UI/WK-WebView 进行加载。


image.png


封装功能:

  • Block 方式 JavaScript <-> Objective-C 的交互。
  • 滑动至顶部功能
  • 扩展脚本
  • 针对 WKWebView 和 UIWebView 的 Cookie 等缓存互通
  • 内容渲染干预等
  • 新增特征:加入腾讯 VAS·Sonic 技术,一种声称可以秒开 WebView 的框架。

无需设置,无需插件,可创建基类继承管理全局WebView页面。



🎨 测试 UI 样式



image.pngimage.png

image.png


🚀 框架的优势


  • 1.文件少,代码简洁
  • 2.根据系统版本自动选择使用 UI/WK WebView,提升用户体验
  • 3.同时支持 WebView Delegate 系统回调和 WebViewJavascriptBridge 库回调
  • 4.结构架构优良,可通过基类集中管理加载页面
  • 5.具备较高自定义性


🤖 要求


  • iOS 7+
  • Xcode 8+


🎯 使用方法


1. RSAutoWebView 封装方法

1.1 对外方法

//使用UIWebView
- (instancetype)initWithFrame:(CGRect)frame usingUIWebView:(BOOL)usingUIWebView;
//会转接 WKUIDelegate,WKNavigationDelegate 内部未实现的回调。
@property (weak, nonatomic) id<RSAutoWebViewDelegate> delegate;
//内部使用的webView
@property (nonatomic, readonly) id realWebView;
//是否正在使用 UIWebView
@property (nonatomic, readonly) BOOL usingUIWebView;
//预估网页加载进度
@property (nonatomic, readonly) double estimatedProgress;
@property (nonatomic, readonly) NSURLRequest* originRequest;
//只有ios7以上的UIWebView才能获取到,WKWebView 请使用下面的方法.
@property (nonatomic, readonly) JSContext* jsContext;
//WKWebView 跟网页进行交互的方法。
- (void)addScriptMessageHandler:(id<WKScriptMessageHandler>)scriptMessageHandler name:(NSString*)name;
//back 层数
- (NSInteger)countOfHistory;
- (void)gobackWithStep:(NSInteger)step;


1.2 内部方法

//---- UI 或者 WK 的API
@property (nonatomic, readonly) UIScrollView* scrollView;
- (id)loadRequest:(NSURLRequest*)request;
- (id)loadHTMLString:(NSString*)string baseURL:(NSURL*)baseURL;
@property (nonatomic, readonly, copy) NSString* title;
@property (nonatomic, readonly) NSURLRequest* currentRequest;
@property (nonatomic, readonly) NSURL* URL;
@property (nonatomic, readonly, getter=isLoading) BOOL loading;
@property (nonatomic, readonly) BOOL canGoBack;
@property (nonatomic, readonly) BOOL canGoForward;
- (id)goBack;
- (id)goForward;
- (id)reload;
- (id)reloadFromOrigin;
- (void)stopLoading;
// 清理缓存
- (void)clearCache;
- (void)evaluateJavaScript:(NSString*)javaScriptString completionHandler:(void (^)(id, NSError*))completionHandler;
// 不建议使用这个办法  因为会在内部等待webView 的执行结果
- (NSString*)stringByEvaluatingJavaScriptFromString:(NSString*)javaScriptString __deprecated_msg("Method deprecated. Use [evaluateJavaScript:completionHandler:]");
// 是否根据视图大小来缩放页面  默认为YES
@property (nonatomic) BOOL scalesPageToFit;


2. BaseWebViewController 基类方法

2.1 基本方法

/* 
* url    请求地址
* isOpen 是否开启自动选择WebView功能
*        是: usingUIWebView 设置无效
*        否: usingUIWebView 设定是否使用 UIWebView
*/
- (void)loadWebViewWithURL:(NSString *)url autoChoose:(BOOL)isOpen ifCloseAutoChooseUsingUIWebView:(BOOL)usingUIWebView;


2.2 增强方法

#pragma mark - 参数、方法
// URL地址
@property (nonatomic,copy) NSString *url;
// 加载URL方法
- (void)reloadRequest:(NSString *)url;
// 返回顶端
- (void)scrollToTop;
// 图片适应 JavaScript 注入
- (void)imgAutoFit;
// WebView中收起键盘方法
- (void)packupKeyboard;
// 返回方法
- (void)webViewBackAction:(UIBarButtonItem *)sender;
// 清理缓存
- (void)clearCache;
#pragma mark - 代理方法
/**
*  统一wk ui加载状态代理方法,二合一
*/
@property (nonatomic,copy) void(^startLoadBlock)(id webView);
@property (nonatomic,copy) void(^finishLoadBlock)(id webView);
@property (nonatomic,copy) void(^failLoadBlock)(id webView, NSError *error);
#pragma mark - WebViewJavascriptBridge JS交互方法
//callHandler【OC向JS发生消息】
- (void)JSCallHandlerWithFuncName:(NSString *)name Data:(NSDictionary *)dicData;
@property (nonatomic,copy) void(^javaScriptCallReturnBlock)(id response);
//registerHandler 【OC接收JS的消息】
- (void)JSRegisterHandlerWithFuncName:(NSString *)name;
@property (nonatomic,copy) void(^javaScriptRegisterReturnBlock)(id response, WVJBResponseCallback responseCallback);



3. 腾讯 VAS·Sonic 秒开 WebView框架

3.1 简介

VasSonic 取名于索尼动画形象音速小子,是腾讯 QQ 会员 VAS 团队研发的一个轻量级的高性能的 Hybrid 框架,专注于提升页面首屏加载速度,完美支持静态直出页面和动态直出页面,兼容离线包等方案。目前 QQ 会员、QQ 购物、QQ 钱包、企鹅电竞等业务已经在使用,平均日均 PV 在 1.2 亿以上,并且这个数字还在快速增长。


image.png


接入 VasSonic 后首次打开可以在初始化 APP 的时候并行请求页面资源,并且具备边加载边渲染的能力。非首次打开时,APP 可以快速加载上次打开动态缓存在本地的页面资源,然后动态刷新页面。腾讯手机 QQ 通过 VasSonic 框架使得页面首屏耗时平均低于 1S 以下。

官方开源地址:github.com/Tencent/vas…


3.2 基本方法

引用头文件

// 腾讯VAS框架
#import "Sonic.h"
#import "SonicWebViewController.h"
#import "SonicOfflineCacheConnection.h"

使用跳转方法

SonicWebViewController *webVC = [[SonicWebViewController alloc]initWithUrl:testTencentURL useSonicMode:YES];
webVC.title = @"VAS·Sonic";
[self.navigationController pushViewController:webVC animated:YES];

使用简单、效率高效、进程安全~~~如果你有更好的建议,希望不吝赐教!


你的star是我持续更新的动力!


📝 CocoaPods更新日志


  • 2017.08.22(tag:0.9.0):
    1.整理基类开放方法,优化实现功能;
    2.加入腾讯开源的 VasSonic 秒开 WebView 框架。
  • 2017.04.10(tag:0.8.0):
    1.增加 WebViewJavascriptBridge 支持,增加JavaScript <-> Objective-C 交互;
    2.Block 方式回调封装;
    3.Cookie 缓存同步机制等。
  • 2016.09.18(tag:0.2.5):
    1.根据系统版本自动切换WK/UI-WebView,
    2.功能性封装。
  • 2016.08.26(tag:0.1.0):
    1.创建手动的 WebView 切换工具。


目录
相关文章
|
Android开发 iOS开发
iOS 替换WebView网页图片为本地图片
iOS 替换WebView网页图片为本地图片
264 0
|
4月前
|
IDE API Android开发
安卓与iOS开发环境的差异及适配策略
在移动应用开发的广阔舞台上,Android和iOS两大操作系统各据一方,各自拥有独特的开发环境和工具集。本文旨在深入探讨这两个平台在开发环境上的关键差异,并提供有效的适配策略,帮助开发者优化跨平台开发流程。通过比较Android的Java/Kotlin和iOS的Swift/Objective-C语言特性、IDE的选择、以及API和系统服务的访问方式,本文揭示了两个操作系统在开发实践中的主要分歧点,并提出了一套实用的适配方法,以期为移动开发者提供指导和启示。
|
6月前
|
iOS开发
SwiftUI适配iOS16导航控制器引起的闪退
SwiftUI适配iOS16导航控制器引起的闪退
72 0
|
6月前
|
监控 iOS开发
iOS15适配问题:viewForSupplementaryElementOfKind表头和表尾复用闪退,UITableView section header多22像素等问题
iOS15适配问题:viewForSupplementaryElementOfKind表头和表尾复用闪退,UITableView section header多22像素等问题
88 0
|
6月前
|
小程序 Android开发
Appium微信小程序自动化之开启webview调试功能方法封装
Appium微信小程序自动化之开启webview调试功能方法封装
198 0
|
12月前
|
小程序 开发工具 Android开发
Donut多端框架小程序打包适配ios和安卓app
腾讯新出了一个 Donut 多端框架,可以直接将微信小程序转成 ios 和 安卓 app,小程序开发者工具里也集成了 app 相关升级、调试和打包的功能,终于可以一套代码开发出3个客户端了!
255 0
Donut多端框架小程序打包适配ios和安卓app
|
安全 前端开发 开发工具
iOS12、iOS11、iOS10、iOS9常见适配
iOS12、iOS11、iOS10、iOS9常见适配
233 0
|
小程序 iOS开发
uniapp中IOS端小程序底部黑线适配的方法(整理)
uniapp中IOS端小程序底部黑线适配的方法(整理)
|
Shell iOS开发
iOS 逆向编程(九 - 2)将端口映射、USB连接手机封装成 .sh 脚本
iOS 逆向编程(九 - 2)将端口映射、USB连接手机封装成 .sh 脚本
137 0
|
前端开发 JavaScript 定位技术
iOS 逆向编程(十六)DZMCycript 脚本使用(封装了常用的快捷函数,后续会继续添加)
iOS 逆向编程(十六)DZMCycript 脚本使用(封装了常用的快捷函数,后续会继续添加)
134 0