成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS UIWebView URL攔截

移動開發 iOS
譯者在做app開發時,因為頁面的javascript文件比較大導致加載速度很慢,所以想把javascript文件打包在app里,當UIWebView需要加載該腳本時就從app本地讀取,但UIWebView并不支持加載本地資源。

譯者在做app開發時,因為頁面的javascript文件比較大導致加載速度很慢,所以想把javascript文件打包在app里,當UIWebView需要加載該腳本時就從app本地讀取,但UIWebView并不支持加載本地資源。***從下文中找到了解決方法,***次翻譯,難免有誤,大家多多指教。

iCab Mobile(一款iOS平臺的網頁瀏覽器)要實現一個攔截管理器來過濾頁面上的廣告及其他東西。它有一個簡單的基于URL過濾規則的列表(通常由用戶維護),當頁面包含的資源(圖片、js以及css等),文件的URL存在于規則列表中時,資源就不會被加載。

但看一下UIWebView類的API,會發現我們沒有辦法知道UIWebView正在加載什么資源,更糟的是,當你希望過濾掉某些資源文件的時候,沒有方法可以強制UIWebView不去加載這些文件,

攔截器看起來貌似沒有可能實現。

當然還是有解決方案的,否則這篇文件就沒什么卵用。

正如上面所說,實現攔截器不能靠UIWebView,因為UIWebView沒有提供任何有用的API。

對UIWebView的所有請求,要找到一個能中斷所有HTTP 請求的切入點,我們需要先了解一下Cocoa的URL Loading System,因為UIWebView是使用URL Loading System從web端取數據的。我們需要的切入點NSURLCache類就是URL Loading System的一部分。雖然目前iOS系統不會在磁盤上緩存任何數據(后面的iOS系統版本或許會有不同),因此在UIWebView開始加載前,NSURLCache管理的緩存數據通常為空,但UIWebView仍然會檢測所請求資源文件是否存在于緩存。所以我們需要做的只是繼承NSURLCache并重載其方法:
 

  1. - (NSCachedURLResponse*)cachedResponseForRequest:(NSURLRequest*)request 

UIWebView請求所有資源時都會調用這個方法。因為我們只需要在這個方法里判斷請求的URL是否是我們想攔截的。如果是則創建一個沒有內容的假response,否則只需調用super方法即可。

如下是實現細節:

1.繼承NSURLCache:

FilteredWebCache.h:

  1. @interface FilteredWebCache : NSURLCache 
  2. @end 

子類的主要代碼

