一,说明


我的项目是从iOS7开始支持, 一直用UIWebView作为网页容器. 但是,为了更好的用户体验. 我将UIWebView和WKWebView封装合并成一个网页容器LCWebView. 下面是我的做法:



二,LCWebViewDelegate (此代理所有方法均为WKWebView和UIWebView共同拥有的协议,支持iOS7及以上)


此协议有5个方法.(如果项目要求不多,可以只使用这一个协议的方法):


/***  加载一个 webview**  @param request 请求的 NSURL URLRequest**  @param navigationType 用户点击类型*/
- (BOOL)LC_webView:(LCWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(LCWebViewNavigationType)navigationType;/***  开始加载 webview*/
- (void)LC_webViewDidStartLoad:(LCWebView *)webView;/***  加载完成 webview*/
- (void)LC_webViewDidFinishLoad:(LCWebView *)webView;/***  加载失败 webview**  @param error 失败原因**/
- (void)LC_webView:(LCWebView *)webView didFailLoadWithError:(NSError *)error;/***  js传递参数给Native处理.此处可以进行弹框显示.**  @param string js字符串**/
- (void)LC_jsCallWebViewReceiveString:(NSString *)string;

三,LCWebViewWKSupplementDelegate (此代理所有方法均为WKWebView补充协议,不支持UIWebView,为了更好的用户体验,在此添加补充.支持iOS8及以上) 此协议有10个方法(此协议方法,在项目要求不多的情况下不使用也行):



/***  收到服务器响应决定是否跳转(WKWebView代理方法)**  @param response 服务器返回值***  @param mainFrame 是否是主框架**/
- (BOOL)LC_webView:(LCWebView *)webView decidePolicyForNavigationResponse:(NSURLResponse *)response IsForMainFrame:(BOOL)mainFrame API_AVAILABLE(macosx(10.10), ios(8.0));
/***  接收服务器跳转请求之后调用(WKWebView代理方法)**  @param navigation 导航对象**/
-(void)LC_webView:(LCWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation API_AVAILABLE(macosx(10.10), ios(8.0));
/***  当内容开始返回时调用(WKWebView代理方法)**  @param navigation 导航对象**/
- (void)LC_webView:(LCWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation API_AVAILABLE(macosx(10.10), ios(8.0));//
/***  打开新窗口(WKWebView代理方法)**  @param configuration 新窗口的配置**  @param navigationAction 导航行为对象**  @param windowFeatures 窗口特性**/
- (nullable LCWebView *)LC_webView:(LCWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures API_AVAILABLE(macosx(10.10), ios(8.0));
/***  权限认证. 注意测试iOS8系统,自签证书的验证是否可以.(暂时不建议使用该方法)(WKWebView代理方法)**  @param challenge 验证**  @param completionHandler 证书验证block**/
- (void)LC_webView:(LCWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler API_AVAILABLE(macosx(10.10), ios(8.0));
/***  WKwebView关闭(WKWebView代理方法)*/
- (void)LC_webViewDidClose:(LCWebView *)webView API_AVAILABLE(macosx(10.11), ios(9.0));
/***  进程终止(WKWebView代理方法)*/
- (void)LC_webViewWebContentProcessDidTerminate:(LCWebView *)webView API_AVAILABLE(macosx(10.11), ios(9.0));
/***  是否预览(WKWebView代理方法)**  @param elementInfo 预览元素信息(url)**/
- (BOOL)LC_webView:(LCWebView *)webView shouldPreviewElement:(WKPreviewElementInfo *)elementInfo API_AVAILABLE(macosx(10.12), ios(10.0));
/***  自定义预览视图(WKWebView代理方法)**  @param elementInfo 预览元素信息(url)**  @param previewActions 预览行为对象(title,identifier)**/
- (nullable UIViewController *)LC_webView:(LCWebView *)webView previewingViewControllerForElement:(WKPreviewElementInfo *)elementInfo defaultActions:(NSArray<id <WKPreviewActionItem>> *)previewActions API_AVAILABLE(macosx(10.12), ios(10.0));
/***  提交预览视图(WKWebView代理方法)**  @param previewingViewController 预览视图ViewController**/
- (void)LC_webView:(LCWebView *)webView commitPreviewingViewController:(UIViewController *)previewingViewController API_AVAILABLE(macosx(10.12), ios(10.0));

四,通用的属性和调用方法.(支持iOS7及以上)


@property (nonatomic, readonly, strong) UIScrollView *scrollView;
@property (nullable, nonatomic, readonly, copy) NSString *title;
@property (nullable, nonatomic, readonly, copy) NSURL *URL;
@property (nonatomic, readonly, getter=isLoading) BOOL loading;
@property (nonatomic, readonly) BOOL canGoBack;
@property (nonatomic, readonly) BOOL canGoForward;
@property (nullable, nonatomic, readonly, strong) NSURLRequest *request;
@property (nonatomic, weak, nullable)id<LCWebViewDelegate> webDelegate;
@property (nonatomic, weak, nullable)id<LCWebViewWKSupplementDelegate> supplementDelegate;
/***  LCWebView 初始化方法**  @param configuration WKWebView自定义配置**/
- (instancetype)initWithFrame:(CGRect)frame withWKWebViewConfiguration:(nullable WKWebViewConfiguration * )configuration;
/***  LCWebView 刷新*/
- (nullable WKNavigation *)LC_reload;
/***  LCWebView 返回下一页*/
- (nullable WKNavigation *)LC_goBack;
/***  LCWebView 返回上一页*/
- (nullable WKNavigation *)LC_goForward;
/***  LCWebView 停止加载*/
- (void)LC_stopLoading;
/***  加载一个 webview**  @param request 请求的 NSURL URLRequest*/
- (nullable WKNavigation *)LC_loadRequest:(NSURLRequest*)request;
/***  加载一个 webview**  @param string 请求的 URL String**  @param baseURL 请求的 baseURL**/
- (nullable WKNavigation *)LC_loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
/***  加载本地网页**  @param htmlName 请求的本地 HTML 文件名*/
- (nullable WKNavigation *)LC_loadHTMLFileName:(NSString *)htmlName;
/***  oc调js,只提供此方法**  @param javaScriptString js字符串**  @param completionHandler block**/
- (void)LC_evaluatJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError *_Nullable error))completionHandler;

五, UIWebView的属性配置(只支持iOS7.可以不做任何设置)


/***  缩放页面适应屏幕大小(仅设置UIWebView)  注:iPhone Safari defaults to NO*/
@property (nonatomic) BOOL scalesPageToFit;
/***  把网页上内容转换成可点击的链接(仅设置UIWebView) 注:NS_OPTIONS 按位掩码 可以多选(电话,超链接,地址等等)*/
@property (nonatomic) UIDataDetectorTypes dataDetectorTypes;
/***  使用内嵌Html播放还是使用本地控制(仅设置UIWebView) 注:iPhone Safari defaults to NO. iPad Safari defaults to YES*  内嵌Html播放时,在HTML中的video元素必须包含webkit-playsinline属性*/
@property (nonatomic) BOOL allowsInlineMediaPlayback;
/***  自动播放还是手动播放(仅设置UIWebView) 注:iPhone and iPad Safari both default to YES*/
@property (nonatomic) BOOL mediaPlaybackRequiresUserAction;
/***  页面是否可以投影Air Play(仅设置UIWebView) 注:iPhone and iPad Safari both default to YES*/
@property (nonatomic) BOOL mediaPlaybackAllowsAirPlay;
/***  设置是否将数据加载入内存后渲染界面(仅设置UIWebView) 注:iPhone and iPad Safari both default to NO*/
@property (nonatomic) BOOL suppressesIncrementalRendering;
/***  设置用户是否能打开keyboard交互(仅设置UIWebView) 注:default is YES*/
@property (nonatomic) BOOL keyboardDisplayRequiresUserAction;
/***  当网页的大小超出view时,将网页以翻页效果展示(仅设置UIWebView) 注:NS_ENUM*/
@property (nonatomic) UIWebPaginationMode paginationMode;
/***  决定CSS的属性分页是否可用(仅设置UIWebView) 注:NS_ENUM 默认是UIWebPaginationBreakingModePage*/
@property (nonatomic) UIWebPaginationBreakingMode paginationBreakingMode;
/***  每一页的长度(仅设置UIWebView)*/
@property (nonatomic) CGFloat pageLength;
/***  每一页的间距(仅设置UIWebView)*/
@property (nonatomic) CGFloat gapBetweenPages;
/***  获取页数(仅设置UIWebView)*/
@property (nonatomic, readonly) NSUInteger pageCount;

六,WKWebView的属性和额外方法 (为了更好的用户体验,建议设置,不设置也行.支持iOS8及以上)


/***  网站列表,历史记录,可以通过前进和后退 (仅设置WKWebView)*/
@property (nonatomic, readonly, strong) WKBackForwardList *backForwardList;
/***  网页加载进度(仅设置WKWebView)   可以使用KVO监听*/@property (nonatomic, assign) double estimatedProgress;
/***  是否安全加载页面(仅设置WKWebView)*/
@property (nonatomic, readonly) BOOL hasOnlySecureContent;
/***  是否允许水平滑动前进后退(仅设置WKWebView) 注:defaults to NO*/
@property (nonatomic) BOOL allowsBackForwardNavigationGestures;
/***  设置用户代理UserAgent(仅设置WKWebView) 注:iOS9及以上*/
@property (nullable, nonatomic, copy) NSString *customUserAgent API_AVAILABLE(macosx(10.11), ios(9.0));
/***  是否支持链接预览,3DTouch等等(仅设置WKWebView) 注:iOS9及以上*/
@property (nonatomic) BOOL allowsLinkPreview API_AVAILABLE(macosx(10.11), ios(9.0));/***  定向跳转WKBackForwardList中某个页面**  @param item 历史记录表中某个网页的对象.(仅支持WKWebView)*/
- (nullable WKNavigation *)LC_goToBackForwardListItem:(WKBackForwardListItem *)item;
/***  比较网络数据是否有变化,没有变化则使用缓存,否则从新请求.(仅支持WKWebView)*/
- (nullable WKNavigation *)LC_reloadFromOrigin;

七, 补充说明:


(1) LCWebView 的初始化方法只提供一个方法:

- (instancetype)initWithFrame:(CGRect)frame withWKWebViewConfiguration:(nullable WKWebViewConfiguration * )configuration;

当手机系统版本为iOS7则使用UIWebView来加载,当手机系统为iOS8及以上时,LCWebView内部使用WKWebView来加载.如果参数:configuration 设置为nil时,LCWebView内部会默认设置好configuration.

(2) LCWebView 的Native调用js只提供一个方法:

- (void)LC_evaluatJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError *_Nullable error))completionHandler;

(3) LCWebView 的调js用Native只提供LCWebViewDelegate协议中一个方法:

- (void)LC_jsCallWebViewReceiveString:(NSString *)string;

注:所有的js调用Native的弹框.都通过该方法来处理.
例如如下前端代码,通过传递给Native端的字符串来进行弹框显示,具体可以看Demo:

<input type="button" value="js传参给Native" onclick="callFunc()">
<script type="text/javascript">function callOC(func,param){var url= "func=" + func;for(var i in param){url = url + "&" + i + "=" + param[i];}window.webkit.messageHandlers.Native.postMessage(url);   }function callFunc(){var stack = new Array();stack["user"] = "泰日天";stack["message"] = "我是帅哥吗?";stack["time"]  = new Date();callOC("Alert",stack);}</script>

(4) LCWebView 提供POST请求.方法:

- (nullable WKNavigation *)LC_loadRequest:(NSURLRequest*)request;

(5) LCWebView 提供加载网页进度.可以通过KVO来获取,详情看Demo.

(6)LCWebView 在iOS8的系统上,内部使用的是WKWebView. WKWebView加载本地的css,js出现的样式显示不出来等问题.这是系统本身的bug. 我暂时无法解决. LCWebView不推荐加载带有本地css,js文件的html. 单纯的加载一个html从iOS7开始是支持的.

(7) LCWebView 关于https加载自签名证书的解决方法:
UIWebView的https 自签名证书解决方法: http://blog.csdn.net/luochuanad/article/details/53410537

WKWebView的https 自签名证书的解决方法:
https://github.com/LuochuanAD/HybirdWKWebVIew

(8)LCWebView 关于cookie的问题:
https://www.jianshu.com/p/85f24794bbea

iOS之LCWebView(和并UIWebView和WKWebView,兼容iOS7及以上)相关推荐

  1. UIWebView、WKWebView使用详解及性能分析

    一.整体介绍 UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView.通过简单的测试即可发现UIWebView占用过多内存,且 ...

  2. 记录苹果构建吃包,苹果报itms-90809,cordova 需要将UIWebView转为WKWebView

    记录苹果构建吃包,苹果报itms-90809,cordova 需要将UIWebView转为WKWebView 参考链接 步骤 1. 添加cordova-ios 需要是5.1.1 以上 2.增加cord ...

  3. iOS12 UIWebView转换WKWebView

    iOS12已经完全弃用UIWebView改用WKWebView WKWebView是苹果公司在iOS8系统推出的,相比于UIWebView的优势: 1.在性能.稳定性.占用内存方面有很大提升: 2.允 ...

  4. iOS-获取UIWebView或者WKWebView页面的视频连接

    说明 不论使用的是UIWebView还是WKWebView,控件在加载有视频的网页时,我们想抓取网页上的视频链接,用来干其他的事,这里我演示抓取视频链接用自己自定义的视频播放器来播放. UIWebVi ...

  5. 适用ios,android,wp等平台手机emoji表情符号兼容方案

    一 什么是Emoji emoji就是表情符号:词义来自日语(えもじ,e-moji,moji在日语中的含义是字符) 表情符号现已普遍应用于手机短信和网络聊天软件. emoji表情符号,在外国的手机短信里 ...

  6. android webview ios uiwebview和wkwebview的交互以及本地缓存

    android webview js调用java的方式 1.java通过注解@JavascriptInterface导出方法, js通过window.别名.方法名调用方法 2.拦截url方式,通过sh ...

  7. UIWebView和WKWebView的使用及js交互

    web页面和app直接的交互是很常见的东西,之前尝试过flex和js的相互调用以及android和js的相互调用,却只有ios没试过,据说比较复杂.周末花了点时间研究了一下,确实和其他的不太一样,但是 ...

  8. (0006) iOS 开发之JavaScriptCore 实现UIWebView和HTML的交互

    阅读说明:本文不讲解JavaScriptCore 基本使用.网上博客比较多,看几篇基本都会使用了.这里只针对使用过程中遇到的一些问题.以便更好的使用JavaScriptCore. 由于开发的项目是电商 ...

  9. ios加载本地游戏html,使用WKWebView iOS加载本地HTML / Javascript

    我尝试在WKWebView上使用javascript加载本地HTML游戏.虽然我可以看到由CSS设计的HTML页面,但我听不到游戏的任何声音和一些游戏的动作不对应. 我注意到,如果我通过http直播服 ...

最新文章

  1. 腾讯云发布全链路数据开发平台WeData,大数据开发迈入新时代
  2. 阿里云存储_OSS对象存储
  3. 知识点讲解四:栈溢出(stack overflow)问题解决方案
  4. 记录一次svn报错:[Previous operation has not finished; run 'cleanup' if it was interrupted] 的排错过程
  5. python传递变量_在Python中传递变量
  6. php访问数据库例子,PHP访问MSSQL数据库(实例代码)
  7. matlab中值滤波实现
  8. office增加自定义文档模板
  9. 使用TortoiseSVN将文件回退到某个版本
  10. 马万经:城市道路交通主动协同管控
  11. 短视频是如何赚钱的?切入短视频风口的3种玩法
  12. 计算机信息管理企业资源规划综合实训,企业资源规划(ERP)综合实训细则
  13. 网络爬虫笔记【4】 掌握获取 Ajax 异步加载网页内容的方法
  14. 微软服务器无法删除不了,[图]Edge无法卸载 引发诸多用户强烈不满
  15. Q_D以及Q_Q指针理解
  16. JavaScript实现鼠标点击监听---弹出社会主义核心价值观(面向对象小练习)
  17. JSSDK公众号微信分享功能
  18. Linux DSA Net Switch驱动开发
  19. 你的气象图何必如此枯燥
  20. vb script html,VB script 入门

热门文章

  1. smtplib 发送邮件
  2. 内地香港签司法协助安排 9成民商事案件判决有望互认
  3. 商业银行IT系统架构规划
  4. 中科院一博士论文爆红刷屏!“炸”出了一批同行者,刚刚本人回应:祝愿大家努力终有所成!
  5. ati driver for linux
  6. 程序员每天工作多少个小时_程序员每天实际工作几个小时?
  7. c/c++中int类型的负数用强制类型转化为long long类型的讨论
  8. 港科夜闻丨“香港科大+资金”双资源向南海企业开放
  9. html页面for循环风车,html5 风车特效
  10. genymotion最新版下载