精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我是如何一步一步實現網頁離線緩存的?

移動開發
一個Hybrid APP,如何做離線緩存策略?也可以簡單來說,你的APP只是一個殼,里面真正加載的內容是H5,如果優化加載內容的速度?

一個Hybrid APP,如何做離線緩存策略?也可以簡單來說,你的APP只是一個殼,里面真正加載的內容是H5,如果優化加載內容的速度?

先了解一下NSURLProtocol

從面意思看它是一個協議,但是它其實是一個類,而且繼承自NSObject。它的作用是處理特定URL協議的加載。它本身是一個抽象類,提供了使用特性URL方案處理URL的基礎結構。你可以自己創建NSURLProtocol的子類,來讓自己的應用支持自定義的協議或者URL方案。

我是如何一步一步實現網頁離線緩存的?

應用程序永遠不需要直接實例化一個NSURLProtocol子類。當一個下載開始的時候,系統創建一個合適的protoco對象來響應URL請求。你要做的就是自己定義一個你自己的protocol,然后在APP啟動的時候調用registerClass:,讓系統知道你的協議。

這里需要注意:你不能在watchOS 2以及更高版本中自定義URL scheme和協議。

為了支持特定的自定義請求,你***定義NSURLRequest 或者NSMutableURLRequest。讓自定義的這些對象來實現請求,這里需要使用NSURLProtocol的propertyForKey:inRequest:和setProperty:forKey:inRequest,然后你可以自定義NSURLResponse類來模擬返回信息。

接下來就開始對UIWebView進行離線緩存處理。

UIWebView的離線緩存處理

首先,我們需要自定義一個NSURLProtocol的子類,并且在AppDelegate.m的

 

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
  2.     [NSURLProtocol registerClass:[ZGURLProtocol class]]; 
  3.     return YES; 

注冊。接下來的所有操作就都是在我們自定義的ZGURLProtocol中操作了。先看一下registerClass的作用:

嘗試注冊一個NSURLProtocol的子類,使其對 URL Loading System 可見。這里的URL Loading System就是一組類和協議,允許你的應用程序訪問由URL產生的內容,比如請求、接收內容和Cache等。當URL Load System開始加載一個請求的時候,每個注冊的協議類都被依次去調用,以確定是否可以用指定的請求去初始化它。首先被調用的方法是:

  1. + (BOOL)canInitWithRequest:(NSURLRequest *)request; 

在該方法里面進行緩存過濾,比如你想只緩存js,那么判斷request的path的后綴,如果是js,就返回YES,否則返回NO。

如果返回YES,那么就相當于該請求被自定義的URLProtocol來處理,這里不能保證所有的注冊的NSURLProtocol都能被處理到。如果你定義了多個NSProtocol子類,這些子類將會以相反的順序調用。也就是說如果你是這樣寫的:

 

  1. [NSURLProtocol registerClass:[ZGURLProtocol class]];  
  2. [NSURLProtocol registerClass:[ZProtocol class]]; 

那么***執行的是ZProtocol,如果參initWithRequest:返回的為YES,則請求由ZProtocol進行處理,且不會再走ZGURLProtocol。如果ZProtocol的initWithRequest:返回的為NO,則請求繼續向下傳遞由其他的NSURLProtocol子類處理。

一旦返回YES,那么請求將會由自己寫的子類處理,首先會調用:

  1. + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request 

這個是一個抽象的方法,子類必須對其實現。通常情況下,我們一般都是直接返回request,但是這里你也可以直接修改此request,包括header,hosts等。可以對指定request進行重定向操作。

在這里,我們只是將現有的request進行返回即可。

緊接著,便會開始請求:

  1. - (void)startLoading; 

該方法的作用就是開始請求protocol指定的請求。該方法也是protocol子類必須實現的方法。在這里所做的操作就是:

先判斷是否有緩存數據,如果有,則自己創建NSURLResponse,然后將緩存數據放入,并進行client的一些操作,然后返回;如果沒有緩存數據,則新建一個NSURLConnection,然后發送請求。

先說一下有緩存的情況下:

 

  1. if (model.data && model.MIMEType) { 
  2.         NSURLResponse *response = [[NSURLResponse alloc] initWithURL:self.request.URL MIMEType:model.MIMEType expectedContentLength:model.data.length textEncodingName:nil]; 
  3.         [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed]; 
  4.         [self.client URLProtocol:self didLoadData:model.data]; 
  5.         [self.client URLProtocolDidFinishLoading:self]; 
  6.         return
  7.     } 

