js(javascript)與OC(Objective-C)互動,ocobjective-c
實質上oc與js的通訊互動就是發送訊息,也即函數調用,iOS7以後官方公布JavaScriptCore framework中很方便我們對他們之間的相互調用。在以前我們只能通過UIWebView的UIWebViewDelegate協議來實現.
1
|
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
|
或者
1
|
- (void)webViewDidStartLoad:(UIWebView *)webView;
|
- oc–>js stringByEvaluatingJavaScriptFromString,其參數是一NSString 字串內容是js代碼(這又可以是一個js函數、一句js代碼或他們的組合),當js函數有傳回值或一句js代碼有值返回可通過stringByEvaluatingJavaScriptFromString的傳回值擷取
- js–>oc 利用webView的重新導向原理(即重新在js中指定document.location的值,此為一url),只要在這個url字串中按自訂的規則指定好所需調用oc中的函數和參數,然後通過OC中的shouldStartLoadWithRequest函數去捕獲處理請求。
一 JS調用OC
js調用iOS分兩種情況
js裡面直接調用方法
js裡面通過對象調用方法
js裡面直接調用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
- (void)webViewDidStartLoad:(UIWebView *)webView{
//首先建立JSContext 對象(此處通過當前webView的鍵擷取到jscontext) JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //其中getCurrentUser就是js的方法名稱,賦給是一個block 裡面是iOS代碼 context[@"getCurrentUser"] = ^() { //在block中寫OC代碼 return [[NSUserDefaults standardUserDefaults]objectForKey:@"MYJSANDOC"]; }; context[@"encodeParam"] = ^() { NSArray *args = [JSContext currentArguments]; NSString *param = [NSString stringWithFormat:@"%@",args[0]]; NSString *result = [[[YXBaseRequestManager alloc]init]encryptUseAES:param key:@"1%7jhs#Zjasd&tr*"]; return result; };
}
|
js裡面通過對象調用方法
在這個方法中我們需要使用到 JSExport
JSExport
是一個協議,自訂協議後,裡面的聲明變數等會對JS開放,我們即可調用。
首先我們要自訂一個協議,添加標頭檔#import <JavaScriptCore/JavaScriptCore.h>
,繼承自NSObject
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
#import <Foundation/Foundation.h> #import <JavaScriptCore/JavaScriptCore.h> //首先建立一個實現了JSExport協議的協議 @protocol JSObjectText <JSExport> //此處我們測試幾種參數的情況 -(void)JSObjectTextPush; @end //讓我們建立的類實現上邊的協議 @interface JSObject : NSObject<JSObjectText> @end
|
在.m中實現
1 2 3 4 5 6 7 8 9 10 11
|
#import "JSObjectText.h" @implementation JSObjectText //本地儲存Key,調用之後, 檢查key是否存在則說明是否條用了原生方法 -(void)JSObjectTextPush { [[NSUserDefaults standardUserDefaults]objectForKey:@"MYJSANDOC"]; }
@end
|
在weibview載入完成之後調用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
-(void)webViewDidFinishLoad:(UIWebView *)webView { //網頁載入完成調用此方法 //首先建立JSContext 對象(此處通過當前webView的鍵擷取到jscontext) JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //第二種情況,js是通過對象調用的,我們假設js裡面有一個對象 testobject 在調用方法 //首先建立我們建立類的對象,將他賦值給js的對象 JSObjectText *text=[JSObjectText new]; context[@"testobject"]=text; //同樣我們也用剛才的方式類比一下js調用方法 NSString *jsStr=@"testobject.JSObjectTextPush()"; [context evaluateScript:jsStr]; }
|
二 OC調用JS
方法很簡單,在載入webview後,通過點擊事件,或者 傳回值,調用stringByEvaluatingJavaScriptFromString
來實現調用JS代碼
1 2 3 4 5 6 7 8 9 10
|
/* * 點擊事件 * 調用javaScript的方法postStr()並取得傳回值 * 輸出傳回值到控制台 */ -(void)ocFromJs:(id)sender { NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"postStr();"]; NSLog(@"JS傳回值:%@",str); } |