FilteredWebCache.m:

  1. #import "FilteredWebCache.h" 
  2. #import "FilterManager.h" 
  3. @implementation FilteredWebCache 
  4. - (NSCachedURLResponse*)cachedResponseForRequest:(NSURLRequest*)request 
  5. NSURL *url = [request URL]; 
  6. BOOL blockURL = [[FilterMgr sharedFilterMgr] shouldBlockURL:url]; 
  7. if (blockURL) { 
  8. NSURLResponse *response = 
  9. [[NSURLResponse alloc] initWithURL:url 
  10. MIMEType:@"text/plain" 
  11. expectedContentLength:1 
  12. textEncodingName:nil]; 
  13. NSCachedURLResponse *cachedResponse = 
  14. [[NSCachedURLResponse alloc] initWithResponse:response 
  15. data:[NSData dataWithBytes:" " length:1]]; 
  16. [super storeCachedResponse:cachedResponse forRequest:request]; 
  17. [cachedResponse release]; 
  18. [response release]; 
  19. return [super cachedResponseForRequest:request]; 
  20. @end 

首先判斷URL是否需攔截(判斷通過FilterManager類實現,類實現在此不列出)。如果需要,創建一個無內容的響應對象并把它存在cache中。有人可能會認為只需要返回假的響應對象就夠了,沒必要緩存它。但這樣會因響應對象被系統釋放而導致app crash。不知道為何為會這樣,可能是iOS的bug(Mac OS X 10.5.x也存在同樣問題,而10.4.x及更早的系統上沒有問題),也可能是URL Loading System內部類之間的依賴所致。所以我們先緩存響應對象。確保所有響應都是真實存在于緩存中,這也iOS希望的,最重要的是不會crash.

更新:因為假的響應是以大于0的大小來初始化的,看起來結緩存它也是必要的。

2.創建新的緩存:

接下來需要創建一個新的緩存并告訴iOS系統使用新的緩存代替默認的,這樣當URL Loading System檢測資源緩存時才會調用上面的代碼。這要在任意UIWebView開始加載頁面前做,顯然應該放在app啟動的時候:

  1. NSString *path = ...// the path to the cache file 
  2. NSUInteger discCapacity = 10*1024*1024
  3. NSUInteger memoryCapacity = 512*1024
  4. FilteredWebCache *cache = 
  5. [[FilteredWebCache alloc] initWithMemoryCapacity: memoryCapacity 
  6. diskCapacity: discCapacity diskPath:path]; 
  7. [NSURLCache setSharedURLCache:cache]; 
  8. [cache release]; 

這里需要提供一個緩存存儲路徑。緩存文件由NSURLCache對象自動生成,我們無需事先創建文件,但要定義緩存文件所存位置(必須是應用程序“沙盒”內,如“tmp”目錄或是“Document”目錄)

這就是實現UIWebView基于URL進行請求過濾的所有內容,看起來其實并不復雜

注:如果過濾規則在app運行過程中會改變,你需要從緩存中刪除假的響應。NSURLCache提供了刪除方法,所以這不是問題。如果過濾規則不會改變,則無需關心

責任編輯:chenqingxiang 來源: CocoaChina
相關推薦

2011-08-02 11:07:42

iOS開發 UIWebView

2011-08-08 18:26:52

UIWebView圖片

2013-03-26 09:24:57

iOS內置URL sc

2011-08-08 17:59:22

UIWebView網絡網頁

2015-08-17 09:46:15

UIjs

2012-04-23 11:00:56

iOS開發Objective-CJavaScript

2012-06-01 11:02:33

2011-08-17 10:09:25

iPhone開發UIWebViewTouch事件

2016-09-23 20:30:54

Javascriptuiwebview富文本編輯器

2011-07-21 17:00:59

iPhone UIWebView Status Cod

2015-10-09 09:24:08

2015-06-11 09:52:40

iOS 9蘋果WWDC

2016-09-18 20:11:16

IOS10iPhone蘋果

2012-04-20 10:39:04

UppsiteiOSAndroid

2016-11-16 00:39:39

2014-06-27 09:34:03

AngularJS

2025-04-23 08:20:00

JavaScriptURLAPI

2021-01-14 10:00:57

Restful接口

2015-10-10 09:45:29

2013-12-26 10:13:40

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 农村妇女毛片精品久久久 | 国内精品久久久久久 | 天天色综 | 在线欧美小视频 | 欧美综合一区二区 | 国产日产久久高清欧美一区 | 国产亚洲一区二区精品 | 日韩精品在线观看一区二区 | 黄色毛片一级 | 国产一区二区三区四区在线观看 | 日韩av成人 | 91视频导航| 中文字幕一区二区三区四区 | 一区二区三区小视频 | 韩日有码 | 久久国产精品一区二区三区 | 二区视频| 天堂免费看片 | 亚洲国产精品久久 | 欧美精品一区二区三区在线播放 | 中文字幕二区 | 欧美成人精品欧美一级 | 中文字幕一区二区三区在线观看 | 久久久国产精品 | 国产激情一区二区三区 | 国产精品一区二区日韩 | 国产精品色婷婷久久58 | 亚洲国产成人精品女人久久久 | 免费看a| 欧美寡妇偷汉性猛交 | 在线欧美视频 | 日韩av免费看 | 国产视频不卡一区 | 7777精品伊人久久精品影视 | 亚洲高清视频在线观看 | 91动漫在线观看 | 久久这里只有精品首页 | 二区不卡| 中文字幕在线视频网站 | 欧美成年网站 | 日韩一区精品 |