(model是緩存數據)有緩存的情況下,直接使用緩存的數據和MIME類型,然后構建NSURLResponse,然后通過協議client調用代理方法。這里的client是一個protocol,如下:

 

  1. @protocol NSURLProtocolClient <NSObject>  
  2. - (void)URLProtocol:(NSURLProtocol *)protocol wasRedirectedToRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse; 
  3. - (void)URLProtocol:(NSURLProtocol *)protocol cachedResponseIsValid:(NSCachedURLResponse *)cachedResponse;  
  4. - (void)URLProtocol:(NSURLProtocol *)protocol didReceiveResponse:(NSURLResponse *)response cacheStoragePolicy:(NSURLCacheStoragePolicy)policy; 
  5. - (void)URLProtocol:(NSURLProtocol *)protocol didLoadData:(NSData *)data;  
  6. - (void)URLProtocolDidFinishLoading:(NSURLProtocol *)protocol;  
  7. - (void)URLProtocol:(NSURLProtocol *)protocol didFailWithError:(NSError *)error;  
  8. - (void)URLProtocol:(NSURLProtocol *)protocol didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;  
  9. - (void)URLProtocol:(NSURLProtocol *)protocol didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;  
  10. @end 

該協議提供了NSURLProtocol子類與URL Loading System進行溝通的接口。一個APP一定不要去實現這個協議。有緩存的情況下調用回調方法,然后進行處理。

在沒有緩存的情況下:

