麥子學(xué)院
JavaScript與Objective-C互相調(diào)用的方法
發(fā)布時間:2016-08-27 23:19 回復(fù):0 查看:2465 最后回復(fù):2016-08-27 23:19
之前自己閑著無聊寫過幾個套用網(wǎng)頁的“皮包軟件”,其實像這樣的“皮包軟件”也可以做得很高端大氣的,通過WebKit實現(xiàn)的OC-JS Bridge,可以非常方便的實現(xiàn)在JS中調(diào)用OC的方法/在OC中調(diào)用JS的方法。如此一來,便可以通過web實現(xiàn)炫麗的UI,而通過原生API實現(xiàn)與本地相關(guān)的操作。希望這篇文章對學(xué)習(xí)Objective-C的同學(xué)有所幫助。
1、JS中變量在OC中的類型
通過OC-JS Bridge,變量的類型會自動進(jìn)行轉(zhuǎn)換,基本類型都會自動轉(zhuǎn)換,如JS中的number、boolean都會轉(zhuǎn)換成OC中的NSNumber類型,而String類型會自動轉(zhuǎn)換成NSString類型,JS中的對象會轉(zhuǎn)換成WebScriptObject對象,而相關(guān)的屬性信息可以通過Key-Value的方法讀取和寫入,本文后面可看到相關(guān)的代碼。
2、實現(xiàn)在OC中調(diào)用JS方法
在OC中調(diào)用JS方法是非常方便的,WebView有一個windowScriptObject屬性,可以直接獲得腳本對象,然后便可以調(diào)用callWebScriptMethod:withArguments將消息轉(zhuǎn)發(fā)給JS中對象的方法和參數(shù),對于簡單的方法調(diào)用你也可以直接通過WebView的方法stringByEvaluatingJavaScriptFromString去執(zhí)行一段JS代碼,并返回字符串。示例代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//在OC中的調(diào)用 - (void)ocAction:(id)sender { NSArray *args = @[@"Hello,JS!"]; id result = [[webView windowScriptObject] callWebScriptMethod:@"JSFunction" withArguments:args]; NSLog(@"%@",result); } //在JS中對應(yīng)的方法 function JSFunction(parameter) { //顯示OC返回的值 alert(parameter); //返回成功的消息 return 'Web程序已經(jīng)收到消息!'; } |
3、實現(xiàn)JS調(diào)用OC的方法
通過設(shè)置webView的frameLoadDelegate,在– webView:didClearWindowObject:forFrame:回調(diào)方法中,指定一個本地對象(該對象實現(xiàn)WebScripting協(xié)議),然后JS中就可以直接調(diào)用該對象的相關(guān)方法。
OC中的代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
//該方法用于JS中調(diào)用 - (WebScriptObject *)status:(WebScriptObject *)jsObject { //將JS發(fā)過來的信息顯示出來 NSString *message = [jsObject valueForKey:@"message"]; NSLog(@"%@",message); //返回成功的信息(WebScriptObject對象不能自己創(chuàng)建,所以此處復(fù)用了傳入的參數(shù)) [jsObject setValue:@"本地端已經(jīng)收到消息啦!" forKey:@"message"]; return jsObject; } #pragma mark - #pragma mark WebFrameLoadDelegate //通過此回調(diào),將self傳遞給JS環(huán)境 - (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowObject forFrame:(WebFrame *)frame { [windowObject setValue:self forKey:@"native"]; } #pragma mark - #pragma mark WebScriptingProtocol /* 返回是否阻止響應(yīng)該方法, 返回NO即能響應(yīng)該方法 */ + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector { if (selector == @selector(status:)) { return NO; } return YES; } /* 返回本地方法在JS中的名稱(不實現(xiàn)此方法,則JS中方法名與OC中相同) */ + (NSString *)webScriptNameForSelector:(SEL)sel { if (sel == @selector(status:)) { return @"ocMethod"; } return nil; } |
JS中代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
function CallNative() { if (native) { //將消息組裝成對象發(fā)給OC var parameter = {'message':'Hello,Objective-C!'}; var result = native.ocMethod(parameter); //顯示OC返回的結(jié)果 alert(result['message']); } } |
文章來自:博客園/紫風(fēng).づ