js(javascript)與OC(Objective-C)互動,ocobjective-c

來源:互聯網
上載者:User

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);
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.