ios native加載H5圖片(轉(zhuǎn)載)

本文轉(zhuǎn)自標(biāo)哥的技術(shù)博客

首先啦租,我們要獲取HTML內(nèi)容农尖,并通過正則表達(dá)式來匹配出所有的<img src="..."/>
的標(biāo)簽:
NSURL *url = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"html"];
NSString *html = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

NSRegularExpression regex = [NSRegularExpression regularExpressionWithPattern:@"<img\ssrc[^>]/>" options:NSRegularExpressionAllowCommentsAndWhitespace error:nil];

NSArray *result = [regex matchesInString:html options:NSMatchingReportCompletion range:NSMakeRange(0, html.length)];

接下來,我們需要一個(gè)字典來存儲HTML原始的URL和與之關(guān)聯(lián)的本地URL剧浸。由于使用原始URL的md5值作為文件名字锹引,因此本地路徑也就唯一確定了。這里就將圖片都放到Document下唆香。

NSMutableDictionary *urlDicts = [[NSMutableDictionary alloc] init];
NSString *docPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

然后嫌变,我們需要遍歷所有匹配到的<img src="..."/>
標(biāo)簽,并提取出Src屬性值躬它,也就是我們要的原始URL腾啥。將并該URL存儲下來,以便下一步替換虑凛。

for (NSTextCheckingResult *item in result) {
NSString *imgHtml = [html substringWithRange:[item rangeAtIndex:0]];

NSArray *tmpArray = nil;
if ([imgHtml rangeOfString:@"src=\""].location != NSNotFound) {
  tmpArray = [imgHtml componentsSeparatedByString:@"src=\""];
} else if ([imgHtml rangeOfString:@"src="].location != NSNotFound) {
  tmpArray = [imgHtml componentsSeparatedByString:@"src="];
}
    
if (tmpArray.count >= 2) {
  NSString *src = tmpArray[1];
  
  NSUInteger loc = [src rangeOfString:@"\""].location;
  if (loc != NSNotFound) {
    src = [src substringToIndex:loc];
    
    NSLog(@"正確解析出來的SRC為:%@", src);
    if (src.length > 0) {
      NSString *localPath = [docPath stringByAppendingPathComponent:[self md5:src]];
      // 先將鏈接取個(gè)本地名字碑宴,且獲取完整路徑
      [urlDicts setObject:localPath forKey:src];
    }
  }
}

}

下一步,我們需要將HTML中所有的原始src的url值替換成我們app的沙盒中的圖片路徑桑谍,如果該路徑中未存在,則需要去下載圖片祸挪,否則不需要重復(fù)下載锣披。如下:

// 遍歷所有的URL,替換成本地的URL贿条,并異步獲取圖片
for (NSString *src in urlDicts.allKeys) {
NSString *localPath = [urlDicts objectForKey:src];
html = [html stringByReplacingOccurrencesOfString:src withString:localPath];

// 如果已經(jīng)緩存過雹仿,就不需要重復(fù)加載了。
if (![[NSFileManager defaultManager] fileExistsAtPath:localPath]) {
  [self downloadImageWithUrl:src];
}

}

下載圖片后整以,還需要將圖片存儲到該原始url對應(yīng)的本地路徑胧辽,也就是Document下,其文件名為原始url的md5值,其他也就可以得出去唯一路徑公黑。這里只貼出存儲代碼邑商,關(guān)于如何下載圖片,查看demo凡蚜。

NSData *data = UIImagePNGRepresentation(image);
NSString *docPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

NSString *localPath = [docPath stringByAppendingPathComponent:[self md5:src]];

if (![data writeToFile:localPath atomically:NO]) {
NSLog(@"寫入本地失斎硕稀:%@", src);
}

難點(diǎn)
這里有幾處難點(diǎn):
如何匹配<img src="..."/>
來查找圖片鏈接
在匹配到以后,如何獲取src的值
在得到src的值以后朝蜘,如何在iOS原生獲取圖片后讓webview加載

