當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
js(javascript)与OC(Objective-C)交互
生活随笔
收集整理的這篇文章主要介紹了
js(javascript)与OC(Objective-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 | |
在.m中實現
| 1 2 3 4 5 6 7 8 9 10 11 |
在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); } |
轉載于:https://www.cnblogs.com/jgCho/p/5882705.html
總結
以上是生活随笔為你收集整理的js(javascript)与OC(Objective-C)交互的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: erlang mnesia数据库简单应用
- 下一篇: 如何在博客园的博客中添加可运行的JS(转