WKWebView
加強(qiáng)了安全性,不再允許跨域訪問纹坐,所有跨域地址都失效了,包括不在同一文件夾下的CSS
舞丛、JS
等文件引用耘子。
問題:
加載本地沙盒內(nèi)資源文件時(shí)候,例如file://localhost/var/...../Library/a.png
球切,雖然能找到資源文件真實(shí)存在谷誓,但是在H5中會(huì)加載失敗,所以我們就不能用之前的方式進(jìn)行加載
解決辦法:
1吨凑、把src中的圖片單獨(dú)讀取出來捍歪,然后轉(zhuǎn)成data拼到src中(這種方案加載速度太慢户辱,不推薦)。
2糙臼、啟動(dòng)一個(gè)本地服務(wù)器庐镐,擁有一個(gè)讀取沙盒的權(quán)利(推薦使用)
導(dǎo)入一個(gè)三方 GCDWebServer
1、你可以使用CocoaPods变逃,在Podfile中添加下面代碼之后焚鹊,執(zhí)行 pod install
安裝 GCDWebServer
pod "GCDWebServer", "~> 3.0"
如果你想使用 GCDWebUploader
,添加下方代碼
pod "GCDWebServer/WebUploader", "~> 3.0"
pod "GCDWebServer/WebDAV", "~> 3.0" # 如果要使用 GCDWebDAVServer 就打開注釋
2韧献、如果要直接把文件放到程序中末患,可以下載 GCDWebServer
源碼后把下面文件夾中內(nèi)容引入到程序中。
GCDWebServer目錄
開始啟動(dòng)本地服務(wù)
Tips: 在沙河目錄中指定文件夾開啟服務(wù)后锤窑,可以使用http://localhost/
方式訪問本地資源
使用文件路徑方式 file://localhost/var/...../Library
加載資源文件會(huì)失敗
自行import
然后開啟服務(wù)璧针,可以寫到單獨(dú)頁面的ViewDidLoad
中,也可以全局寫到AppDelegate
建議:如果程序中H5頁面較多渊啰,建議寫到全局中訪問探橱,不用每次打開H5頁面都要重新開啟和關(guān)閉服務(wù)
1、引入 GCDWebServer
#import "GCDWebServer.h"
#import "GCDWebServerDataResponse.h"
2绘证、創(chuàng)建 server對(duì)象
@interface AppDelegate : UIResponder <UIApplicationDelegate, GCDWebServerDelegate> {
//聲明全局對(duì)象
GCDWebServer* _webServer;
}
@end
-(void)initWebServer{
// Create server
_webServer = [[GCDWebServer alloc] init];
_webServer.delegate = self;
//確定要開啟服務(wù)的沙盒文件夾目錄隧膏,如果沒有就創(chuàng)建文件夾
NSString* path = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Resources"];
if ([[NSFileManager defaultManager] fileExistsAtPath:path] == NO){
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
}
// Add a handler to respond to GET requests on any URL
[_webServer addGETHandlerForBasePath:@"/" directoryPath:path indexFilename:nil cacheAge:3600 allowRangeRequests:YES];
// Start server on port 8080
[_webServer startWithPort:8080 bonjourName:nil];
}
//代理回調(diào),確認(rèn)本地服務(wù)成功開啟
- (void)webServerDidStart:(GCDWebServer*)server{
NSLog(@"-------webServerDidStart--------------");
}
進(jìn)行地址替換
在處理網(wǎng)絡(luò)資源src 本地路徑的位置嚷那,進(jìn)行地址替換胞枕。
最終目的是要把 file://localhost/var/...../Library
中 Library前面
的換成 http://localhost/
再拼上后續(xù)地址
NSString* filepath = "file://localhost/var/...../Library/Resources/a.png";
NSString* path = [filepath componentsSeparatedByString:@"/Library/"].lastObject;
NSString* localPath = "http://localhost/" + path;
關(guān)閉服務(wù)
最后,如果是單頁面開啟服務(wù)的話魏宽,需要在頁面關(guān)閉時(shí)候關(guān)閉掉本地服務(wù)腐泻。代碼如下:
- (void)dealloc {
//停止本地服務(wù)
if ([self.webSever != nil]) {
[self.webSever stop];
self.webSever = nil;
}
}
Tips: 完美收官,你可以飛了6友E勺!