JavaScriptCore는 웹킷의 중요한 부분으로 주로 JS를 구문 분석하고 실행을 제공합니다. 다음 글에서는 JavaScriptCore를 사용하여 OC와 JS 간의 상호작용을 구현하는 방법에 대한 정보를 주로 소개합니다. 필요한 친구들은 함께 살펴보세요. >
JavascriptCore
JavascriptCore는 주로 JS를 파싱하고 실행 환경을 제공하는 부분입니다. 이는 큰 성공을 거두었습니다.먼저 webView를 만들고 로컬 HTML 파일을 읽습니다.
NSURL* htmlURL = [[NSBundle mainBundle] URLForResource: @"demo" withExtension: @"html"]; [_webView loadRequest: [NSURLRequest requestWithURL: htmlURL]];데모에서는 4가지 상황 구현
html 파일의 코드는 다음과 같습니다
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript"> function showAlert(){ alert('OC call JS with no argument'); } function showAlertWithString(string){ alert(string); } function callOCWithArgument() { jsCallOCWithArgument('参数1 ','参数2 ','参数3'); } </script> </head> <body> </br> </br> </br> </br> <form> <button type='button' onclick='callOC()'>jsCallOC</button> <button type='button' onclick='callOCWithArgument()'>jsCallOCWithArgument</button> </form> </body> </html>
JS는 OC를 호출합니다
webView의 프록시 메소드 webViewDidFinishLoad-(void)webViewDidFinishLoad:(UIWebView *)webView { _context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javascriptContext"]; weak typeof(self) weakSelf = self; _context.exceptionHandler = ^(JSContext *context, JSValue *exception) { weakSelf.context.exception = exception; }; //js调用OC _context[@"callOC"] = ^() { NSArray *args = [JSContext currentArguments]; for (JSValue *jsVal in args) { NSLog(@"%@", jsVal.toString); } dispatch_async(dispatch_get_main_queue(), ^{ UIAlertController *alertView = [UIAlertController alertControllerWithTitle:@"arguments" message:@"JS Call OC With No Argument" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction * action = [UIAlertAction actionWithTitle:@"Done" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { }]; [alertView addAction:action]; [weakSelf presentViewController:alertView animated:YES completion:nil]; }); }; _context[@"jsCallOCWithArgument"] = ^() { NSArray *args = [JSContext currentArguments]; NSMutableString * stirng = [NSMutableString string]; for (JSValue * value in args) { [stirng appendString:value.toString]; } dispatch_async(dispatch_get_main_queue(), ^{ UIAlertController *alertView = [UIAlertController alertControllerWithTitle:@"arguments" message:stirng preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction * action = [UIAlertAction actionWithTitle:@"Done" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { }]; [alertView addAction:action]; [weakSelf presentViewController:alertView animated:YES completion:nil]; }); }; }에서 블록을 정의한 다음 실제로 변환되는 컨텍스트에 저장합니다. 그런 다음 이 함수를 직접 실행하면
를 호출하여 두 개의 Button을 초기화하고
- (IBAction)callJS:(id)sender { [_context evaluatescript:@"showAlert()"]; } - (IBAction)callJSWithArguments:(id)sender { [_context evaluatescript:@"showAlertWithString('OC call JS with arguments')"]; // [_context[@"showAlertWithString"] callWithArguments:@[@"OC call JS with arguments"]]; }클릭
이벤트 JS 호출 OC 구현
요약
위 내용은 OC와 JS 상호작용을 구현하기 위해 JavaScriptCore를 사용한 샘플 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!