關(guān)于如何加載儲存在沙盒的Html
一般我們加載本地Html的時(shí)候,如果只是單純的Html,或者是CSS,JS全部內(nèi)嵌在Html文件中,那么沒啥大問題,我們只需單純的加載這個(gè)文件就好了.
[self.web loadHTMLString:[NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil] baseURL:nil];
但是一般web不會把JS , CSS 直接內(nèi)嵌到Html內(nèi)部,一般都會分開.就像下圖所示一樣,很多時(shí)候結(jié)構(gòu)可能更加復(fù)雜.這個(gè)時(shí)候加載本地的web就會遇到問題了.
iOS8 系統(tǒng)下WKWebView 和 WebViewd加載本地的web
iOS8 系統(tǒng)不能有效加載Html 關(guān)聯(lián)的js css 和資源文件,需要將文件拷貝到一個(gè)臨時(shí)文件夾內(nèi),然后無論WKWebView 和 WebViewd都可以加載了
- (NSURL*)fileURLForBuggyWKWebView8: (NSURL*)fileURL {
NSError*error =nil;
if(!fileURL.fileURL|| ![fileURLcheckResourceIsReachableAndReturnError:&error]) {
returnnil;
}
// Create "/temp/www" directory
NSFileManager *fileManager= [NSFileManager defaultManager];
NSURL *temDirURL = [[NSURL fileURLWithPath:NSTemporaryDirectory()] URLByAppendingPathComponent:@"www"];
[fileManagercreateDirectoryAtURL:temDirURL withIntermediateDirectories:YES attributes:nil error:&error];
NSURL*dstURL = [temDirURLURLByAppendingPathComponent:fileURL.lastPathComponent];
// Now copy given file to the temp directory
[fileManagerremoveItemAtURL:dstURLerror:&error];
[fileManagercopyItemAtURL:fileURLtoURL:dstURLerror:&error];
// Files in "/temp/www" load flawlesly :)
returndstURL;
}
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString*path = [pathsobjectAtIndex:0];
NSString *basePath = [NSString stringWithFormat:@"%@/%@",path,@"QueHTML/"];
NSURL *fileURL = [self fileURLForBuggyWKWebView8: [NSURL fileURLWithPath:basePath]];
WKWebView *webView = [[WKWebView alloc]initWithFrame:CGRectMake(0 * self.view.bounds.size.width, 0, self.view.bounds.size.width, self.view.bounds.size.height-64)];
webView.navigationDelegate = self;
webView.UIDelegate=self;
[self.view addSubview:webView];
[webViewloadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat:@"www/QueHTML/LocaliOS.html"]]]]];
PS:注意這里面還有一個(gè)隱藏的bug,那就是js的文件中不能含有window.addEventListener函數(shù),這個(gè)函數(shù)在iOS8上為Undefinded 會導(dǎo)致整個(gè)js文件所有的代碼都不執(zhí)行
iOS9 WKWebView 和WebView 加載本地web
iOS9加載本地web文件,需要指定整個(gè)文件夾的路徑,這樣web才能完整的加載
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSString *basePath = [NSString stringWithFormat:@"%@/%@",path,@"QueHTML/"];
NSString *htmlPath = [NSString stringWithFormat:@"%@/%@",path,@"QueHTML/LocaliOS.html"];
NSURL *fileURL = [NSURL fileURLWithPath:htmlPath];
WKWebView *webView = [[WKWebView alloc]initWithFrame:CGRectMake(0 * self.view.bounds.size.width, 0, self.view.bounds.size.width, self.view.bounds.size.height-64)];
webView.navigationDelegate = self;
webView.UIDelegate = self;
[self.view addSubview:webView];
[webView loadHTMLString:[NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil] baseURL:[NSURL fileURLWithPath:basePath isDirectory:YES]];
//當(dāng)然也可以使用下面的系統(tǒng)函數(shù)加載
// [webView loadFileURL:fileURL allowingReadAccessToURL:[NSURL fileURLWithPath:basePath isDirectory:YES]];
PS:iOS9中跟iOS8的注意事項(xiàng)一樣,js中不能使用window.addEventListener函數(shù)
iOS10及之后WKWebView 和WebView 加載本地web
iOS10之后一下兩個(gè)系統(tǒng)函數(shù)都可以加載本地web,而且沒有任何的限制,包括前面的js函數(shù)的限制
[webView loadHTMLString:[NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil] baseURL:[NSURL fileURLWithPath:basePath isDirectory:YES]];
//當(dāng)然也可以使用下面的系統(tǒng)函數(shù)加載
// [webView loadFileURL:fileURL allowingReadAccessToURL:[NSURL fileURLWithPath:basePath isDirectory:YES]];
PS1:如何debug WebView 首先打開safari的偏好設(shè)置,在高級選項(xiàng)中選擇在菜單欄中顯示開發(fā)選項(xiàng) ,然后當(dāng)你debug 你的項(xiàng)目的時(shí)候在safari的選項(xiàng)中就可以看到正常運(yùn)行的webView了,不過safari的調(diào)試有點(diǎn)不穩(wěn)定
PS2:有時(shí)候你可能發(fā)現(xiàn)自己的js css 都沒加載,這個(gè)時(shí)候debug一下,確定js css文件有沒有亂碼 ,如果有亂碼的現(xiàn)象請?jiān)趆tml內(nèi)連接js css文件的時(shí)候注明charset = "utf-8"