首页 > JavaScript和iOS交互遇到的坑

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]

问题已经解决,不是客户端的问题,是js的问题,我把返回的结果传给了js,我是字符串传递过去的,而js默认是json解析的,导致第一次请求之后没有走以后的请求。上面我提到的就是解决uiwebview在渲染的时候调用js方法的答案,那种做法是正确的


如果兼容性在iOS8以上,可以试试WKWebView

【热门文章】
【热门文章】