zoukankan      html  css  js  c++  java
  • 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;这个方法了

     

  • 相关阅读:
    POJ
    POJ
    HDU——1027Ignatius and the Princess II(next_permutation函数)
    HDU——1106排序(istringstream的使用、STLvector练习)
    HDU——2054A==B?
    HDU——2087剪花布条
    HDU——2064汉诺塔III
    HDU——2068RPG的错排(错排公式)
    HDU——1789Doing Homework again(贪心)
    HDU——2067小兔的棋盘(卡特兰数&递推DP)
  • 原文地址:https://www.cnblogs.com/loganv/p/3737921.html
Copyright © 2011-2022 走看看