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安全