iOS與JS交互,OC調用JS方法,JS調用OC方法,URL解碼


 首先 iOS7開始 蘋果公佈了JavaScriptCore.framework 它使得JS與OC的交互更加方便了。

 第一步:導入framework

  OC 調用JS方法 :(一句話即可)

-(void)webViewDidFinishLoad:(UIWebView *)webView

     // JS url加載完成後,可直接調用JS方法showmessage。 如果有需求,還可以傳遞參數。

     [myWebView stringByEvaluatingJavaScriptFromString:@"showmessage('參數')"];

     // 若JS有返回值此方法會直接返回。返回的格式爲URL編碼格式,所以必須解碼才能使用。 下邊是解碼方法

        例如: NSString *data = [myWebView stringByEvaluatingJavaScriptFromString:@"showmessage('參數')"];
}


// URL 解碼

- (NSString *)decodeFromPercentEscapeString: (NSString *) input

{

    NSMutableString *outputStr = [NSMutableString stringWithString:input];

    [outputStr replaceOccurrencesOfString:@"+"

                               withString:@" "

                                  options:NSLiteralSearch

                                    range:NSMakeRange(0, [outputStr length])];

    

    return [outputStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

}



 

JS調用OC方法:


  // webView 的代理方法, 網頁加載之前調用。看到之前有同學提供的例子。

首先在js中聲明方法

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <html>  
  2.     <head>  
  3.         <meta http-equiv="content-type"content="text/html;charset=utf-8">  
  4.             <title>js調用oc</title>  
  5.             <script type="text/javaScript">  
  6.                 /* 調用本地帶參數的方法 */  
  7.                 function testFunction1(cmd,parameter1){  
  8.                     return document.location="objc://"+cmd+":/"+parameter1; //cmd代表objective-c中的的方法名,parameter1自然就是參數了  
  9.                 }  
  10.                 /* 調用本地不帶參數的方法 */  
  11.                 function testFunction2(cmd){  
  12.                     return document.location="objc://"+cmd; //cmd代表objective-c中的的方法名  
  13.                 }  
  14.             </script>  
  15.             </head>  
  16.     <body>  
  17.         <p><button type="text" id="text1" value="點擊這裏1"onclick="testFunction1('printLog:','str')">調用本地帶參數的方法</button></p>  
  18.         <p><button type="text" id="text2" value="點擊這裏2"onclick="testFunction2('testFunc')">調用本地不帶參數的方法</button></p>  
  19.     </body>    
  20. </html>  

再調用webview代理

[objc] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType  
  2. {  
  3.     NSString *urlString = [[request URL] absoluteString];  
  4.     NSArray *urlComps = [urlStringcomponentsSeparatedByString:@"://"];  
  5.     if([urlComps count] && [[urlCompsobjectAtIndex:0] isEqualToString:@"objc"])  
  6.     {  
  7.         NSArray *arrFucnameAndParameter = [(NSString*)[urlCompsobjectAtIndex:1] componentsSeparatedByString:@":/"];  
  8.         NSString *funcStr = [arrFucnameAndParameterobjectAtIndex:0];  
  9.         if (1 == [arrFucnameAndParametercount])  
  10.         {  
  11.             // 沒有參數  
  12.             if([funcStr isEqualToString:@"testFunc"])  
  13.             {  
  14.                 /*調用本地函數*/  
  15.                 [self testFunc];  
  16.             }  
  17.         }  
  18.         else if(2 == [arrFucnameAndParametercount])  
  19.         {  
  20.             //有參數的  
  21.             if([funcStr isEqualToString:@"printLog:"] && [arrFucnameAndParameterobjectAtIndex:1])  
  22.             {  
  23.                 /*調用本地函數*/  
  24.                 [self printLog:@"js調用本地帶參數的方法成功!"];  
  25.             }   
  26.         }   
  27.         return NO;   
  28.     };   
  29.     return YES;  
  30. }  
  31.   
  32. - (void)printLog:(NSString *)str  
  33. {  
  34.     NSLog(@"%@", str);  
  35. }  
  36.   
  37. - (void)testFunc  
  38. {  
  39.     NSLog(@"js調用本地不帶參數的方法成功!");  




發佈了43 篇原創文章 · 獲贊 13 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章