JavaScript和iOS交互遇到的坑

Posted Ven519

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript和iOS交互遇到的坑相关的知识,希望对你有一定的参考价值。

这段代码写的时机总是不对
当我们在- (void)viewDidLoad中注入JS代码之后,如果页面发生了重定向,此时web页面的JS已经发生了变化,而- (void)viewDidLoad方法只会执行一次,所以不再是之前我们注入过的那些JS了,此时再调用本地方法自然就失效了。
如果我们在- (void)webViewDidFinishLoad:(UIWebView )webView方法中注入JS,看起来貌似可以解决重定向之后调用失效的问题,因为webView每次加载完成后都会回调- (void)webViewDidFinishLoad:(UIWebView )webView,也就是说每次重定向之后,只要页面加载完成,JS代码就会重新被注入。如果JS调用OC方法的时机是在页面加载完成之后,比如点击web界面上的按钮或者由用户手动触发一个事件调用OC代码,这种情况一定是web页面加载完成之后才会发生的,而此时我们已经重新注入了JS,这样一点问题都没有。但是,如果JS调用OC方法的时机刚好发生在页面加载过程中呢?比如web界面加载过程中自动执行一些操作需要调用OC代码,而此时- (void)webViewDidFinishLoad:(UIWebView *)webView还没有回调,所以我们的JS代码并没有重新注入,这里仍然会造成失效的问题

于是我找到了相关的第三方webview的延展UIWebView+TS_javascriptContext
但是还是没有解决我的问题 

附上我的需求:
js需要由客户端去请求接口,请求到的数据返回给js h5拿到数据后进行渲染,
现在的问题是 比如一个h5界面需要三个串行数据请求之后才能渲染界面 相当于调用了js方法三次,但是只执行了一次js的方法 后面的都没有调用,请问如何解决!!!!
附上我用第三方延展的写法

- (void)webView:(UIWebView *)webView didCreateJavaScriptContext:(JSContext *)ctx


       dispatch_async(dispatch_get_main_queue(), ^//涉及UI更新的操作,放入主线程中
           self.context=[self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
           self.appClient = [[MKWebAppClientObject alloc]init];
//          创建新建类的对象,将他赋值给js的对象
           self.context.name = @"text";
           self.appClient.delegate = self;
           self.context[@"appClient"] = self.appClient;
     NSLog(@"%@ %@",ctx,ctx.name);
   );

为什么问题还依旧存在 附上链接 这个上面好像说的是跟我的一样的情况 但是我按照他的写法虽然也调用了三次 第一次JScontext对象是我想要的 但是后面的两次回调的对象好像是new出来新的不是我想要的 导致我的MKWebAppClientObject代理协议没有被执行 附上stackoverflow上面的链接:[http://stackoverflow.com/questions/18920536/why-use-javascriptcore-in-ios7-if-it-cant-access-a-uiwebviews-runtime/20061331#20061331][2]

以上是关于JavaScript和iOS交互遇到的坑的主要内容,如果未能解决你的问题,请参考以下文章

CEF框架:c++和JS交互走过的坑

WebView中JS调用Android Method 遇到的坑整理

微信H5开发-大多数前端都会遇到的几个兼容性的坑

iOS项目中Json转Model的坑

ios 10 更新所遇到的坑

说一个MySQL里可能90%的程序员都会遇到的坑