先闡述背景:
app需要集成一個(gè)本地的html文件捆探,并且在調(diào)用時(shí)url帶參數(shù)蚀苛。如:
analysis.html?sId=417492&apiUrl=http://192.168.100.1:8888
1、傳統(tǒng)方法掌敬。
首先我采取了之前的本地網(wǎng)頁集成方法
//htmlPath即是本地html的路徑傻挂,filename即是html名
NSString *filePath = [htmlPath stringByAppendingPathComponent:filename];
NSString *htmlString = [[NSString alloc]initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
[webView loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:htmlPath]];
傳入文件名filename = @"analysis.html?sId=417492&apiUrl=http://192.168.100.1:8888";
發(fā)現(xiàn)htmlString為空,并不能通過帶參數(shù)的文件地址找到對(duì)應(yīng)的文件熊镣。
后來也試過NSString的initWithContentsOfURL
等方法。均無法實(shí)現(xiàn)需求。
放棄绪囱。
2测蹲、relativeToURL
之后我找到了另一個(gè)方法
NSString *filePath = [htmlPath stringByAppendingPathComponent:filename];
NSURL *fileUrl = [NSURL URLWithString:@"?sId=417492&apiUrl=http://192.168.100.1:8888"
relativeToURL:[NSURL fileURLWithPath:filePath]];
NSURLRequest *request = [NSURLRequest requestWithURL: fileUrl];
[webView loadRequest:request];
經(jīng)試驗(yàn),該方法可以正常打開html文件鬼吵,并將參數(shù)傳入扣甲。
需要注意的是,有時(shí)候我們發(fā)現(xiàn)使用[NSURL URLWithString:filePath]
也可以達(dá)到相同的效果齿椅,在UIWebView是這樣的琉挖,但放到WKWebView就行不通了,所以還是建議統(tǒng)一使用:[NSURL fileURLWithPath:filePath]
涣脚。
問題解決示辈,于是輕松加愜意得繼續(xù)擴(kuò)展。還有沒有更簡單的方法呢涩澡?
3顽耳、直接拼URL
基于方法二坠敷,既然通過url妙同,為什么不能直接將參數(shù)拼接在url后面呢。仔細(xì)看膝迎,其實(shí)這種用法其實(shí)很像網(wǎng)絡(luò)請(qǐng)求的Get方法粥帚,所以
//htmlPath即是本地html的路徑,filename=@"analysis.html?sId=417492&apiUrl=http://192.168.100.1:8888"
NSString *filePath = [htmlPath stringByAppendingPathComponent:filename];
接下來將path轉(zhuǎn)化為url就好了吧限次?
NSURL *fileUrl = [NSURL fileURLWithPath: filePath];
NSURLRequest *request = [NSURLRequest requestWithURL: fileUrl];
[webview loadRequest:request];
然而并沒有芒涡。網(wǎng)頁并沒有加載顯示出來,自然參數(shù)也并沒有傳遞進(jìn)去卖漫。難道我想錯(cuò)了费尽?
打印一下url發(fā)現(xiàn)
Printing description of fileUrl:
file:///var/containers/Bundle/Application/39A2343F-37E1-42B4-8D7E-F373A153BF1D/UrlDemo.app/statis/analysis.html%3FsId=417492&apiUrl=192.168.100.1:8888
發(fā)現(xiàn)問題:url中的"?"被轉(zhuǎn)碼成"%3F",直接導(dǎo)致整個(gè)url的解析失敗羊始。再然后旱幼,我試過對(duì)參數(shù)編碼,對(duì)path編碼突委,最后發(fā)現(xiàn)柏卤,是在方法二中建議使用的fileURLWithPath:
的問題,在該方法中匀油,會(huì)自動(dòng)進(jìn)行編碼缘缚。不推薦使用的URLWithString:
方法反而不會(huì)。于是為了解決編碼問題敌蚜,我嘗試著使用URLWithString將Path轉(zhuǎn)化成URL
NSURL *fileUrl = [NSURL URLWithString:[NSString stringWithFormat:@"file://%@", filePath]];
就是手動(dòng)拼接一個(gè)文件頭桥滨。打印url正常,編譯正常,運(yùn)行正常齐媒,正確打開網(wǎng)頁并傳遞了參數(shù)酸舍。
但是總覺得手動(dòng)拼一個(gè)頭做法不太正規(guī),于是繼續(xù)挖坑里初。
4啃勉、NSURLComponents
直接上代碼
NSString *filePath = [htmlPath stringByAppendingPathComponent:filename];
NSURL *fileUrl = [NSURL fileURLWithPath:filePath isDirectory:NO];//此部分沒有?所以沒有問題,isDirectory=YES會(huì)導(dǎo)致多一層目錄双妨。
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:fileUrl resolvingAgainstBaseURL:NO];
[urlComponents setQueryItems:@[[NSURLQueryItem queryItemWithName:@"sId" value:@"417492"], [NSURLQueryItem queryItemWithName:@"apiUrl" value:@"http://192.168.100.1:8888"]]];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:urlComponents.URL];
正確實(shí)現(xiàn)需求淮阐。
綜上,解決問題的方法永遠(yuǎn)不止一個(gè)刁品。
不求甚解是一種態(tài)度;
淺嘗輒止是一種態(tài)度;
刨根問底是一種態(tài)度;
精益求精是一種態(tài)度泣特。
淺嘗輒止了~