iOS-PAWebVIew基于WKWebView封裝的框架

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下載請點擊這里。

架構導圖

image

1. cookies的同步

image
  • 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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 前言 關于UIWebView的介紹,相信看過上文的小伙伴們,已經(jīng)大概清楚了吧,如果有問題,歡迎提問。 本文是本系列...
    CoderLF閱讀 9,349評論 2 12
  • 前言 關于UIWebView的介紹,相信看過上文的小伙伴們,已經(jīng)大概清楚了吧,如果有問題,歡迎提問。 本文是本系列...
    Dark_Angel閱讀 29,506評論 67 291
  • 通過學習,你將會學習以下幾個方面的內容: **什么是WKWebView以及它和UIWebView的區(qū)別是什么 **...
    SOI閱讀 11,975評論 18 42

友情鏈接更多精彩內容