iOS-PAWebVIew基于WKWebView封装的框架

PAWebView

PAWebView 之 cookie 管理与同步;
PAWebView 之长按手势;
PAWebView 之POST请求;

一. 前言

       HybirdApp极速业扩展,低成本,高效率,跨平台,灵活易用,规避审核等特性深受各种平台青睐,尤其最近几年流行的响应式设计,HybirdApp都发挥淋漓尽致。如淘宝、美团、支付宝、微信都使用HybirdApp的开发模式来极速扩展业务,如支付宝和微信的支付业务、公众号、城市服务等。

       HybirdApp开发主要框架有WKWebVie、UIWebView。

二. WKWebVIew介绍

       UIWebView自iOS2推出,但该框架存在笨重臃肿,内存占用过高,加载速度慢等诟病,iOS8苹果公司推出WKWebView代替UIWebView。目前的iOS版本兼容基本已经抛弃了iOS7,WKWebView的优势越发明显。

1. WKWebView特点

优点:

  • 高性能,60fps的滚动刷新贞率,页面加载速度有所提升
  • 低内存,内存占用为UIWebView的1/4~1/3
  • 稳定,长期使用性能指标基本稳定
  • 易用,messageHandler的应用,丰富的手势识别,进度条监听(estimatedProgress)等新功能
  • WKNavigationDelegate代理功能的细化。
  • 与Safari相同的JavaScript引擎
  • 支持更多的HTML5特性

缺点:

  • iOS9之前不支持页面缓存管理
  • 无法发送post请求
  • NSProtocal的重写与WKNavigationDelegate冲突
  • 版本迭代

2. WKWebView结构
image

三. PAWebView封装

       PAWebView是基于WKWebView的封装,实现了JS+Native的调用,常见的网页和客户端处理,支持的系统iOS8以上以上。

       github下载请点击这里。

架构导图

image

1. cookies的同步

image
  • iOS11之前通过NSURLRequest手动插入cookies,其需分别兼容PHP和JS两种网页。

  • iOS11推出WKHTTPCookieStore,其与NSHTTPCookieStorage的机制类似。

  • 磁盘独立缓存WKWebView访问产生的或手动插入的cookies,当需同步cookies时,PAWebView将分别同步了磁盘和NSHTTPCookieStorage的cookies。

2. Native与JS交互

  • JS通过WKScriptMessageHandler协议调用Native,WKScriptMessageHandler的使用非常的简单易用。
  • OC通过脚本注入的方式调用JS(evaluateJavaScript)。

3. 兼容POST请求

  • 重写loadRequest方法。

4. 缓存管理

  • 沿用NSURLRequest缓存机制 NSURLRequestCachePolicy。
  • Cookies 缓存。
  • 缓存的清除。

5. 手势功能

  • 通过简本注入的方式处理网页元素。
  • 抓取网页图片
  • 识别二维码
  • 抓取网页元素链接
  • 抓取文本信息

四. PAWebView使用

PAWebView demo下载地址http://download.csdn.net/download/llyouss/10197978

1. 导入PAWebView

#import "PAWebView.h"

2. 使用vc加载网页

 //初始化单例
 PAWebView *webView = [PAWebView shareInstance];
 //加载网页
 [webView loadRequestURL:[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://www.sina.cn"] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0f]];

//缓存沿用了 NSURLRequest 的缓存机制,用户可以自定义设置;
typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{
    NSURLRequestUseProtocolCachePolicy = 0, //默认的缓存策略

    NSURLRequestReloadIgnoringLocalCacheData = 1, //忽略缓存,从服务端加载数据;
    NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented
    NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,

    NSURLRequestReturnCacheDataElseLoad = 2,
    NSURLRequestReturnCacheDataDontLoad = 3,

    NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
};

3. 刷新网页

//重新加载网页
 [webView reload]; 
 //无视缓存,重新加载服务器最新的网
 [webView reloadFromOrigin];

4. cookies管理

/**
 读取本地磁盘的cookies,包括WKWebview的cookies和sharedHTTPCookieStorage存储的cookies

@return 返回包含所有的cookies的数组;
当系统低于 iOS11 时,cookies 将同步NSHTTPCookieStorage的cookies,当系统大于iOS11时,cookies 将同步
*/
- (NSMutableArray *)WKSharedHTTPCookieStorage;

/**
 提供cookies插入,用于loadRequest 网页之前

@param cookie NSHTTPCookie 类型
 cookie 需要设置 cookie 的name,value,domain,expiresDate(过期时间,当不设置过期时间,cookie将不会自动清除);
 cookie 设置expiresDate时使用 [cookieProperties setObject:expiresDate forKey:NSHTTPCookieExpires];将不起作用,原因不明;使用 cookieProperties[expiresDate] = expiresDate; 设置cookies 设置时间。
*/
- (void)setCookie:(NSHTTPCookie *)cookie;

/** 删除单个cookie */
- (void)deleteWKCookie:(NSHTTPCookie *)cookie completionHandler:(nullable void (^)(void))completionHandler;
/** 删除域名下的所有的cookie */
- (void)deleteWKCookiesByHost:(NSURL *)host completionHandler:(nullable void (^)(void))completionHandler;

/** 清除所有的cookies */
- (void)clearWKCookies;

5. 添加JS调用Native的交互事件

/* messageHander实现JS调用Native */
- (void)addMessageHander
{
   //注入交互事件,实现 PAWKScriptMessageHandler 代理
    [webView addScriptMessageHandlerWithName:@[@"AliPay",@"weixin"]];

   //通过block的形式实现
    [webView addScriptMessageHandlerWithName:@[@"AliPay",@"weixin"] observeValue:^(WKUserContentController *userContentController, WKScriptMessage *message) {

       //JS调用OC处理
       NSLog(@"name:%@;body:%@",message.name,message.body);
    }];
}

/* 实现 PAWKScriptMessageHandler 代理 */
- (void)PAUserContentController: (WKUserContentController *) userContentController  didReceiveScriptMessage:(WKScriptMessage *)message{

       //JS调用OC处理 
        NSLog(@"name:%@;body:%@",message.name,message.body);
}

6. Native调用JS

 //方式一、
   [[PAWebView shareInstance] callJS:@"alert('调用JS成功')"];
 //方式二、
   [[PAWebView shareInstance] callJS:@"alert('调用JS成功')" handler:^(id response, NSError *error) {
        NSLog(@"调用js回调事件");
   }];

7. 监听二维码的识别数据

 //二维码识别后返回的二维码数据
   [webView notificationInfoFromQRCode:^(NSString *info) {  
        NSLog(@"二维码数据:%@",info);   
    }];

8. 缓存管理

 /** 清除所有缓存(cookie除外) */
- (void)clearWebCacheFinish:(void(^)(BOOL finish,NSError *error))block;

PAWebView 实现过程请查看 demo
CSDN下载地址:http://download.csdn.net/download/llyouss/10197978
github地址:https://github.com/llyouss/PAWeView

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容