ios UIWebView使用和js互動
阿新 • • 發佈:2018-11-13
下面我們一起學習下UIWebView的使用
一、 定義webView 程式碼如下
#pragma 懶載入 - (UIWebView *)webView { if (!_webView) { _webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 44, SCREENWIDTH, SCREENHEIGHT - 44)]; _webView.delegate = self; _webView.opaque = NO; _webView.backgroundColor = [UIColor whiteColor]; if (@available(ios 11.0,*)){ _webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;} } return _webView; }
二、載入html 帶引數或不帶引數
-
1、載入部署在後臺的
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]];
-
2、載入專案中的
NSString * path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; //不帶引數 // [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:path]]]; //帶引數 NSURL * url = [NSURL URLWithString:@"?A=B" relativeToURL:[NSURL URLWithString:path]]; [self.webView loadRequest:[NSURLRequest requestWithURL:url]];
-
3、載入沙盒中的 將檔案拷貝到沙盒 或者將檔案解壓到沙盒中
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString * pathS = [paths objectAtIndex:0]; pathS = [pathS stringByAppendingString:[NSString stringWithFormat:@"/index.html"]]; //不帶引數 // NSURL * url = [NSURL URLWithString:@"" relativeToURL:[NSURL URLWithString:pathS]]; // [self.webView loadRequest:[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.f]]; //帶引數 NSURL * url = [NSURL URLWithString:@"?A=B" relativeToURL:[NSURL URLWithString:pathS]]; [self.webView loadRequest:[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.f]];
三、實現代理
#pragma webView delegate
//開始載入
- (void)webViewDidStartLoad:(UIWebView *)webView {
NSLog(@"開始載入");
}
//載入成功
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSLog(@"載入成功");
}
//來決定是否載入該網頁中的連結
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSLog(@"url---%@",request.URL.absoluteString);
return YES;
}
//載入失敗
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
NSLog(@"載入失敗");
}
四、js互動
-
1、js 呼叫原生的方法
可以讓js呼叫原生的方法 在- (void)webViewDidFinishLoad:(UIWebView *)webView ;代理方法中實現如下操作
self.jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; self.jsContext[@"console"][@"log"] = ^(JSValue * msg) { NSLog(@"H5 log : %@", msg); };
上面就是列印js中的console的日誌,如果想自定義方法,將[@“console”][@“log”]中替換成自己的方法名字如[@“call”]
-
2、攔截
可以在- (BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType ;方法中攔截url 進行操作例如可以攔截 http
NSURL *requestURL = request.URL; if ( [[requestURL scheme] isEqualToString:@"http"]) { // to do return NO; }
-
3、原生呼叫js
首先匯入JavaScriptCore庫, 然後在OC中獲取JS的上下文
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
再然後定義好JS需要呼叫的方法,
JSValue *Callback = jsContext[@“方法名字”]; [Callback callWithArguments:@[]];