標籤:
http://blog.csdn.net/lwjok2007/article/details/47058795
上節地址 http://blog.csdn.net/lwjok2007/article/details/47058101
接著上節我們講到的iOS調用js
下來我們使用js調用iOS
js調用iOS分兩種情況
一,js裡面直接調用方法
二,js裡面通過對象調用方法
首先我們看第一種,直接調用方法。
其中用到了iOS的block
上代碼
[objc] view plaincopy
- -(void)webViewDidFinishLoad:(UIWebView *)webView
- {
- //網頁載入完成調用此方法
-
- //iOS調用js
-
- //首先建立JSContext 對象(此處通過當前webView的鍵擷取到jscontext)
- JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
-
- //js調用iOS
- //第一種情況
- //其中test1就是js的方法名稱,賦給是一個block 裡面是iOS代碼
- //此方法最終將列印出所有接收到的參數,js參數是不固定的 我們測試一下就知道
- context[@"test1"] = ^() {
- NSArray *args = [JSContext currentArguments];
- for (id obj in args) {
- NSLog(@"%@",obj);
- }
- };
- //此處我們沒有寫後台(但是前面我們已經知道iOS是可以調用js的,我們類比一下)
- //首先準備一下js代碼,來調用js的函數test1 然後執行
- //一個參數
- NSString *jsFunctStr=@"test1(‘參數1‘)";
- [context evaluateScript:jsFunctStr];
-
- //二個參數
- NSString *jsFunctStr1=@"test1(‘參數a‘,‘參數b‘)";
- [context evaluateScript:jsFunctStr1];
-
- }
以上代碼中 給test1賦值的block要是執行了那麼結果就是對的,js調用了iOS
我們看結果
我們看到參數被列印出來了,而且一個參數和兩個參數都可以,也符合js參數個數不限制
下來我們看第二種情況 就是js 中是通過一個對象來調用方法的。
此處稍微複雜一點我們需要使用到
JSExport
凡事添加了JSExport協議的協議,所規定的方法,變數等 就會對js開放,我們可以通過js調用到
此處有點繞。我們直接看代碼
首先建立一個類 繼承NSObject 並且規定一個協議
[objc] view plaincopy
- #import <Foundation/Foundation.h>
- #import <JavaScriptCore/JavaScriptCore.h>
-
- //首先建立一個實現了JSExport協議的協議
- @protocol TestJSObjectProtocol <JSExport>
-
- //此處我們測試幾種參數的情況
- -(void)TestNOParameter;
- -(void)TestOneParameter:(NSString *)message;
- -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
-
- @end
-
- //讓我們建立的類實現上邊的協議
- @interface TestJSObject : NSObject<TestJSObjectProtocol>
-
- @end
類的實現
[objc] view plaincopy
- #import "TestJSObject.h"
-
- @implementation TestJSObject
-
- //一下方法都是只是打了個log 等會看log 以及參數能對上就說明js調用了此處的iOS 原生方法
- -(void)TestNOParameter
- {
- NSLog(@"this is ios TestNOParameter");
- }
- -(void)TestOneParameter:(NSString *)message
- {
- NSLog(@"this is ios TestOneParameter=%@",message);
- }
- -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2
- {
- NSLog(@"this is ios TestTowParameter=%@ Second=%@",message1,message2);
- }
- @end
下面我們在weibview載入完成之後調用測試一下
代碼如下:
[objc] view plaincopy
- -(void)webViewDidFinishLoad:(UIWebView *)webView
- {
- //網頁載入完成調用此方法
-
- //首先建立JSContext 對象(此處通過當前webView的鍵擷取到jscontext)
- JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
-
- //第二種情況,js是通過對象調用的,我們假設js裡面有一個對象 testobject 在調用方法
- //首先建立我們建立類的對象,將他賦值給js的對象
-
- TestJSObject *testJO=[TestJSObject new];
- context[@"testobject"]=testJO;
-
- //同樣我們也用剛才的方式類比一下js調用方法
- NSString *jsStr1=@"testobject.TestNOParameter()";
- [context evaluateScript:jsStr1];
- NSString *jsStr2=@"testobject.TestOneParameter(‘參數1‘)";
- [context evaluateScript:jsStr2];
- NSString *jsStr3=@"testobject.TestTowParameterSecondParameter(‘參數A‘,‘參數B‘)";
- [context evaluateScript:jsStr3];
-
- }
結果如
好了 我們看到了結果 三個方法都調用了
ok兩種方式都完成了
原始碼我們上傳到群空間[TestJSOC.zip]有需要的去下載
iOS js oc相互調用(JavaScriptCore)(二)