Maison  >  Article  >  interface Web  >  Explication détaillée de l'exemple de code pour utiliser JavaScriptCore pour réaliser l'interaction OC et JS

Explication détaillée de l'exemple de code pour utiliser JavaScriptCore pour réaliser l'interaction OC et JS

黄舟
黄舟original
2017-03-28 14:09:291082parcourir

JavaScriptCore est une partie importante du webkit, analysant principalement JS et fournissant une exécution environnement.L'article suivant vous présente principalement les informations pertinentes sur l'utilisation de JavaScriptCore pour réaliser l'interaction entre OC et JS. L'introduction dans l'article est très détaillée. Les amis qui en ont besoin peuvent s'y référer ensemble. >

JavascriptCore

JavascriptCore est une partie importante du webkit, qui analyse principalement JS et fournit un environnement d'exécution après qu'Apple l'ait lancé sur la plate-forme iPhone. facilite notre fonctionnement de js.

Créez d'abord une webView et lisez le fichier html local

 NSURL* htmlURL = [[NSBundle mainBundle] URLForResource: @"demo" withExtension: @"html"];
[_webView loadRequest: [NSURLRequest requestWithURL: htmlURL]];
Dans la démo, nous devons implémenter 4 situations

    JS appelle OC
  1. JS appelle OC et transmet les paramètres
  2. OC appelle JS
  3. OC appelle JS et passe les paramètres

Le code dans le fichier html est le suivant

<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <script type="text/javascript">
 function showAlert(){
  alert(&#39;OC call JS with no argument&#39;);
 }
 function showAlertWithString(string){
  alert(string);
 }
 function callOCWithArgument() {
  jsCallOCWithArgument(&#39;参数1 &#39;,&#39;参数2 &#39;,&#39;参数3&#39;);
 }
 </script>
</head>
<body>
 </br>
 </br>
 </br>
 </br>
 <form>
  <button type=&#39;button&#39; onclick=&#39;callOC()&#39;>jsCallOC</button>
  <button type=&#39;button&#39; onclick=&#39;callOCWithArgument()&#39;>jsCallOCWithArgument</button>
 </form>
</body>
</html>
JS appelle OC

Dans la méthode proxy webViewDidFinishLoad de webView

Nous définissons un bloc puis l'enregistrons dans le contexte, qui est en fait converti dans JS. La fonction nommée callOC. Ensuite, nous exécutons cette fonction directement, et les paramètres passés par
-(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];
  });
 }; 
}


peuvent être acceptés via le tableau [JSContext currentArguments], qui est

Object .

OC appelle JS

pour initialiser deux boutons et implémenter la méthode suivante dans l'événement click

peut réaliser OC appelant JS

- (IBAction)callJS:(id)sender {
 [_context evaluatescript:@"showAlert()"];
}
- (IBAction)callJSWithArguments:(id)sender {

 [_context evaluatescript:@"showAlertWithString(&#39;OC call JS with arguments&#39;)"];
// [_context[@"showAlertWithString"] callWithArguments:@[@"OC call JS with arguments"]];
}

Résumé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn