我們APP的核心功能實(shí)現(xiàn)方式為:原生和JS交互。這就需要頻繁的互傳數(shù)據(jù),互傳數(shù)據(jù)在這里就先不說,之后寫的一篇,可以看這個(gè)。WKWebView填坑之----與H5相互交互
最早用的UIWebView,交互沒有WebKit方便但也還湊合,主要是太吃內(nèi)存了,性能太差,而且現(xiàn)在最低支持iOS 8,所以決定換成WebKit,由此開始了這次的填坑之路。
我們前端顯示的內(nèi)容是從沙盒內(nèi)加載的圖片和音樂文件,用UIWebView時(shí)是我把文件的本地路徑傳給前端然后前端直接去訪問文件的本地路徑就可以了,但是換成WebKit就沒辦法加載出來資源文件。google了之后發(fā)現(xiàn)這是WebKit現(xiàn)在的bug,好吧,沒什么好的解決方案,大部分給的都是在文件前加一個(gè)localhost,但是也沒給出具體的方案實(shí)施步驟。這一看就是在本地開了一個(gè)類似Apache服務(wù)器啊,頓時(shí)感覺這思路也是可以。有了思路現(xiàn)在就開始干。
GitHub上有個(gè)神器:GCDWebServer,這次就用的這個(gè)
pod集成這些就不說了,直接上代碼
// 官方給的示例是在AppDelegate里啟動(dòng)本地服務(wù)器,但是我這個(gè)并沒有必要在APP啟動(dòng)時(shí)就啟動(dòng)本地服務(wù)器,所以我放在了核心功能控制器的viewDidLoad方法內(nèi)
// 1.導(dǎo)入頭文件
#import <GCDWebServer/GCDWebDAVServer.h>
// 2.定義全局屬性
@property (nonatomic,strong) GCDWebServer *webSever;
// 3. 主要代碼
_webSever = [[GCDWebServer alloc]init];
[_webSever addGETHandlerForBasePath:@"/" directoryPath:NSHomeDirectory() indexFilename:nil cacheAge:3600 allowRangeRequests:YES];
[_webSever startWithPort:80 bonjourName:nil];
// 好了,這就結(jié)束了!WTF,這就完了,是的,可以這么說
// 比方說文件存在Library下有一個(gè)123的文件
NSString *basePath = @"http://localhost/Library/123"; // 這樣就可以訪問到這個(gè)文件了,我只需要把我的文件名拼上localhost路徑然后傳給前端,他們拿到這個(gè)鏈接直接訪問就可以拿到這個(gè)文件了
上面只是代碼,還是來點(diǎn)調(diào)試過程吧!
進(jìn)入到APP內(nèi)的WebView頁(yè)面,然后

對(duì)了,這里Safari需要把“開發(fā)”選項(xiàng)打開
點(diǎn)擊鏈接后回打開一個(gè)網(wǎng)頁(yè)檢查器



可以看到我們已經(jīng)可以訪問沙盒內(nèi)容了,如果在mac上開過本地Apache服務(wù)器的同學(xué)看到這個(gè)界面應(yīng)該一眼就能看出來這是開了一個(gè)本地服務(wù)器。
至此,大功告成。我只需要把路徑告訴前端我的工作就完成了。
忘了說了,在viewDidLoad開啟的話在控制器注銷時(shí)需要把本地服務(wù)器停止
// 此頁(yè)面并沒有右滑返回手勢(shì)
- (void)goBack{
// 這也是為什么要定義全局屬性的原因
[_webSever stop];
_webSever = nil;
[self.navigationController popViewControllerAnimated:YES];
}
順便說一下,GCDWebServer我在模擬器上并不能通過IP地址或者localhost來訪問。