• UIWebView 获取当前的javascript上下文,并js,oc互调


    OC调用UIWebView 中的js,网上例子很多,最常用的是UIWebView自带的一个方法;

    - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

    UIWebView 中的js 掉用本地的oc方法;

    通过UIWebView开始加载请求的代理方法中,去解析OC跟js约定好的协议(比如约定协议objtc://)

    比如<a href="objtc://function">调用oc</a>

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{

      NSString *urlString = [[request URL] absoluteString];

      if( [urlString hasPrefix:@"objtc://"] ){

        //调用oc本地方法

        NSLog(@"....");

      }

    }

     

    第二种方法,比如OC类A中有个UIWebView,UIWebView的js想调用OC类A中的方法,

    对于JSContext,JSValue跟OC对象的相互转换,获取js的window文档树,或者其他交互功能,百度很多

    1)新建一个协议继承JSExport

    #import <JavaScriptCore/JavaScriptCore.h>

    #import "objc/runtime.h"

     

    @protocol LLCExport <JSExport>

    //UIWebView中的js,就可以通过appPushPageTitle(url,title)调用此协议的这个方法

    -(void)appPushPage:(NSString*)url title:(NSString*)title;

    @end

    2)获取类A 的当前UIWebView中的上下文对象JSContext,

    self.jsc = [self.webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    3)类A 实现 LLCExport中的方法

    -(void)appPushPage:(NSString*)url title:(NSString*)title{

        UIViewController *pvc = [[UIViewController alloc] init];

        pvc.title = title;

        pvc.strUrl = url;

        [self.navigationController pushViewController:pvc animated:YES];

    }

    4)当UIWebView加载完毕后,给类A动态加自定义的LLCExport协议,然后把类A对象赋值给JSContext中自定义的“APP_NATIVE”对象

    - (void)webViewDidFinishLoad:(UIWebView *)webView{

      class_addProtocol(self.class,@protocol(LLCExport));

      self.jsc["APP_NATIVE"] = self;

    }

    5)js里面就可以通过window.APP_NATIVE.appPushPageTitle("http://www.baidu.com","百度");

    来调用OC类A中的-(void)appPushPage:(NSString*)url title:(NSString*)title;这个方法了

     

  • 相关阅读:
    [C#] 生成 (web): 未能加载文件或程序集“Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7
    约束布局ConstraintLayout加快布局速度
    微信小程序上传图片(附后端代码)
    Kubernetes1.5正式发布
    Codeforces Round #200 (Div. 1) D. Water Tree(dfs序加线段树)
    1
    流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
    webrtc进阶-信令篇-之三:信令、stun、turn、ice
    6)协程三( asyncio处理并发)
    5)协程二(yeild from)
  • 原文地址:https://www.cnblogs.com/loganv/p/3737921.html
Copyright © 2020-2023  润新知