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

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
但是还是没有找到解决方法
第三方的延展我是这样写的 问题还依旧存在

- (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);    });  }
【热门文章】
【热门文章】