为什么不能使用jscontext ?当js调用location.reload()时,将setObject转换为UIWeb

Why can't use JSConext.setObject to UIWebView when js called location.reload() ?

本文关键字:setObject UIWeb 转换 reload location 不能 jscontext 调用 js 为什么      更新时间:2023-09-26

我曾经用Swift写过一个ios应用当我想使用js调用Swift的对象和函数在UIWebView,它出现了一些bug。如下是我的代码:

    //a demo class that I want to export to UIWebView;
    //this object also was 
    @objc protocol  NavObj : JSExport{
            //any code here
            static func callMe() -> String;
    }
    @objc class NavObj : NSObject, NavObj{
            class func callMe() -> String{
                    return "called me";
            }
    }
    class someView : UIViewController , UIWebViewDelegate{
            pubic func webView(
                    webView : UIWebView,
                    shouldStartLoadWithRquest request : NSURLRequest,
                    navigationType : UIWebViewNavigationType
            ) -> Bool {
                //get the JSContext
                var jsContext = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as! JSContext ;
                //and then set NavObj to UIWebView
                jsContext.setObject( NavObj.self , "NavObj" );
            }
    }

在UIWebView代码中,像这样:

       <script type='text/javascript'>
              //get a test
              var ret = NavObj.callMe();
              console.log(ret);
              //When first time to run this code was successed
              //But when use js's location.reload to refresh this page , it appear an error: 
              //NavObj was not defined. 
              location.reload();
       </script>

第一次加载网页成功。但是当使用js的位置。重新加载以刷新此页面,出现错误:未定义NavObj。

意味着我的swift代码

    jsContext.setObject( NavObj.self , "NavObj" );

没有工作。

有办法修复这个错误吗?

这很可能是时间问题。当您导航到一个页面或重新加载该页面时,JSContext将被释放并创建一个新的。页面的JSContext是在页面加载时创建的,但是没有办法知道它何时发生。

我发现最可靠的方法是使用webViewDidFinishLoad方法将事物注入JSContext,然后在完成时触发DOM事件。在网页中,你需要在使用本机对象之前等待该事件。

我也有同样的问题。

对象必须在webView完成加载时设置。

这一行jsContext.setObject( NavObj.self , "NavObj" );移到webViewdidFinishLoad:{}

希望能帮到你