PAWebView
PAWebView 之 cookie 管理與同步;
PAWebView 之長按手勢;
PAWebView 之POST請求;
一. 前言
???????HybirdApp極速業(yè)擴展,低成本,高效率,跨平臺,靈活易用,規(guī)避審核等特性深受各種平臺青睞,尤其最近幾年流行的響應式設計,HybirdApp都發(fā)揮淋漓盡致。如淘寶、美團、支付寶、微信都使用HybirdApp的開發(fā)模式來極速擴展業(yè)務,如支付寶和微信的支付業(yè)務、公眾號、城市服務等。
???????HybirdApp開發(fā)主要框架有WKWebVie、UIWebView。
二. WKWebVIew介紹
???????UIWebView自iOS2推出,但該框架存在笨重臃腫,內存占用過高,加載速度慢等詬病,iOS8蘋果公司推出WKWebView代替UIWebView。目前的iOS版本兼容基本已經(jīng)拋棄了iOS7,WKWebView的優(yōu)勢越發(fā)明顯。
1. WKWebView特點
優(yōu)點:
- 高性能,60fps的滾動刷新貞率,頁面加載速度有所提升
- 低內存,內存占用為UIWebView的1/4~1/3
- 穩(wěn)定,長期使用性能指標基本穩(wěn)定
- 易用,messageHandler的應用,豐富的手勢識別,進度條監(jiān)聽(estimatedProgress)等新功能
- WKNavigationDelegate代理功能的細化。
- 與Safari相同的JavaScript引擎
- 支持更多的HTML5特性
缺點:
- iOS9之前不支持頁面緩存管理
- 無法發(fā)送post請求
- NSProtocal的重寫與WKNavigationDelegate沖突
- 版本迭代
2. WKWebView結構
image
三. PAWebView封裝
???????PAWebView是基于WKWebView的封裝,實現(xiàn)了JS+Native的調用,常見的網(wǎng)頁和客戶端處理,支持的系統(tǒng)iOS8以上以上。
???????github下載請點擊這里。
架構導圖
1. cookies的同步
iOS11之前通過NSURLRequest手動插入cookies,其需分別兼容PHP和JS兩種網(wǎng)頁。
iOS11推出WKHTTPCookieStore,其與NSHTTPCookieStorage的機制類似。
磁盤獨立緩存WKWebView訪問產(chǎn)生的或手動插入的cookies,當需同步cookies時,PAWebView將分別同步了磁盤和NSHTTPCookieStorage的cookies。
2. Native與JS交互
- JS通過WKScriptMessageHandler協(xié)議調用Native,WKScriptMessageHandler的使用非常的簡單易用。
- OC通過腳本注入的方式調用JS(evaluateJavaScript)。
3. 兼容POST請求
- 重寫loadRequest方法。
4. 緩存管理
- 沿用NSURLRequest緩存機制 NSURLRequestCachePolicy。
- Cookies 緩存。
- 緩存的清除。
5. 手勢功能
- 通過簡本注入的方式處理網(wǎng)頁元素。
- 抓取網(wǎng)頁圖片
- 識別二維碼
- 抓取網(wǎng)頁元素鏈接
- 抓取文本信息
四. PAWebView使用
PAWebView demo下載地址http://download.csdn.net/download/llyouss/10197978
1. 導入PAWebView
#import "PAWebView.h"
2. 使用vc加載網(wǎng)頁
//初始化單例
PAWebView *webView = [PAWebView shareInstance];
//加載網(wǎng)頁
[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, //忽略緩存,從服務端加載數(shù)據(jù);
NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
NSURLRequestReturnCacheDataElseLoad = 2,
NSURLRequestReturnCacheDataDontLoad = 3,
NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
};
3. 刷新網(wǎng)頁
//重新加載網(wǎng)頁
[webView reload];
//無視緩存,重新加載服務器最新的網(wǎng)
[webView reloadFromOrigin];
4. cookies管理
/**
讀取本地磁盤的cookies,包括WKWebview的cookies和sharedHTTPCookieStorage存儲的cookies
@return 返回包含所有的cookies的數(shù)組;
當系統(tǒng)低于 iOS11 時,cookies 將同步NSHTTPCookieStorage的cookies,當系統(tǒng)大于iOS11時,cookies 將同步
*/
- (NSMutableArray *)WKSharedHTTPCookieStorage;
/**
提供cookies插入,用于loadRequest 網(wǎng)頁之前
@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實現(xiàn)JS調用Native */
- (void)addMessageHander
{
//注入交互事件,實現(xiàn) PAWKScriptMessageHandler 代理
[webView addScriptMessageHandlerWithName:@[@"AliPay",@"weixin"]];
//通過block的形式實現(xiàn)
[webView addScriptMessageHandlerWithName:@[@"AliPay",@"weixin"] observeValue:^(WKUserContentController *userContentController, WKScriptMessage *message) {
//JS調用OC處理
NSLog(@"name:%@;body:%@",message.name,message.body);
}];
}
/* 實現(xiàn) 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. 監(jiān)聽二維碼的識別數(shù)據(jù)
//二維碼識別后返回的二維碼數(shù)據(jù)
[webView notificationInfoFromQRCode:^(NSString *info) {
NSLog(@"二維碼數(shù)據(jù):%@",info);
}];
8. 緩存管理
/** 清除所有緩存(cookie除外) */
- (void)clearWebCacheFinish:(void(^)(BOOL finish,NSError *error))block;
PAWebView 實現(xiàn)過程請查看 demo
CSDN下載地址:http://download.csdn.net/download/llyouss/10197978
github地址:https://github.com/llyouss/PAWeView