html的代碼以下:javascript
<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
UIWebViewDelegate協議
@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
- (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); }
/** 應用場景: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
/** 提示:若是 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; }