我們APP的核心功能實現(xiàn)方式為:原生和JS交互察滑。這就需要頻繁的互傳數(shù)據(jù),互傳數(shù)據(jù)在這里就先不說堕汞,之后寫的一篇瘫析,可以看這個耿导。WKWebView填坑之----與H5相互交互
最早用的UIWebView龄寞,交互沒有WebKit方便但也還湊合,主要是太吃內(nèi)存了挣磨,性能太差簸喂,而且現(xiàn)在最低支持iOS 8难菌,所以決定換成WebKit竞惋,由此開始了這次的填坑之路柜去。
我們前端顯示的內(nèi)容是從沙盒內(nèi)加載的圖片和音樂文件,用UIWebView時是我把文件的本地路徑傳給前端然后前端直接去訪問文件的本地路徑就可以了碰声,但是換成WebKit就沒辦法加載出來資源文件诡蜓。google了之后發(fā)現(xiàn)這是WebKit現(xiàn)在的bug熬甫,好吧胰挑,沒什么好的解決方案,大部分給的都是在文件前加一個localhost椿肩,但是也沒給出具體的方案實施步驟瞻颂。這一看就是在本地開了一個類似Apache服務(wù)器啊,頓時感覺這思路也是可以郑象。有了思路現(xiàn)在就開始干贡这。
GitHub上有個神器:GCDWebServer,這次就用的這個
pod集成這些就不說了厂榛,直接上代碼
// 官方給的示例是在AppDelegate里啟動本地服務(wù)器盖矫,但是我這個并沒有必要在APP啟動時就啟動本地服務(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下有一個123的文件
NSString *basePath = @"http://localhost/Library/123"; // 這樣就可以訪問到這個文件了,我只需要把我的文件名拼上localhost路徑然后傳給前端痰驱,他們拿到這個鏈接直接訪問就可以拿到這個文件了
上面只是代碼证芭,還是來點調(diào)試過程吧!
進入到APP內(nèi)的WebView頁面担映,然后
對了废士,這里Safari需要把“開發(fā)”選項打開
點擊鏈接后回打開一個網(wǎng)頁檢查器
可以看到我們已經(jīng)可以訪問沙盒內(nèi)容了,如果在mac上開過本地Apache服務(wù)器的同學(xué)看到這個界面應(yīng)該一眼就能看出來這是開了一個本地服務(wù)器蝇完。
至此官硝,大功告成诅挑。我只需要把路徑告訴前端我的工作就完成了。
忘了說了泛源,在viewDidLoad開啟的話在控制器注銷時需要把本地服務(wù)器停止
// 此頁面并沒有右滑返回手勢
- (void)goBack{
// 這也是為什么要定義全局屬性的原因
[_webSever stop];
_webSever = nil;
[self.navigationController popViewControllerAnimated:YES];
}
順便說一下拔妥,GCDWebServer我在模擬器上并不能通過IP地址或者localhost來訪問。