這里使用了正則表達(dá)式來匹配查找<img src="..."/>
恶迈,匹配結(jié)果可能有多個(gè),遍歷數(shù)組就可以處理所有的圖片鏈接:

NSRegularExpression(pattern: "<img\ssrc[^>]*/>", options: .AllowCommentsAndWhitespace

存儲圖片到沙盒
通過獲取到HTML中圖片的鏈接后谱醇,我們需要通過ios原生的方式來發(fā)起請求暇仲,加載圖片步做,在加載完成后,我們需要將圖片存儲到沙盒中document下:

func saveImageData(data: NSData, name: String) ->String {
let docPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as NSString

let path = docPath.stringByAppendingPathComponent(name)

// 若已經(jīng)緩存過奈附,就不需要重復(fù)操作了
if NSFileManager.defaultManager().fileExistsAtPath(path) {
return path
}

do {
try data.writeToFile(path, options: NSDataWritingOptions.DataWritingAtomic)
} catch {
print("save image data with name: (name) error")
}

return path
}

驗(yàn)證是否成功
首先我們可以看到test.html中只有兩個(gè)img標(biāo)簽:

1
2
3
4
5

<img src="http://www.jhjcqc.com/ueditor/php/upload/image/20151014/1444783819412910.jpg" />

<img src="http://www.jhjcqc.com/ueditor/php/upload/image/20151014/1444783847836404.jpg" />

在我們替換路徑完成后全度,我們加載webview,然后打印出webview所加載的HTML內(nèi)容中這兩個(gè)<img>
標(biāo)簽的src是否變化桅狠,結(jié)果如下:

1
2
3
4
5

<img src="/Users/huangyibiao/Library/Developer/CoreSimulator/Devices/09692E07-2E79-4070-9537-CFD9F3141B0D/data/Containers/Data/Application/73F6D429-E0FD-4BD4-B0A5-85C1BD179840/Documents/5353c07f4c2ea0471b9f3ee36dedcaac" />

<img src="/Users/huangyibiao/Library/Developer/CoreSimulator/Devices/09692E07-2E79-4070-9537-CFD9F3141B0D/data/Containers/Data/Application/73F6D429-E0FD-4BD4-B0A5-85C1BD179840/Documents/54edea1f2edd444aaba9d0321d786962" />

根據(jù)效果圖讼载,我們可以看到圖片是顯示出來了,這就說明替換成功后仍然可以加載出來圖片中跌,實(shí)驗(yàn)成功咨堤。
源代碼
想要下載源代碼,請移步github下載漩符,內(nèi)有Swift版的工程和ObjC版的工程:https://github.com/CoderJackyHuang/iOSLoadWebViewImage

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末一喘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗜暴,更是在濱河造成了極大的恐慌凸克,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闷沥,死亡現(xiàn)場離奇詭異萎战,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)舆逃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蚂维,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人路狮,你說我怎么就攤上這事虫啥。” “怎么了奄妨?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵涂籽,是天一觀的道長。 經(jīng)常有香客問我砸抛,道長评雌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任锰悼,我火速辦了婚禮柳骄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箕般。我一直安慰自己耐薯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曲初,像睡著了一般体谒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上臼婆,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天抒痒,我揣著相機(jī)與錄音,去河邊找鬼颁褂。 笑死故响,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颁独。 我是一名探鬼主播彩届,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼誓酒!你這毒婦竟也來了樟蠕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤靠柑,失蹤者是張志新(化名)和其女友劉穎寨辩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歼冰,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靡狞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隔嫡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耍攘。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖畔勤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扒磁,我是刑警寧澤庆揪,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站妨托,受9級特大地震影響缸榛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兰伤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一内颗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敦腔,春花似錦均澳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糟袁。三九已至,卻和暖如春躺盛,著一層夾襖步出監(jiān)牢的瞬間项戴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工槽惫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留周叮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓界斜,卻偏偏與公主長得像仿耽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子锄蹂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容