JavaScriptCore
JavaScriptCore is an important part of webkit, mainly parsing JS and providing an execution environment. After iOS7, Apple launched it on the iPhone platform, which greatly facilitated our operation of js.
First create a webView and read the local html file
NSURL* htmlURL = [[NSBundle mainBundle] URLForResource: @"demo" withExtension: @"html"]; [_webView loadRequest: [NSURLRequest requestWithURL: htmlURL]];
In the demo, we need to implement 4 situations
- JS calls OC
- JS calls OC and passes parameters
- OC calls JS
- OC calls JS and passes parameters
The code in the html file is as follows
<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('Parameter 1','Parameter 2','Parameter 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 calls OC
Proxy method of webView in webViewDidFinishLoad
-(void)webViewDidFinishLoad:(UIWebView *)webView { _context = [webView valueForKeyPath:@""]; __weak typeof(self) weakSelf = self; _context.exceptionHandler = ^(JSContext *context, JSValue *exception) { = exception; }; //js calls OC _context[@"callOC"] = ^() { NSArray *args = [JSContext currentArguments]; for (JSValue *jsVal in args) { NSLog(@"%@", ); } 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:]; } 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]; }); }; }
We define a block and save it to the context, which is actually converted into a function named callOC in JS. Then we directly execute this function, and the contents in our block are called.
The passed parameters can be accepted through the array [JSContext currentArguments], which is a JSValue object.
OC calls JS
Initialize two Buttons and implement the following method in the click event
- (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"]]; }
It can implement OC calling JS.
Demo has been uploaded, you canClick here to downloadCheck.
Summarize
The above is the entire content of this article. I hope the content of this article will be of some help to your study or work. If you have any questions, you can leave a message to communicate.