前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >IOS JavaScriptCore 跳转失去对象和一些BUG总结

IOS JavaScriptCore 跳转失去对象和一些BUG总结

作者头像
星宇大前端
发布2019-01-15 11:47:09
7680
发布2019-01-15 11:47:09
举报
文章被收录于专栏:大宇笔记大宇笔记

引: 以前做项目的时候也做过webview和js交互,以为会手到擒来。结果WTFK、两天的时间来研究它。主要遇到了一个BUG,下面简单的说一下。

  下面一段代码注入时机的选择,这是一个很重要的问题。

    context = [_webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

//打印异常

context.exceptionHandler = ^(JSContext *context1, JSValue *exceptionValue) {

        context1.exception = exceptionValue;

NSLog(@"%@", exceptionValue);

    };

context[@"object"] =self; //以JSExport协议关联 native的方法

①  在webViewDidStartLoad注入

   现象: 在UIWebView的webViewDidStartLoad阶段创建JSContext并暴露oc端的方法,在加载一级页面时js正常调用oc的方法,而跳转到二级页面中却无法执行oc的方法;而在webViewDidStartLoad阶段由于并未加载完js文件, 因此js层定义的函数在oc端无法执行。

    原因:我跟踪了jsContext二级页面根本没有创建,这时候的jsContext还是第一次加载页面的那个对象。所以JS无法获取对象执行oc方法。

②在webVIewDidFinishLoad创建

   现象:由于加载js阶段在webVIewDidFinishLoad阶段之前,因此一级页面js无法调用oc方法,但是二级页面同理也是如此

  原因: 如果JS的调用OC的方法,也就是在webview加载之前那就掉不起来。因为之前JS无法获得OC对象  

 解决办法:

    1., 可以通过在js设置setTimeout来让任务放到执行队列的末端,先执行oc层的webVIewDidFinishLoad方法,待任务完成后再执行js中的异步代码,通过这种方式可以完成js调用oc方法; 或者JS设置一个监听监听OC是否加载完成,如果完成就调用方法。

   2.用一个私有API,监听何时创建好jscontext,在这时候注入。这个方法很好,只是苹果不允许上架。哎

https://github.com/TomSwift/UIWebView-TS_JavaScriptContext

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年01月06日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档