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]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值