最近用到JS和OC原生方法調用的問題,查了許多資料都語焉不詳,自己記錄一下吧,如果有誤歡迎聯繫我指出。 JS中調用OC方法有三種方式: 先上OC代碼 // 設置javaScriptContext上下文 self.jsContext = [self.webView valueForKeyPath:@" ...
最近用到JS和OC原生方法調用的問題,查了許多資料都語焉不詳,自己記錄一下吧,如果有誤歡迎聯繫我指出。
JS中調用OC方法有三種方式:
1.通過獲取JSContext的方式直接調用OC方法
2.通過繼承自JSExport的方式調用delegate中的方法
3.截取URL的方式(此種方式資料很多,就不寫了)
先上OC代碼
- (void)webViewDidFinishLoad:(UIWebView *)webView {
// 設置javaScriptContext上下文
self.jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 方法一 __weak typeof(self) weakSelf = self; self.jsContext[@"getMessage"] = ^(){ return [weakSelf blockCallMessage]; }; // 方法二 self.jsContext[@"JavaScriptInterface"] = self; } - (NSString *)blockCallMessage {
return @"call via block"; } #pragma mark - JSCallDelegate // 提供給JS調用的方法 - (NSString *)tipMessage {
return @"call via delegate"; }
HTML代碼
<html> <head> </head> <body> <script> function buttonClick1() { // 方法一 var token = getMessage(); alert(token) } function buttonClick2() { // 方法二 var token = JavaScriptInterface.tipMessage(); alert(token) } </script> <button id="abc" onclick="buttonClick1()">function 1</button> <button id="abcd" onclick="buttonClick2()">function 2</button> </body> </html>
方法一中的jsContext[@"getMessage"]需要和JS中調用的方法名一致,既JS中需要直接調用getMessage(),而jsContext[@"getMessage"]則賦值為一個block,這個block中調用的方法就是JS中調用getMessage()就是執行這個block;
方法二中的jsContext[@"JavaScriptInterface"] = self其中的JavaScriptInterface可以隨便命名,保持JS中和該命名保持一致即可,JS中通過JavaScriptInterface來調用繼承自JSExport的delegate中的方法,即JavaScriptInterface.tipMessage()