實例化一個connection,然后發起請求。在我們收到response的時候:

 

  1. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
  2.     self.responseData = [[NSMutableData alloc] init]; 
  3.     self.responseMIMEType = response.MIMEType; 
  4.     [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; 

緊接著就是接收數據:

 

  1. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
  2.     [self.responseData appendData:data]; 
  3.     [self.client URLProtocol:self didLoadData:data]; 

接收完數據之后便調用了:

 

  1. - (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
  2.     ZGCacheModel *model = [ZGCacheModel new]; 
  3.     model.data = self.responseData; 
  4.     model.MIMEType = self.responseMIMEType; 
  5.     [self setMiType:model.MIMEType withKey:[self.request.URL path]];//userdefault存儲MIMEtype 
  6.      
  7.      
  8.     [[ZGUIWebViewCache sharedWebViewCache] setCacheWithKey:self.request.URL.absoluteString value:model]; 
  9.    
  10.     [self.client URLProtocolDidFinishLoading:self]; 

這個方法是結束家在之后的調用,我們需要在這里將請求過來的數據進行緩存。這樣我們本地就有了指定URL的返回數據。

這里還有一個重要的東西沒有介紹,那就是

 

  1. [NSURLProtocol propertyForKey:ZGURLProtocolKey inRequest:request]  
  2. [NSURLProtocol setProperty:@YES forKey:ZGURLProtocolKey inRequest:mutableRequest]; 

這里的

  1. + (void)setProperty:(id)value forKey:(NSString *)key inRequest:(NSMutableURLRequest *)request; 

作用是在指定的請求中設置與特定的鍵值相關聯。防止多次調用一個request。

這樣,我們就完成了UIWebView的離線緩存。在這里我封裝了一個 ZGUIWebViewCache 。感興趣的可以看一下。

WKWebView的離線緩存處理

WKWebView離線緩存和UIWebView緩存類似,只不過使用WKWebView除了一開始調用一下NSURLProtocol的canInitWithRequest:方法之后,之后的請求似乎就和NSURLProtocol完全無關了,網上都說WKWebView的請求是在獨立的進程里,所以不走NSURLProtocol。這里是通過NSURLProtocol+WKWebView類進行處理的,詳情可參見: ZGWKWebViewCache 。

剩下的處理過程就和UIWebView緩存處理類似了。

以上便是對網頁離線緩存的實現。

責任編輯:未麗燕 來源: 張貴的站點
相關推薦

2017-07-15 21:10:58

CTOCEO技術

2012-03-22 10:33:33

思杰XenDesktop

2022-08-29 15:19:09

CSS煙花動畫

2020-05-07 09:25:20

數據庫MySQL代碼

2020-02-20 19:34:24

JAVAMySQL框架

2022-09-30 15:37:19

Web網站服務器

2011-06-07 16:03:48

匿名SQL Server

2018-03-07 15:24:41

PythonMySQL

2009-07-06 19:29:37

云計算私有云服務器虛擬化

2017-08-24 08:31:41

2017-09-28 09:40:36

圖像分類準確率

2013-03-18 16:09:27

JavaEEOpenfire

2024-07-22 11:43:28

LVMPnetLab網絡

2021-03-17 07:07:21

系統程序員SDI

2020-10-28 15:03:25

C+代碼開發

2020-02-26 08:00:02

14點遭遇真兇

2010-07-12 17:10:23

Android應用程序

2019-11-04 10:06:19

MySQL索引

2009-12-18 16:27:43

Cisco路由器配置

2018-07-13 15:36:52

點贊
收藏

51CTO技術棧公眾號

亚洲成人激情在线观看| 国产精品久久久久永久免费观看| 欧美老女人性生活| 一区二区不卡免费视频| 亚洲爱爱视频| 亚洲综合激情小说| 午夜久久资源| 欧美熟妇乱码在线一区 | 日韩国产一级片| 久草在线青青草| 国产 欧美在线| 国产精品www网站| 国产精品99精品| 久久在线视频免费观看| 亚洲精品大尺度| 亚洲第一成肉网| 电影网一区二区| 亚洲精品久久久蜜桃| 欧美激情www| www日本高清| 奇米888四色在线精品| 97在线视频一区| 澳门黄色一级片| 精品美女久久| 日韩av网址在线| 日批视频免费看| 亚洲伊人精品酒店| 在线精品视频一区二区三四| 2018日日夜夜| 青青草原av在线| 亚洲男人天堂av| 色噜噜色狠狠狠狠狠综合色一| 嫩草影院一区二区| 国产成人久久精品77777最新版本| 国产精品视频专区| 神马久久久久久久| 西西人体一区二区| 欧美亚洲国产视频| 日韩av无码中文字幕| 91精品久久久久久久蜜月| 中文字幕欧美国内| 受虐m奴xxx在线观看| 欧美人成在线观看ccc36| 日韩写真欧美这视频| 亚洲xxx在线观看| 日韩美香港a一级毛片| 欧美三级视频在线播放| 黄色三级视频在线| av一区在线播放| 欧美性色aⅴ视频一区日韩精品| 欧美精品一区免费| 欧美一级大黄| 欧美亚洲一区三区| 一本一道久久a久久综合蜜桃| 国产亚洲精彩久久| 91精品视频网| 麻豆传媒在线看| 91夜夜蜜桃臀一区二区三区| 亚洲第五色综合网| 亚洲人人夜夜澡人人爽| 狠狠综合久久av一区二区蜜桃| 亚洲欧美另类在线观看| a级在线免费观看| 色999日韩| 久久精品国产综合| 久久免费精彩视频| 亚洲另类黄色| 国产精品老女人精品视频| 中文字幕在线观看国产| 黄色日韩网站视频| 国产高清自拍99| 青青草在线免费视频| 国产午夜精品一区二区| 亚洲一区美女| 欧美寡妇性猛交xxx免费| 五月婷婷久久综合| 91淫黄看大片| 亚洲精品在线国产| 亚洲欧美制服第一页| 国产又粗又长又硬| 国产精品vip| 国产成人短视频| 99热这里是精品| 99re热视频这里只精品| 亚洲精品日韩在线观看| 在线观看h网| 欧美日韩在线视频观看| 无需播放器的av| 成人直播在线观看| 亚洲最新av在线网站| 国产真实乱在线更新| 在线观看一区| 国产伦精品免费视频| 国产 日韩 欧美 综合| 国产拍揄自揄精品视频麻豆| 粉嫩av一区二区三区天美传媒| 亚洲黄色中文字幕| 日韩一区二区三区在线| 一道本在线观看| 欧美在线二区| 国产精品第一页在线| 国产福利小视频| 日本一区二区三区高清不卡| 妺妺窝人体色www看人体| 欧美动物xxx| 欧美不卡一区二区三区| 久久久久久国产免费a片| 国户精品久久久久久久久久久不卡| 国产成人精品午夜| 亚洲精品一区二区三区四区 | 国产精品成人69xxx免费视频| 亚洲激情av| 成人网在线观看| 国产中文字幕在线观看| 亚洲成在人线在线播放| 欧美激情第3页| 国产精品一在线观看| 欧美丰满少妇xxxxx| 在线视频播放大全| 久久久久国产免费免费 | 中文字幕av免费在线观看| 日韩电影在线免费观看| 精品欧美一区二区精品久久| 少妇视频在线| 欧美一区二区在线播放| 99re6热在线精品视频| 久久久人人人| 久久一区二区精品| 爱看av在线| 精品国产一区二区三区不卡| 老熟妇高潮一区二区三区| 丝袜美腿亚洲色图| 久久久久久久久一区| av电影院在线看| 欧美成人女星排名| 欧美日韩在线视频免费| 国产一区在线看| 欧美h视频在线观看| 国产精品原创视频| 中文字幕亚洲欧美日韩2019| 一级黄色在线视频| wwwwxxxxx欧美| 国产精品后入内射日本在线观看| 国产精品115| 高清亚洲成在人网站天堂| 黄色小视频免费观看| 亚洲综合视频网| 在线播放第一页| 在线电影一区| 久久亚洲国产精品日日av夜夜| 男人av在线播放| 亚洲免费一在线| 欧美黄色一级大片| 欧美激情综合五月色丁香| 五月婷婷之综合激情| 红桃成人av在线播放| 国产精品久久中文| 黄色成年人视频在线观看| 欧美一区二区日韩| 精品无码一区二区三区电影桃花| 国产成人精品一区二区三区网站观看 | 欧美中文字幕视频| 九色在线免费| 欧美日韩综合不卡| 免费麻豆国产一区二区三区四区| 成人国产精品免费观看动漫| 青青草成人免费在线视频| 欧美一级二级三级视频| 日本伊人精品一区二区三区介绍| 在线播放毛片| 日韩欧美一级二级三级久久久 | 色8久久人人97超碰香蕉987| 先锋影音av在线| 狠狠狠色丁香婷婷综合激情 | 黄色一级大片在线免费观看| 床上的激情91.| 亚洲人成无码www久久久| 欧美日韩中字| av一区和二区| 亚洲国产欧美日本视频| www.欧美精品一二三区| 亚洲av无码一区二区乱子伦| 午夜精品久久久久久久| 亚洲а∨天堂久久精品2021| 国精产品一区一区三区mba桃花| 99久久免费观看| 九九久久婷婷| 91文字幕巨乱亚洲香蕉| 在线免费看h| 超薄丝袜一区二区| 欧洲天堂在线观看| 欧美乱妇一区二区三区不卡视频| 国产主播在线播放| 国产精品午夜久久| 国产清纯白嫩初高中在线观看性色| 亚洲制服少妇| 福利在线小视频| 国产日产一区| 高清不卡日本v二区在线| 69堂免费精品视频在线播放| 欧美人交a欧美精品| 黄色片在线看| 精品福利二区三区| 91影院在线播放| 日韩欧美精品在线观看| 91视频青青草| 欧美国产精品专区| 国产精品伦子伦| 国产精品一区免费视频| 亚欧在线免费观看| 在线一区视频| 免费人成自慰网站| 香蕉av一区二区| 日韩中文不卡| 一本久久青青| 国产日韩在线一区二区三区| av在线成人| 国产精品偷伦免费视频观看的| 成人小电影网站| 午夜精品国产精品大乳美女| av免费看在线| 久久久成人的性感天堂| 国产区高清在线| 日韩高清中文字幕| 日韩一区二区三区在线观看视频| 欧美男女性生活在线直播观看| aaa人片在线| 婷婷综合另类小说色区| 久久免费播放视频| 亚洲影视在线播放| 福利所第一导航| 1区2区3区欧美| 疯狂撞击丝袜人妻| 中文字幕一区二区三区不卡在线| 国产一区二区三区四区在线| 久久久久久久久久久99999| av网站免费在线播放| 99精品黄色片免费大全| 毛茸茸free性熟hd| 成人免费看黄yyy456| 丰满熟女人妻一区二区三区| 国产suv精品一区二区6| 日批免费观看视频| 丁香五精品蜜臀久久久久99网站 | 亚洲妇女av| 日韩av不卡播放| 不卡视频在线| 国产又黄又爽免费视频| 欧美一区不卡| 男人添女人下部视频免费| 国产综合欧美| 欧美 日本 亚洲| 久久午夜av| 亚洲综合欧美激情| 精品一区中文字幕| 中文字幕一二三区| 成人精品免费网站| 久久久精品人妻无码专区| 久久精品在这里| 四虎影视一区二区| 一区二区三区美女| 国产成人在线观看网站| 在线国产电影不卡| 国产精品久久久久久69| 精品日韩在线观看| 天天干天天操av| 国产亚洲精品美女久久久久| 黄色动漫在线观看| 久久精品99国产精品酒店日本 | 黄色片中文字幕| 在线观看一区二区视频| 这里只有久久精品视频| 8v天堂国产在线一区二区| 国产三区在线播放| 亚洲高清av在线| 国产二区视频在线观看| 久久久国产精品一区| √天堂8资源中文在线| 国产精品久久久久久久久久新婚 | 免费在线一级片| 欧美视频二区36p| 国产一区二区在线视频聊天| 精品久久久网站| 成人在线观看黄色| 欧美黑人xxxx| h1515四虎成人| av一区二区在线看| 不卡在线一区二区| 国产中文字幕二区| 韩国一区二区三区| 黄瓜视频污在线观看| 亚洲色图制服丝袜| 亚洲va在线观看| 欧美一级高清大全免费观看| 欧美一区二区少妇| 久久99久久久久久久噜噜| 三上悠亚激情av一区二区三区| 亚洲自拍中文字幕| 日产午夜精品一线二线三线| 欧美 日韩 亚洲 一区| 激情久久五月天| 谁有免费的黄色网址| 亚洲高清久久久| 91亚洲国产成人精品一区| 亚洲精品中文字| 男男gaygays亚洲| 国产一区二区丝袜高跟鞋图片| 欧美激情极品| 国产激情片在线观看| 麻豆精品一区二区| 亚洲国产欧美视频| 亚洲成人动漫精品| a天堂视频在线| 最近中文字幕日韩精品 | 青青草国产成人av片免费| 大尺度在线观看| 综合精品久久久| 亚洲中文字幕一区二区| 亚洲欧美三级伦理| 毛片在线网站| 好吊色欧美一区二区三区四区| 在线观看国产精品入口| 一区二区三区 欧美| www久久精品| 欧美 日韩 精品| 日韩激情av在线播放| 女子免费在线观看视频www| 亚洲xxxx18| 亚洲成人三区| 午夜免费福利网站| 亚洲欧美日韩国产另类专区 | 亚洲欧美在线成人| 玛丽玛丽电影原版免费观看1977| 亚洲一级一区| 五月天激情小说| 精品国产福利视频| 日韩欧美亚洲系列| 97免费中文视频在线观看| 高清精品视频| 国精产品一区一区三区视频| 丁香另类激情小说| 日本高清www免费视频| 亚洲精品久久久久久久久久久久久| 波多野结衣在线高清| 国产原创精品| 亚洲欧美清纯在线制服| 日韩在线免费观看av| 91国内精品野花午夜精品| 精品久久av| 国产精品一区二区性色av | 国产精品qvod| 日本xxxxxxxxxx75| 91视频.com| 亚洲视频一区二区免费在线观看| 福利片一区二区三区| 欧美激情一区二区三区在线| 丁香社区五月天| 这里只有精品视频| 国产91欧美| 亚洲午夜精品国产| 国产综合色在线视频区| 精品无码在线视频| 一区二区三区四区视频精品免费| 国产v在线观看| 高清一区二区三区日本久| 色天下一区二区三区| 一本大道熟女人妻中文字幕在线| 久久综合99re88久久爱| 中文无码av一区二区三区| 久久影院在线观看| 国产成人一二| 亚洲精品视频导航| 亚洲黄色av一区| 天堂中文在线资| 国产剧情久久久久久| 午夜欧美理论片| 超碰97人人干| 69久久99精品久久久久婷婷| ririsao久久精品一区| 欧美日韩精品免费在线观看视频| 久久成人免费电影| 国产精品成人av久久| 亚洲欧美制服丝袜| 午夜视频在线观看精品中文| 日日鲁鲁鲁夜夜爽爽狠狠视频97| ●精品国产综合乱码久久久久| 人妻va精品va欧美va| 国产精品免费视频久久久| 欧美久久久久| www.黄色在线| 精品久久久久香蕉网| 日韩一级二级| 成年人看的毛片| 国产精品久久久一区麻豆最新章节| 日批视频免费播放| 国产视频福利一区| 模特精品在线| 国产一级视频在线观看| 最近中文字幕日韩精品| 天天躁日日躁狠狠躁欧美|