WKWebView加載js遇到的問題

需求:hybrid混合開發(fā),大概就是把.html.css等資源文件存在本地,通過jsBridge.js來進行交互,提高在app中加載h5頁面的加載速度和用戶體驗等問題,減少app端需要發(fā)包才能解決的一些業(yè)務(wù)問題。

最近將hybrid框架中的UIWebView換成WKWebView遇到的問題,主要是加載jsBridge.js文件遇到的問題。

  1. UIWebView中的加載jsBridge.js,代碼如下:
- (void)webViewDidStartLoad:(UIWebView *)webView
{
    if (webView != self) { return; }
    
    [webView stringByEvaluatingJavaScriptFromString:[self jsString]];
    
    if ([self.webViewDelegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
        [self.webViewDelegate webViewDidStartLoad:webView];
    }
}

- (NSString *)jsString {
    NSString *result = [NSString stringWithContentsOfFile:JSBridgePath encoding:NSUTF8StringEncoding error:nil];
    if (result == nil) {
        result = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"jsBridge" ofType:@"js"] encoding:NSUTF8StringEncoding error:nil];
    }
    return result;
}

像正常加載url的方法一樣就可以了

- (void)reloadWebViewRequest
{
    [self.webView loadRequest:[NSURLRequest requestWithURL:self.url]];
}

2.WKWebView中的加載jsBridge.js,一開始也是直接像UIWebView一樣在代理方法執(zhí)行jsBridge.js,雖然js代碼執(zhí)行成功了,但是加載不了存在本地的.html.css等文件,頁面就加載不出來,代碼如下:

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
    if (webView != self) { return; }
    
    [webView evaluateJavaScript:[self jsString] completionHandler:^(id _Nullable, NSError * _Nullable error) {
        
    }];
    
    if ([self.webViewDelegate respondsToSelector:@selector(webView:didFinishNavigation:)]) {
        [self.webViewDelegate webView:webView didFinishNavigation:navigation];
    }
}

后來在網(wǎng)上找了好多資料,具體實現(xiàn)如下:

// 初始化webview
- (void)viewDidLoad {
    [super viewDidLoad];
    [self installStartTime];
    
    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    self.webview = [[JSBWebView alloc] initWithFrame:self.view.bounds configuration:config];
    self.webview.navigationDelegate = self;
    self.webview.UIDelegate = self;
}

- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration
{
    WKUserScript *script = [[WKUserScript alloc] initWithSource:[self jsString] injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
    [configuration.userContentController addUserScript:script];
    [configuration.preferences setValue:@YES forKey:@"allowFileAccessFromFileURLs"];

    self = [super initWithFrame:frame configuration:configuration];
    if (self) {
        [self setup];
    }
    return self;
}

說明,一定要設(shè)置[configuration.preferences setValue:@YES forKey:@"allowFileAccessFromFileURLs"];

參考資料:
https://stackoverflow.com/questions/36013645/setting-disable-web-security-and-allow-file-access-from-files-in-ios-wkwebvi

加載文件一定要用loadFileURL:allowingReadAccessToURL:這個才會生效

- (void)reloadWebViewRequest
{
    NSURL *accessURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0];
    [self.webview loadFileURL:self.url allowingReadAccessToURL:accessURL];
}

參考資料:
https://stackoverflow.com/questions/40472796/wkwebview-loadfileurl-works-only-once

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 通過學(xué)習(xí),你將會學(xué)習(xí)以下幾個方面的內(nèi)容: **什么是WKWebView以及它和UIWebView的區(qū)別是什么 **...
    SOI閱讀 11,743評論 18 42
  • 前言 關(guān)于UIWebView的介紹,相信看過上文的小伙伴們,已經(jīng)大概清楚了吧,如果有問題,歡迎提問。 本文是本系列...
    CoderLF閱讀 9,011評論 2 12
  • UIWebView 之痛 開發(fā)App的過程中,常常會遇到在App內(nèi)部加載網(wǎng)頁,通常用UIWebView加載。而這個...
    Style_mao閱讀 1,448評論 1 5
  • 轉(zhuǎn)載自: http://www.lxweimin.com/p/90a90bd13aac WKWebView從入門到趟...
    F麥子閱讀 663評論 0 3
  • UIWebView 之痛 開發(fā)App的過程中,常常會遇到在App內(nèi)部加載網(wǎng)頁,通常用UIWebView加載。而這個...
    zyl04401閱讀 16,078評論 46 157