精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

av网站在线播放| www.av成人| 欧美天堂视频| 国产精品美女一区二区三区| 92看片淫黄大片欧美看国产片| 国产免费无码一区二区视频| 日韩伦理一区二区三区| 欧美日韩久久久| 一卡二卡三卡视频| 国外av在线| 国产成人精品1024| 国产精品久久久久久av下载红粉 | 开心久久婷婷综合中文字幕| 一区二区在线观看av| 久久久综合香蕉尹人综合网| 国产精品高潮呻吟av| 亚洲一区二区三区高清| 久久天天躁日日躁| a级大片在线观看| 日韩欧美一级| 欧美日韩午夜在线| 日本wwww视频| 久久久久黄久久免费漫画| 中文字幕的久久| 久久婷婷开心| 午夜精品久久久久久久99| 巨乳诱惑日韩免费av| 久久免费国产视频| 91麻豆免费视频网站| 国产精品嫩草影院在线看| 亚洲第一精品夜夜躁人人爽| 激情图片中文字幕| 国产69精品久久久久9999人| 欧美性猛交xxxx免费看久久久| 91制片厂免费观看| 在线视频1区2区| 久久久久久电影| 久久久久资源| 五月婷婷久久久| 国产一区二区三区在线观看免费 | 亚洲网在线观看| 精品国产人妻一区二区三区| 88久久精品| 日韩一区二区三区视频在线 | 男同互操gay射视频在线看| av小片在线| 国产精品毛片高清在线完整版| 欧美中文娱乐网| 欧美成人免费| 26uuu国产电影一区二区| 国产专区一区二区三区| 懂色av一区二区三区四区| 国产成人精品午夜视频免费| 91成人免费视频| 国产黄色片免费观看| 国产一区二区不卡在线| 亚洲最大av在线| 精品国产99久久久久久宅男i| 国产一区二区成人久久免费影院 | 欧美中文字幕一区二区| 亚洲人成网在线播放| 欧洲女同同性吃奶| 欧美艳星介绍134位艳星| 最近2019中文字幕第三页视频| 妖精视频在线观看免费| 91视频精品| 久久99热精品这里久久精品| 久久亚洲AV无码| 亚洲深夜激情| 国产精品久久久久7777婷婷| 在线黄色av网站| 国产中文字幕精品| 国产精品一区二区欧美黑人喷潮水| 少妇高潮一区二区三区99小说 | 黄色录像a级片| 国产不卡一二三区| 久久天天躁夜夜躁狠狠躁2022| 国产女人被狂躁到高潮小说| 亚洲啪啪91| 国产成人精品在线| 艳妇乳肉豪妇荡乳av| 国产资源在线一区| 精品在线不卡| 在线观看免费网站黄| 一区二区三区四区视频精品免费| 丝袜人妻一区二区三区| 亚洲成av在线| 日韩午夜精品视频| 香蕉视频黄色在线观看| 久久精品国产99久久| 欧美精品videosex性欧美| 国产一级淫片a视频免费观看| 蜜桃av一区二区三区电影| 成人高清在线观看| 国产一级二级三级在线观看| 亚洲码国产岛国毛片在线| 无码人妻丰满熟妇区96| 青青久久精品| 日韩成人在线播放| 色哟哟一一国产精品| 亚洲国产专区| 成人网在线视频| 你懂的在线观看视频网站| 亚洲人成伊人成综合网小说| 久久9精品区-无套内射无码| 欧美视频二区欧美影视| 国产一区二区动漫| 日韩av女优在线观看| 日本aⅴ亚洲精品中文乱码| 国产精品免费视频一区二区| 91av资源在线| 欧美午夜性色大片在线观看| 亚洲热在线视频| 欧美日韩第一| 97国产精品人人爽人人做| 国产一区二区自拍视频| 国产偷国产偷精品高清尤物| 成人免费在线网| 欧美国产亚洲精品| 深夜福利一区二区| 无码日韩精品一区二区| 99久久99久久精品国产片果冻| 色撸撸在线观看| av成人免费| 亚洲视频第一页| 性无码专区无码| 国产一区二区免费在线| 亚洲一区二区在线免费观看| 毛片无码国产| 日韩精品在线免费播放| 国产无套粉嫩白浆内谢| 国产成人精品午夜视频免费| 黄色网络在线观看| 久久久久久久性潮| 在线性视频日韩欧美| 日韩美一区二区| 久久影院视频免费| 黄色片视频在线免费观看| 久久精品凹凸全集| 亚州国产精品久久久| 粉嫩av一区二区夜夜嗨| 夜夜嗨av一区二区三区中文字幕| 999久久久精品视频| 忘忧草精品久久久久久久高清| 国产精品女人久久久久久| 国产精品秘入口| 欧美丝袜自拍制服另类| 日本理论中文字幕| 蜜桃av一区二区在线观看| 亚洲高清视频一区| 欧美a一级片| 久久激情视频免费观看| 伊人亚洲综合网| 国产精品国产精品国产专区不蜜| 91制片厂毛片| 99久久99热这里只有精品 | 夜夜躁狠狠躁日日躁av| 亚洲天堂久久久久久久| 久久艹这里只有精品| 欧美激情1区2区| 国产欧美日韩一区| 69久成人做爰电影| 一区二区成人精品| 国产免费无遮挡| 亚洲夂夂婷婷色拍ww47| 久久人人爽人人人人片| 可以看av的网站久久看| 99亚洲精品视频| 超碰成人在线观看| 国产91精品网站| 一区二区三区视频网站| 日韩一区二区在线观看视频 | 黄大色黄女片18免费| 狠狠久久亚洲欧美| r级无码视频在线观看| 99se婷婷在线视频观看| 国产精欧美一区二区三区蓝颜男同| 亚洲日韩欧美视频| 97在线播放免费观看| 亚洲成年人网站在线观看| 一级片手机在线观看| 免费的成人av| 欧日韩免费视频| 大片网站久久| 国产精品制服诱惑| 久久久成人av毛片免费观看| 欧美精品在线免费| 男人的天堂在线免费视频| 欧美三级中文字幕| 黄色激情视频在线观看| 国产亚洲女人久久久久毛片| 日本少妇xxx| 水野朝阳av一区二区三区| 秋霞在线一区二区| 亚洲桃色综合影院| 亚洲最大av网站| 日本精品另类| 98视频在线噜噜噜国产| 天堂地址在线www| 日韩av中文字幕在线播放| 97人妻精品一区二区三区动漫| 精品美女久久久久久免费| 蜜桃av.com| 久久综合九色综合欧美亚洲| 国产男女无遮挡猛进猛出| 麻豆九一精品爱看视频在线观看免费| 在线一区亚洲| 国产欧美日韩在线观看视频| 国产精品一区二区三区在线| 国产在线一区不卡| 国产精品av在线播放| 91制片在线观看| 久久电影一区二区| 成人免费黄色网页| 国产视频精品va久久久久久| 亚洲va天堂va欧美ⅴa在线| 欧美日韩你懂得| 精产国品一区二区| 天天影视涩香欲综合网| 欧美人与禽zozzo禽性配| 国产精品伦理在线| 少妇av片在线观看| 久久天天做天天爱综合色| 黄色激情在线观看| 久久99在线观看| 天天插天天操天天射| 石原莉奈在线亚洲二区| 日本www在线播放| 99国产精品久久久久久久成人热| 乱子伦一区二区| 亚洲成人免费| 中文字幕久久综合| 欧美激情成人| 亚洲三区视频| 91视频综合| 亚洲一区二区三区色| 欧美午夜精彩| 亚洲激情一区二区| re久久精品视频| 色中色综合成人| 欧美限制电影| 中文字幕免费在线不卡| 成人午夜av| 一区国产精品| 夜间精品视频| 奇米777四色影视在线看| 欧美在线黄色| 国产肉体ⅹxxx137大胆| 精品99视频| 欧美色图另类小说| 欧美亚洲专区| 黄色片视频在线| 久久99国产精品免费| 成人不卡免费视频| 国产精品自拍三区| 91传媒理伦片在线观看| av成人老司机| 久久久久久久毛片| 国产精品久久免费看| 欧美丰满熟妇bbbbbb| 夜夜揉揉日日人人青青一国产精品| 一区二区三区免费高清视频| 午夜电影久久久| 日本久久综合网| 欧美日韩夫妻久久| 精品人妻一区二区三区三区四区 | 日韩视频精品在线观看| 漂亮人妻被中出中文字幕| 日韩二区三区四区| 国产精品igao网网址不卡| 成人性生交大合| 国产精品久久久久无码av色戒| 国产精品视频一区二区三区不卡| 国产真实乱在线更新| 香蕉久久一区二区不卡无毒影院| 人妻 日韩精品 中文字幕| 欧美少妇一区二区| 成人av一区二区三区在线观看 | 91在线播放国产| 久久99精品久久久久久欧洲站| 欧洲一区二区在线| 亚洲国产日韩欧美在线| 欧洲黄色一级视频| 精品一区二区在线观看| 日本三级日本三级日本三级极| 国产日韩欧美麻豆| 精品爆乳一区二区三区无码av| 中文字幕综合| 亚洲综合国产| 苍井空浴缸大战猛男120分钟| 精品亚洲国内自在自线福利| 亚洲一区二区三区四区av| 国产精品三级在线观看| 国产在线拍揄自揄拍| 欧美在线播放高清精品| 亚洲男人第一天堂| 中文字幕日韩综合av| 国产ktv在线视频| 成人精品久久av网站| 最新亚洲精品| 大荫蒂性生交片| 久久国产精品99精品国产| 色婷婷免费视频| 亚洲乱码国产乱码精品精98午夜| 国产精品久免费的黄网站| 日韩情涩欧美日韩视频| www.在线播放| 68精品久久久久久欧美| 欧美区一区二区| 亚洲一区二区三区涩| 裸体一区二区| 国产精品无码一区二区三区免费| 中文字幕中文字幕在线一区 | 欧洲美一区二区三区亚洲| 一区二区三区蜜桃网| 一级欧美一级日韩| 亚洲免费精彩视频| 99热99re6国产在线播放| 亚洲伊人久久大香线蕉av| 第四色成人网| 国产wwwxx| 久久精品一区四区| 日本中文字幕第一页| 亚洲第一区在线| 青春草视频在线观看| 亚洲一区二区三区sesese| 久久中文字幕二区| 蜜臀视频一区二区三区| 久久综合色之久久综合| 久久国产精品系列| 亚洲第一精品久久忘忧草社区| 牛牛精品视频在线| 国产成人亚洲欧美| 欧美激情亚洲| 老熟女高潮一区二区三区| 亚洲色图都市小说| 97精品人妻一区二区三区| 综合久久五月天| 玖玖精品在线| 一区二区三区四区不卡| 久久精品国产亚洲aⅴ | 婷婷综合伊人| 一区二区三区国产好的精华液| 国产精品毛片无遮挡高清| 一区二区的视频| 久久久精品美女| 日本一区二区三区播放| 国产精品久久成人免费观看| 韩国欧美国产1区| 男人的天堂久久久| 日韩精品一区二区三区swag | 亚欧美无遮挡hd高清在线视频 | 91专区在线观看| 91丝袜美腿高跟国产极品老师| www.毛片.com| 国产一区二区三区在线观看网站 | 3d成人h动漫网站入口| 黄av在线播放| 成人自拍偷拍| 一区二区三区四区五区精品视频| 青青草成人免费视频| 一本大道av伊人久久综合| 成年人视频网站在线| 91精品在线国产| 激情国产一区| 色噜噜日韩精品欧美一区二区| 欧美日韩中文字幕精品| mm1313亚洲国产精品美女| 国产精品一区二区三区四区五区| 国产精品一国产精品k频道56| 国产成人一区二区在线观看| 欧美一区二区三区视频免费播放| 九色91在线| 日韩免费中文专区| 国产一区二区三区在线观看精品 | 国产日韩欧美高清免费| 变态另类ts人妖一区二区| 这里只有精品电影| 国产精选在线| 神马影院一区二区三区| 国产精品资源在线| 一区二区三区福利视频| 精品国产欧美一区二区三区成人| 国产在线不卡一区二区三区| 六月丁香婷婷激情| √…a在线天堂一区| 人妻少妇一区二区三区| 国产精品久久久久久久久久新婚 | 精品视频黄色| 亚洲少妇一区二区| 欧洲一区在线电影| 欧美xxx黑人xxx水蜜桃| 色综合666| av激情亚洲男人天堂| 91在线精品入口| 国内精品国产三级国产在线专| 青青草国产成人a∨下载安卓| 亚洲美女在线播放| 欧美日韩国产大片| 亚洲精品mv|