1. 程式人生 > >ios UIWebView使用和js互動

ios UIWebView使用和js互動

下面我們一起學習下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:@[]];
    

    demo 下載