JavaScriptCore - JScontext OC 와 JS 의 상호작용 실현

다음으로 전송:http://blog.csdn.net/kaka_2928 / article / details / 51463571 내용: 1. webView 에서 JScontext 를 가 져 옵 니 다.2. Objective - C 에서 javeScript 호출 하기;3. javeScript 에서 Objective - C 호출 하기;
앞 에 적 으 십시오: 최근 프로젝트 에서 native APP 는 기본 적 인 기능 을 제공 합 니 다. 일부 업 무 는 h5 에 놓 여 있 습 니 다. 상호작용 체험 을 향상 시 키 기 위해 native 에서 작 동 하고 webview 에서 일치 하도록 Objective - C 와 javeScript 의 인 터 랙 션 인 터 페 이 스 를 제공 해 야 합 니 다. 프로젝트 지원 버 전 IOS 7 때 문 입 니 다. IOS 7 이후 javascriptcore. framework 와 h5 의 통신 도 예전 보다 훨씬 간단 해 졌 습 니 다.그렇게 많은 url shcema 를 정의 할 필요 가 없습니다. javascriptcore 를 통 해 Objective - C 와 javeScript 의 상호작용 을 직접 완성 할 수 있 습 니 다.
1. webView 에서 JScontext 의 획득 은 javascriptcore 인 터 랙 션 을 사용 하 는 핵심 은 webview 에서 현재 JScontext 를 얻 고 JScontext 에서 해당 하 는 동작 을 수행 하 는 것 입 니 다. 일반적인 경우 아래 인 터 페 이 스 를 통 해 현재 페이지 의 JScontext 를 얻 을 수 있 습 니 다.
_defaultContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

웹 뷰 에서 서로 다른 페이지 전환 이 이 루어 졌 다 면 새로운 페이지 로 딩 이 완 료 될 때마다 현재 기 록 된 JScontext 를 새로 고침 하여 JScontext 가 실시 간 으로 유효 하도록 해 야 합 니 다.
-(void)webViewDidFinishLoad:(UIWebView *)webView {

    //           
    _defaultContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    }

2. Objective - C 에서 javeScript 를 호출 하 는 부분 은 비교적 간단 합 니 다. 두 가지 방법 으로 선택 할 수 있 습 니 다. 첫 번 째 방안 은 javeScript 가 제공 하 는 인터페이스, 전 참 을 직접 사용 할 수 있 습 니 다.
//  JS   login  
[webView stringByEvaluatingJavaScriptFromString:@"login('username','password')"];

두 번 째 방안 은 JScontext 를 사용 하여 해당 하 는 인 터 페 이 스 를 가 져 온 후 사용 - (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script; 또는 - (JSValue *)callWithArguments:(NSArray *)arguments;
[_defaultContext evaluateScript:@"login('username','password')"];
//   JSContext   JS   ,  
 JSValue *JSfunc =_defaultContext[@"login"];       

 [JSfunc callWithArguments:@[@'username',@'password']]; 

3. javeScript 는 Objective - C 를 호출 합 니 다. 이것 은 javascriptcore 가 제공 하 는 JSexport 를 사용 해 야 합 니 다. Objective - C 에서 이 protocol 을 실현 하 는 방법 은 javeScript 에서 사용 할 수 있 는 인터페이스 입 니 다.JSexport 는 언어 간 에 제공 되 는 protocol 에 해당 합 니 다.
#include 
// Protocol to list bindings
@protocol JSBridgeExport 

// webview    native       
- (void)showTip:(NSString *)tip;

@end

@interface JSBridge : NSObject 
@end
@implementation JSBridge
- (void)showTip:(NSString *)tip{
    [TopWindow makeToast:tip];
}
@end

우선 현재 JScontext 에서 클래스 등록 - (JSValue )evaluateScript:(NSString )script; 을 한 다음 JS 에서 jsbridge 를 통 해 OC 가 제공 하 는 방법 인 터 페 이 스 를 호출 할 수 있 습 니 다.
[_defaultContext evaluateScript:@"jsbridge.showTip(\"this is a tip from webview\")"];

존재 하 는 문제점: 첫 번 째 단계 에서 JScontext 를 새로 고침 한 것 처럼 서로 다른 페이지 를 새로 고침 한 후에 OC 를 JS 에 제공 하 는 방법 으로 등록 하여 현재 JS 환경 에서 제공 하 는 인터페이스 가 유효 하도록 확보 해 야 합 니 다.
-(void)webViewDidFinishLoad:(UIWebView *)webView {

    //           
    //      JSContext,    
    _defaultContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    _defaultContext[@"jsbridge"] = [[JSBridge alloc]init];
    }

좋은 웹페이지 즐겨찾기