iOS 的JS 和 OC 交互(一)

  • OC 調(diào)用 JS
  • JS 調(diào)用OC
  1. 預備工作
    首先要 導入 JavaScriptCore.framework 這個庫,然后用來的類 分別是 JSContext , JSValue , JSExport 。

  2. 再來一個 test.html 部分代碼

<a href="#" id="test">JS call OC</a>
    <style>
        a {
            display: block;
            width: 100px;
            height: 50px;
            text-align: center;
            background: red;
            color: #fff;
            line-height: 50px;
            text-decoration: none;
        }
    </style>
    <script>
        document.getElementById('test').onclick = function(){
              //這個方法是 用來 測試 JS調(diào)用 OC 的
             // IOS_Obj 是什么來的奥帘?what ?
             //不要急胸墙,搜索復制粘貼看看细卧,這個類我放在下面也貼出來了
            var a = IOS_Obj.getUser();
            alert(a);
        }
    
    function ocCallJS()
    {
        alert('OC Call JS');
    }
    
    function ocCallJSWithArg(a,b)
    {
        alert('a:'+ a +'   '+'b:'+b);
    }
  1. 有了 html 蚊锹,那么我們 還需要一個 UIWebView
_webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, self.view.frame.size.height)];
_webView.delegate = self;
[self.view addSubview:_webView];
  1. 然后加載上這個html
    這個html 是放在項目里面 的 也可以是 放在服務器 然后讀取

放在項目里面的讀取方式

 NSURL *baseURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
 NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"];
 NSString *html = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
 [_webView loadHTMLString:html baseURL:baseURL];

讀取一個URL 是 這樣讀的

[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"你的html 所在的URL"]]];
  1. 說說這個JSContext 是怎樣獲取的
self.context = [_webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    self.context.exceptionHandler = ^(JSContext *context, JSValue *exception) {
        [JSContext currentContext].exception = exception;
        NSLog(@"exception:%@",exception);
    };
    
    self.obj = [[IOS_Obj alloc] init];
    self.context[@"IOS_Obj"] = self.obj;
//self.context[@"這個值可以自由定義咧虎,自定好了告訴JS 就好"] 
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
//為什么這里也要寫一個呢秒咨?
//因為當跳轉到另外一個html 的時候 self.context 里面的對象被清空了
    self.context[@"IOS_Obj"] = self.obj;
}
  1. 再準備兩個按鈕 用來測試
UIButton *firstBtn = [UIButton buttonWithType:UIButtonTypeCustom];
   firstBtn.frame = CGRectMake(20, 20, 100, 30);
   firstBtn.backgroundColor = [UIColor purpleColor];
   [firstBtn addTarget:self action:@selector(firstBtnAction) forControlEvents:UIControlEventTouchUpInside];
   [firstBtn setTitle:@"OC Call JS" forState:UIControlStateNormal];
   firstBtn.titleLabel.font = [UIFont systemFontOfSize:10];
   [self.view addSubview:firstBtn];

   UIButton *secondBtn = [UIButton buttonWithType:UIButtonTypeCustom];
   secondBtn.frame = CGRectMake(CGRectGetMaxX(firstBtn.frame) + 30, 20, 150, 30);
   secondBtn.backgroundColor = [UIColor purpleColor];
   [secondBtn addTarget:self action:@selector(secondBtnAciton) forControlEvents:UIControlEventTouchUpInside];
   [secondBtn setTitle:@"OC Call JS With Arg" forState:UIControlStateNormal];
   secondBtn.titleLabel.font = [UIFont systemFontOfSize:10];
   [self.view addSubview:secondBtn];
  1. JS 調(diào)用OC 還要準備一個類喇辽,一個實現(xiàn)了JSExport 協(xié)議的類
    h文件
#import <Foundation/Foundation.h>
#import <JavaScriptCore/JavaScriptCore.h>
@protocol JSExportForIOS <JSExport>
-(NSString *)getUser;
@end
@interface IOS_Obj : NSObject<JSExportForIOS>
@end

m文件

@implementation IOS_Obj
//請頭回看看上面的 html 里面的代碼 
-(NSString *)getUser
{
    return @"hello xixi";
}  
@end
  1. 最后看看 之前的Button 里面寫了啥東西

這里面我寫了兩種調(diào)用 OC 調(diào)用JS 的方法,親測有效

-(void) firstBtnAction
{
    //方法一
//    JSValue *function = [self.context objectForKeyedSubscript:@"ocCallJS"];
//    JSValue *result = [function callWithArguments:nil];
    //方法二
    NSString *alertJS = @"ocCallJS()";
    [self.context evaluateScript:alertJS];
}
-(void) secondBtnAciton
{
  //方法一
//    JSValue *function = [self.context objectForKeyedSubscript:@"ocCallJSWithArg"];
//    JSValue *result = [function callWithArguments:[NSArray arrayWithObjects:@"one Arg",@"two Arg", nil]];
    //方法二
    NSString *alertJS = @"ocCallJSWithArg('one Arg','two Arg')"; 
    [self.context evaluateScript:alertJS];
}
  1. 最后有圖有真相
    js_call_oc


    JS_CALL_OC.png

oc_call_js


OC_CALL_JS.png

oc_call_js_with_arg


OC_CALL_JS_with_arg.png

PS: JS調(diào)用OC 的方法: 有時候在加載了html 渲染之后 才能觸發(fā)UIWebView 的 -(void)webViewDidFinishLoad:(UIWebView *)webView 的代理方法雨席,然而我要在這個代理方法里面 設置 JSContext 菩咨,那也只能讓JS 在unload 做一下 延遲100毫秒左右就好。

iOS 的JS 和 OC 交互(二)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陡厘,一起剝皮案震驚了整個濱河市抽米,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌糙置,老刑警劉巖云茸,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谤饭,居然都是意外死亡标捺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門揉抵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亡容,“玉大人,你說我怎么就攤上這事冤今」刖ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵辟汰,是天一觀的道長列敲。 經(jīng)常有香客問我,道長帖汞,這世上最難降的妖魔是什么戴而? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮翩蘸,結果婚禮上所意,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好扶踊,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布泄鹏。 她就那樣靜靜地躺著,像睡著了一般秧耗。 火紅的嫁衣襯著肌膚如雪备籽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天分井,我揣著相機與錄音车猬,去河邊找鬼。 笑死尺锚,一個胖子當著我的面吹牛珠闰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘫辩,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伏嗜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伐厌?” 一聲冷哼從身側響起承绸,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挣轨,沒想到半個月后八酒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡刃唐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年羞迷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片画饥。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡衔瓮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抖甘,到底是詐尸還是另有隱情热鞍,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布衔彻,位于F島的核電站薇宠,受9級特大地震影響,放射性物質發(fā)生泄漏艰额。R本人自食惡果不足惜澄港,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柄沮。 院中可真熱鬧回梧,春花似錦废岂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至详囤,卻和暖如春财骨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藏姐。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工蚓再, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人包各。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像靶庙,于是被迫代替她去往敵國和親问畅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容