需求:hybrid混合開發(fā),大概就是把.html
和.css
等資源文件存在本地,通過jsBridge.js
來進行交互,提高在app
中加載h5
頁面的加載速度和用戶體驗等問題,減少app
端需要發(fā)包才能解決的一些業(yè)務(wù)問題。
最近將hybrid
框架中的UIWebView
換成WKWebView
遇到的問題,主要是加載jsBridge.js
文件遇到的問題。
-
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"];
加載文件一定要用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