iOS js oc相互調用(JavaScriptCore)(二)


下來我們使用js調用iOS

js調用iOS分兩種情況

一,js里面直接調用方法

二,js里面通過對象調用方法

 

首先我們看第一種,直接調用方法。

其中用到了iOS的block

 

上代碼

 

 

[objc]  view plain  copy
 在CODE上查看代碼片派生到我的代碼片
  1. -(void)webViewDidFinishLoad:(UIWebView *)webView  
  2. {  
  3.     //網頁加載完成調用此方法  
  4.       
  5.     //iOS調用js  
  6.       
  7.     //首先創建JSContext 對象(此處通過當前webView的鍵獲取到jscontext)  
  8.     JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];  
  9.     
  10.     //js調用iOS  
  11.     //第一種情況  
  12.     //其中test1就是js的方法名稱,賦給是一個block 里面是iOS代碼  
  13.     //此方法最終將打印出所有接收到的參數,js參數是不固定的 我們測試一下就知道  
  14.     context[@"test1"] = ^() {  
  15.         NSArray *args = [JSContext currentArguments];  
  16.         for (id obj in args) {  
  17.             NSLog(@"%@",obj);  
  18.         }  
  19.     };  
  20.     //此處我們沒有寫后台(但是前面我們已經知道iOS是可以調用js的,我們模擬一下)  
  21.     //首先准備一下js代碼,來調用js的函數test1 然后執行  
  22.     //一個參數  
  23.     NSString *jsFunctStr=@"test1('參數1')";  
  24.     [context evaluateScript:jsFunctStr];  
  25.       
  26.     //二個參數  
  27.     NSString *jsFunctStr1=@"test1('參數a','參數b')";  
  28.     [context evaluateScript:jsFunctStr1];  
  29.       
  30. }  


以上代碼中 給test1賦值的block要是執行了那么結果就是對的,js調用了iOS

 

我們看結果

 

我們看到參數被打印出來了,而且一個參數和兩個參數都可以,也符合js參數個數不限制

 

 

下來我們看第二種情況 就是js 中是通過一個對象來調用方法的。

此處稍微復雜一點我們需要使用到

JSExport

凡事添加了JSExport協議的協議,所規定的方法,變量等 就會對js開放,我們可以通過js調用到

 


如果js是一個參數或者沒有參數的話 就比較簡單,我們的方法名和js的方法名保持一致即可

比如: js方法為  

[objc]  view plain  copy
 在CODE上查看代碼片派生到我的代碼片
  1. testobject.TestOneParameter('參數1')  

 

 

那么 我們在oc中添加的代理方法就為

 

[objc]  view plain  copy
 在CODE上查看代碼片派生到我的代碼片
  1. -(void)TestOneParameter:(NSString *)message;  

 

 

如果js是多個參數的話  我們代理方法的所有變量前的名字連起來要和js的方法名字一樣

比如: js方法為  

 

[objc]  view plain  copy
 在CODE上查看代碼片派生到我的代碼片
  1. testobject.TestTowParameterSecondParameter('參數A','參數B')  

他有兩個參數 那么我們的代理方法 就是把js的方法名 TestTowParameterSecondParameter 任意拆分成兩段作為代理方法名(此處我們拆分為 TestTowParameter 和 SecondParameter ) 那么我們的代理方法就是

 

 

[objc]  view plain  copy
 在CODE上查看代碼片派生到我的代碼片
  1. -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;  

我們看代理方法有兩個變量別名

 

TestTowParameter 和 SecondParameter 

他兩個拼接起來就剛好是我們js的方法名

 

 

此處有點繞。我們直接看代碼

 

首先創建一個類 繼承NSObject 並且規定一個協議

 

[objc]  view plain  copy
 在CODE上查看代碼片派生到我的代碼片
  1. #import <Foundation/Foundation.h>  
  2. #import <JavaScriptCore/JavaScriptCore.h>  
  3.   
  4. //首先創建一個實現了JSExport協議的協議  
  5. @protocol TestJSObjectProtocol <JSExport>  
  6.   
  7. //此處我們測試幾種參數的情況  
  8. -(void)TestNOParameter;  
  9. -(void)TestOneParameter:(NSString *)message;  
  10. -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;  
  11.   
  12. @end  
  13.   
  14. //讓我們創建的類實現上邊的協議  
  15. @interface TestJSObject : NSObject<TestJSObjectProtocol>  
  16.   
  17. @end  


類的實現

 

 

[objc]  view plain  copy
 在CODE上查看代碼片派生到我的代碼片
  1. #import "TestJSObject.h"  
  2.   
  3. @implementation TestJSObject  
  4.   
  5. //一下方法都是只是打了個log 等會看log 以及參數能對上就說明js調用了此處的iOS 原生方法  
  6. -(void)TestNOParameter  
  7. {  
  8.     NSLog(@"this is ios TestNOParameter");  
  9. }  
  10. -(void)TestOneParameter:(NSString *)message  
  11. {  
  12.     NSLog(@"this is ios TestOneParameter=%@",message);  
  13. }  
  14. -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2  
  15. {  
  16.    NSLog(@"this is ios TestTowParameter=%@  Second=%@",message1,message2);  
  17. }  
  18. @end  



 

 

下面我們在weibview加載完成之后調用測試一下

 

代碼如下:

 

[objc]  view plain  copy
 在CODE上查看代碼片派生到我的代碼片
  1. -(void)webViewDidFinishLoad:(UIWebView *)webView  
  2. {  
  3.     //網頁加載完成調用此方法  
  4.       
  5.     //首先創建JSContext 對象(此處通過當前webView的鍵獲取到jscontext)  
  6.     JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];  
  7.       
  8.     //第二種情況,js是通過對象調用的,我們假設js里面有一個對象 testobject 在調用方法  
  9.     //首先創建我們新建類的對象,將他賦值給js的對象  
  10.       
  11.     TestJSObject *testJO=[TestJSObject new];  
  12.     context[@"testobject"]=testJO;  
  13.       
  14.     //同樣我們也用剛才的方式模擬一下js調用方法  
  15.     NSString *jsStr1=@"testobject.TestNOParameter()";  
  16.     [context evaluateScript:jsStr1];  
  17.     NSString *jsStr2=@"testobject.TestOneParameter('參數1')";  
  18.     [context evaluateScript:jsStr2];  
  19.     NSString *jsStr3=@"testobject.TestTowParameterSecondParameter('參數A','參數B')";  
  20.     [context evaluateScript:jsStr3];  
  21.       
  22. }  



 

結果如下圖

 

好了 我們看到了結果 三個方法都調用了 

ok兩種方式都完成了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM