OCとJavaScriptのインタラクション

2386 ワード

OCとJavaScriptのインタラクション#
UIWebViewがJavaScriptと対話する方法はstringByEvaluatingJavaScript FromStringです.
OCでJavaScriptメソッドを呼び出す##
[webView stringByEvaluatingJavaScriptFromString:@"first();"];

ここのfirst()がJavaScriptメソッドです.
OCのJavaScriptへの注入方法##
  • まず注入するJavaScriptメソッドを書きます:
  • function showAlert() {
        alert('this is a alert');
    }
    
  • はfirstとして保存する.jsファイル、Xcodeプロジェクトにドラッグして、このjs:
  • に注入します.
    //   js
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"first" ofType:@"js"];
    NSString *jsString = [[NSString alloc] initWithContentsOfFile:filePath]; 
    //   js
    [webView stringByEvaluatingJavaScriptFromString:jsString];
    
  • は、上記のjsを注入し、jsのメソッドをいつでも呼び出すことができます.

  • JavaScriptでOCメソッドを呼び出す##
    原理は、UIWebViewリダイレクト要求を利用して、いくつかのコマンドを私たちのUIWebViewに送信し、UIWebViewのエージェントメソッドでこれらのコマンドを受信し、コマンドに従って対応するOCメソッドを実行することです.これはJavaScriptでOCを呼び出す方法に相当する.
  • まずJavaScriptメソッドを書きます:
  • function sendCommand(paramOne,paramTwo) { 
        var url="testapp:"+paramOne+":"+paramTwo;
        document.location = url;  
    } 
    function clickLink() {  
        sendCommand("alert"," ");  
    } 
    
  • htmlでこのjsメソッドを呼び出します:
  • "button" value="Click me!" onclick="clickLink()" />
    
  • 最終的にUIWebViewでこのリダイレクト要求をキャプチャする:
  • - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {  
        NSString *requestString = [[request URL] absoluteString];  
        NSArray *components = [requestString componentsSeparatedByString:@":"];  
        if ([components count] > 1 && [(NSString *)[components objectAtIndex:0] isEqualToString:@"testapp"]) {  
            if([(NSString *)[components objectAtIndex:1] isEqualToString:@"alert"])   
            {  
                UIAlertView *alert = [[UIAlertView alloc]   
                                      initWithTitle:@"Alert from Cocoa Touch" message:[components objectAtIndex:2]  
                                      delegate:self cancelButtonTitle:nil  
                                      otherButtonTitles:@"OK", nil];  
                [alert show];  
            }  
            return NO;  
        }  
        return YES;  
    }