iOS 에서 JS 와 OC 데이터 의 상호작용 요약

4685 단어
iOS 개발 과정 에서 UIWebView 와 자주 접촉 하 는데 그 중에서 JS 와 OC 의 데이터 상호작용 이 불가피 하 다. 오늘 은 이 중의 몇 가지 방법 을 요약 한다.
OC 에서 JS 를 호출 하 는 방법
  • UIWebView 의 stringByEvaluatingJavaScriptFromString 방법
     ====OC    ====
    - (IBAction)didClickButton:(id)sender {
        NSString *name = @"lisi";
        NSString *jsStr = [NSString stringWithFormat:@"changeName(\"%@\")",name];
        [self.webview stringByEvaluatingJavaScriptFromString:jsStr];
    }
    
     ====Html     ====
     
        function changeName(name){
            var div = document.getElementById("mydiv");
            div.innerHTML = name;
        }
     
     
        
    name:
    zhangsan
  • 그러나 이 방법 은 동기 화 방법 으로 JS 방법 을 실행 할 때 JS 방법 이 비교적 소모 되면 인터페이스 가 끊 길 수 있 습 니 다. 이때 시간 이 오래 걸 리 는 js 방법 을 setTimeout 에 넣 으 면 됩 니 다. 물론 하위 스 레 드 에서 호출 stringByEvaluatingJavaScriptFromString 을 시도 하면 정확 하지 않 습 니 다. 오 류 를 보고 하 는 정 보 는 다음 과 같 습 니 다.
    Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...
  • 활용 JavaScriptCore 을 통 해 현재 iOS 7 이후 애플 은 새로운 라 이브 러 리 JavaScriptCore 를 추가 했다. 그 는 webkit 의 중요 한 구성 부분 으로 주로 JS 를 분석 하고 집행 환경 을 제공 하여 우리 가 js 에 대한 조작 을 매우 편리 하 게 했다. 여기 서 나 는 UIWebView 의 분 류 를 만 들 었 는데 주요 역할 은 webView 의 문맥 을 얻 는 것 이다.js 조작 에 편리 함: / * * 흑 마법 브리지 js * / @ interface UIWebView (JScontext) - (nullable JScontext *) context; @end
      #import "UIWebView+JSContext.h"
      @implementation UIWebView (JSContext)
      - (JSContext *)context {
          return  [self valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
      }
      @end
    
    iOS 네 이 티 브 단 추 를 누 르 면 js 코드 를 실행 합 니 다: - (IBAction) didClickButton: (id) sender {NSString * name = @ "lisi"; NSString * jsStr = [NSString stringWithFormat: @ "changeName ("% @ ")", name]; JScontext * context = self. webview. context; [context evaluate Script: jsStr];}
  • JS OC 호출 방법
  • JS 가 가짜 url 요청 을 보 낸 다음 웹 뷰 의 에이전트 방법 에서 이 요청 을 차단 하고 해당 하 는 처리
     ====OC    ====       
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
        //  OC    
        if ([request.URL.scheme isEqualToString:@"bridge"]) {
            //  OC                
            // .......
            return NO;
        }
        return YES;
    }
    
     ====Html     ====
     
      function test() {
          var mydiv = document.getElementById("mydiv");
          window.location.href="bridge://" + mydiv.innerHTML;
      }
     
     
        
    name:
    zhangsan
  • 그러나 html 파일 의 test () 가 사용 하 는 window. location 방식 은 여러 번 요청 할 때 겹 쳐 지 는 문제 가 존재 하기 때문에 다음 과 같은 방식 을 사용 합 니 다. & lt;br> function loadURL(url) {<br> var tempElement;<br> tempElement = document.createElement("tempElement");<br> tempElement.setAttribute("src", url);<br> tempElement.setAttribute("style", "display:none;");<br> tempElement.setAttribute("height", "0px");<br> tempElement.setAttribute("width", "0px"); & lt; br & gt; tempElement. setAttribute ("frameborder", "0"); & lt; br & gt; document. body. appendChild (tempElement); & lt; br & gt; / 요청 을 하면 이 tempElement 가 소 용이 없 기 때문에 dom 에서 & lt; br & gt; tempElement. parentNode. removeChild (tempElement); & lt; br & gt; tempElement = null; & lt; br & gt;} & lt;br> function test() {<br> var mydiv = document.getElementById("mydiv");<br> loadURL("bridge://" + mydiv.innerHTML);<br> }<br>
  • JavaScriptCore 사용 - (void) webViewDidFinishLoad: (UIWebView *) webView {
        JSContext *context = webView.context;
        //  JS    
        context[@"myName"] = @"sunsb";
        //  JS    
        context[@"test3"] = ^(){
           //        OC  ......
           // ##  :      
           NSLog(@"  js   OC    
    :%@
    ",[NSThread currentThread]); NSArray *args = [JSContext currentArguments]; for (JSValue *value in args) { NSLog(@"%@",value.toString); } }; } ====Html ==== function test() { // myName OC alert(myName); // test3 OC test3("one","two","three"); }
    name:
    zhangsan
  • 좋은 웹페이지 즐겨찾기