UIWebView中的JS和OC的互調

html的代碼以下:javascript

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
<head>
     <meta xmlns= "http://www.w3.org/1999/xhtml"  http-equiv= "Content-Type"  content= "text/html; charset=utf-8"  />
     <title>這是一個示例html文件</title>
     <script Type= 'text/javascript' >
         function  clickme() {
             alert( '點擊按鈕了XXX!' );
         }
     </script>
</head>
<body>
     <h1>歡迎歡迎!</h1>
     <!-- 自定義協議與OC進行交互,提示必定要有  /// -->
     <a href= "myfunc:///showMessage:/晚上請你吃飯:D" >你猜</a>
     <hr />
     <a href= "http://m.baidu.com" >百度一下,你就知道!</a>
</body>
</html>

1。OC中調用html的代碼html

要執行html中的js,須要加載完成網頁以後再執行,java

?
1
UIWebViewDelegate協議
?
1
2
3
4
5
6
7
8
9
@protocol UIWebViewDelegate <NSObject>
 
@optional
- ( BOOL )webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- ( void )webViewDidStartLoad:(UIWebView *)webView;
- ( void )webViewDidFinishLoad:(UIWebView *)webView;
- ( void )webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
 
@end
?
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
- ( void )viewDidLoad {
     [super viewDidLoad];
 
     [self loadHTMLFile];
}
 
- ( void )loadHTMLFile {
     NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@ "demo.html"  withExtension:nil];
     
     [self.webView loadRequest:[NSURLRequest requestWithURL:fileURL]];
}
 
/**
  要執行 html 中的 js,須要在加載完成以後再執行
  
  stringByEvaluatingJavaScriptFromString 方法,是 WebView 中,惟一一個調用 js 的方法
  
  - string 開頭,返回 NSString*
  */
#pragma mark - UIWebViewDelegate
- ( void )webViewDidFinishLoad:(UIWebView *)webView {
     
     // js的彈窗是阻塞式的!
//    [webView stringByEvaluatingJavaScriptFromString:@"clickme();"];
     
     NSString *title = [webView stringByEvaluatingJavaScriptFromString:@ "document.title" ];
     NSLog(@ "%@" , title);
}
?
1
2
3
4
5
6
7
8
/**
  應用場景:QQ好友發送文件-直接瀏覽文件!
  */
- ( void )loadLocalFile {
     NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@ "iOS 7 Programming Cookbook.pdf"  withExtension:nil];
     
     [self.webView loadRequest:[NSURLRequest requestWithURL:fileURL]];
}

 

2.HTML中調用OC的代碼web

?
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
/**
  提示:若是 OC 的代理方法要求返回 BOOL,程序直接返回 YES,一般一切正常,NO就是不工做!
  
  參數
  1. webView
  2. request:加載頁面的請求
  3. navigationType: 瀏覽的類型,例如:在新窗口中打開連接
  */
- ( BOOL )webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
     
     NSLog(@ "%@" , request.URL.scheme);
     
     // 若是可以攔截到 myfunc:// 協議頭,就能夠知道是自定義協議調用 oc 方法
     // scheme 協議頭
     if  ([request.URL.scheme isEqualToString:@ "myfunc" ]) {
         NSLog(@ "自定義協議,準備調用 OC 的方法 %@" , request.URL);
         
         // 須要攔截方法名 & 參數
         NSLog(@ "%@" , request.URL.pathComponents);
         
         // 1. 方法名
         NSString *methodName = request.URL.pathComponents[1];
         // 2. 參數
         NSString *param = request.URL.pathComponents[2];
         
         // 3. 調用方法 - SEL
//        UIButton *btn = nil;
//        [btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
         SEL func = NSSelectorFromString(methodName);
         // 之因此會有警告,是由於蘋果認爲這種方式不安全!
         // 判斷 self 是否響應方法
         if  ([self respondsToSelector:func]) {
             // clang 編譯器 警告 壓棧,保存當前編譯狀態
#pragma clang diagnostic push
             // 忽略 pefromSelector 的風險警告
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
             [self performSelector:func withObject:param];
             // 讓編譯器出棧,恢復以前保存的狀態
#pragma clang diagnostic pop
         else  {
             NSLog(@ "方法名錯誤" );
         }
         
         return  NO;
     }
     
     return  YES;
}

 

轉自:http://my.oschina.net/u/1590735/blog/493722?fromerr=bS9RAInT安全

相關文章
相關標籤/搜索