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