UIWebView和JS交互

2019-08-26  本文已影响0人  fangfangzhuzhu

1.UIWebView的使用

    CGRect bounds = [UIScreen mainScreen].bounds;
    UIWebView *webview = [[UIWebView alloc]initWithFrame:bounds];
    webview.delegate = self;
    webview.scalesPageToFit = YES;
    webview.dataDetectorTypes = UIDataDetectorTypePhoneNumber;
    self.webView = webview;
    [self.view addSubview:webview];
    
    NSURL *url = [NSURL URLWithString:@"https://www.baidu.com/"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [webview loadRequest:request];

常用代理方法

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- (void)webViewDidStartLoad:(UIWebView *)webView;
- (void)webViewDidFinishLoad:(UIWebView *)webView;
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;

2.OC调用JS

NSString *sendJsStr=[NSString stringWithFormat:@"alert(123)"];
[webView stringByEvaluatingJavaScriptFromString:sendJsStr];
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];  
NSString *alertJS=@"alert('test js OC')"; //准备执行的js代码  
[context evaluateScript:alertJS];//通过oc方法调用js的alert

3.JS调用OC

使用JSContext,js调用OC
ctx[@"bizmateIOSTokenInvalid"] = ^() {
        block();
};

4.遇到的问题
js页面有二级页面的时候,第一级页面的OC可以正常调取js中的方法传递进参数,二级页面的时候就获取不到,原因:

UIWebView里面的JavaScriptContext这个对象,每个页面一个,发生跳转的时候会把前页面的JavaScriptContext释放掉,加载新页面,然后为新页面再创建一个JavaScriptContext。也就是JavaScriptContext与UIWebView对象无关,与当前加载的网页有关。JavaScriptContext创建时机apple没有在UIWebViewDelegate提供,一个UIWebView在第一次价载网页的时候,可以在webViewDidFinishLoad等事件里赋值,js也可以获取的到,但在同一个UIWebView做跳转的化久显得有点诡异,明明获取了JavaScriptContext并设置了我们的值,为神马js获取不到,这些都是apple没有公开JavaScriptContext创日记的原因,我们第二次获取的可能是前页面的,而不是新页面的。UIWebView多次页面跳转,有些资源是供用的,有些不是。JavaScriptContext就不是,什么时候创建的不知道。

解决方式:
使用UIWebViewTS_JavaScriptContext
获取JavaScriptContext 创建之后的回调

#pragma mark - TSWebViewDelegate
/*!
 *  JavaScriptContext创建的时候回调
 */
- (void)webView:(UIWebView *)webView didCreateJavaScriptContext:(JSContext *)ctx
{
    dispatch_async(dispatch_get_main_queue(), ^{
      self.jContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
      self.jContext[@"toApp"] = _helper;
    });
}

参考:
http://www.jianshu.com/p/be956be922b4
http://www.jianshu.com/p/9513d101e582

上一篇下一篇

猜你喜欢

热点阅读