**1、什么是UIWebView**
UIWebView是iOS內置的瀏覽器控件。
系統自帶的Safari瀏覽器就是通過UIWebView實現的。
UIWebView不但能加載遠程的網頁資源,還能加載絕大部分的常見文件html\htm、pdf、doc、ppt、txt、mp4等等。
**2、常用屬性和方法**
~~~
@property(nonatomic) UIDataDetectorTypes dataDetectorTypes //需要進行檢測的數據類型
@property(nonatomic,readonly,getter=canGoBack) BOOL canGoBack;//是否能回退
@property(nonatomic,readonly,getter=canGoForward) BOOL canGoForward;//是否能前進
@property(nonatomic,readonly,getter=isLoading) BOOL loading;//是否正在加載中
@property(nonatomic) BOOL scalesPageToFit;//是否伸縮內容至適應屏幕當前尺寸
~~~
~~~
- (void)loadRequest:(NSURLRequest *)request;?//UIWebView常用的加載資源的方法
- (void)reload; //重新加載(刷新)
- (void)stopLoading; //停止加載
- (void)goBack;//回退
- (void)goForward; //前進
~~~
**3、UIWebViewDelegate代理方法**
~~~
//開始發送請求(加載數據)時調用這個方法
- (void)webViewDidStartLoad:(UIWebView *)webView;
//請求完畢(加載數據完畢)時調用這個方法
- (void)webViewDidFinishLoad:(UIWebView *)webView;
//請求錯誤時調用這個方法
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
//UIWebView在發送請求之前,都會調用這個方法,如果返回NO,代表停止加載請求,返回YES,代表允許加載請求
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
~~~
**4、UIWebView Obj-c 和javascript交互**
4.1、Obj-c 操作javascript,dom加載完成后才操作。
~~~
?- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
~~~
~~~
//與js交換,操作dom
NSString *hideDiv = @"document.getElementById('showText').style.display='none'";
~~~
4.2、javascript調用oc方法。原理是UIWebView攔截頁面請求,截取url判斷做響應處理。
~~~
/**
* 作用:一般用來攔截webView發出的所有請求(加載新的網頁)
* 每當webView即將發送一個請求之前,會先調用這個方法
*
* @param request 即將要發送的請求
*
* @return YES :允許發送這個請求 NO :不允許發送這個請求,禁止加載這個請求
*/
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
// URL格式:協議頭://主機名/路徑
// request.URL.path : 獲得的僅僅是主機名(域名)后面的路徑
// request.URL.absoluteString : 獲得的是一個完整的URL字符串
// NSString *url = request.URL.absoluteString;
// 如果在path中找不到@“baidu”這個字符串
// [path rangeOfString:@"baidu"].length == 0;
// [path rangeOfString:@"baidu"].location == NSNotFound
//if([urlStr rangeOfString:@"baidu.com"].length ==0){}
NSString *url = request.URL.absoluteString;
NSRange range = [url rangeOfString:@"zxh://"];
NSInteger loc = range.location;
if (loc != NSNotFound) {
//獲取方法名字
NSString *method = [url substringFromIndex:loc+ range.length];
// 轉成SEL
SEL sel = NSSelectorFromString(method);
[self performSelector:sel withObject:nil];
}
return YES;
}
~~~
**頁面代碼:**
~~~
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<p></p>
<div>
<button onclick="fn_open_camera();">拍照</button>
</div>
<p></p>
<div>
<button onclick="fn_call();">打電話</button>
</div>
<div id="showText">dddddddd</div>
<script>
function fn_call() {
// 調用OC中call方法
window.location.href = 'zxh://call';
}
function fn_open_camera() {
// 調用OC中openCamera方法
window.location.href = 'zxh://openCamera';
}
</script>
</body>
</html>
~~~
**5.JavaScriptCore.framework iOS自帶框架實現與js交互,參考一下文章**
[http://blog.csdn.net/lwjok2007/article/details/47058795](http://blog.csdn.net/lwjok2007/article/details/47058795)
[http://justsee.iteye.com/blog/2036713](http://justsee.iteye.com/blog/2036713)
- 前言
- iOS開發實踐之SQLite3
- iOS開發實踐之FMDB
- Obj-C與javascript交互之WebViewJavascriptBridge
- iOS開發實踐之UIWebView
- iOS開發實踐之多線程(基本概念)
- iOS開發實踐之多線程(NSThread)
- iOS開發實踐之多線程(GCD)
- iOS開發實踐之多線程(單例模式)
- iOS開發實踐之xib加載注意問題
- iOS開發實踐之多線程(NSOperation)
- iOS開發實踐之cell下載圖片(NSOperation)
- iOS開發實踐之cell下載圖片(自定義NSOperation)
- iOS開發實踐之cell下載圖片(SDWebImage)
- iOS開發實踐之JSON
- iOS開發實踐之XML
- iOS開發實踐之GET和POST請求
- iOS開發實踐之網絡檢測Reachability
- iOS開發實踐之MD5加密