概括:
一、UIWebView的基礎(chǔ)使用
二、加載UIWebView需要注意的點(diǎn)
三、iOS與js的交互問題
一、UIWebView的基礎(chǔ)使用
1、創(chuàng)建UIWebView:
CGRect bouds = [[UIScreen manScreen]applicationFrame];
UIWebView* webView = [[UIWebView alloc]initWithFrame:bounds];
[self.view addSubview:webView];
2、設(shè)置UIWebView的相關(guān)屬性:
webView.scalespageToFit = YES;//自動(dòng)對(duì)頁(yè)面進(jìn)行縮放以適應(yīng)屏幕
webView.detectsPhoneNumbers = YES;//自動(dòng)檢測(cè)網(wǎng)頁(yè)上的電話號(hào)碼,單擊可以撥打
注意:我們?cè)谝粋€(gè)頁(yè)面想撥打電話的時(shí)候,也可以調(diào)取webview撥打電話
UIWebView*callWebview =[[UIWebView alloc] init];
NSURL *telURL =[NSURL URLWithString:[NSString stringWithFormat:@"tel:%@",self.usersModel.mobile]];// 貌似tel:// 或者 tel: 都行
[callWebview loadRequest:[NSURLRequest requestWithURL:telURL]];
//記得添加到view上
[self.view addSubview:callWebview];
3、加載內(nèi)容:
1.1、加載一個(gè)網(wǎng)頁(yè)url:
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];//創(chuàng)建URL
NSURLRequest* request = [NSURLRequest requestWithURL:url];//創(chuàng)建
[webView loadRequest:request];//加載
1.2、加載一個(gè)本地資源:
NSURL* url = [NSURL fileURLWithPath:filePath];//創(chuàng)建URL
NSURLRequest* request = [NSURLRequest requestWithURL:url];//創(chuàng)建
[webView loadRequest:request];//加載
設(shè)置webView的一些屬性
[webView goBack];//后退
[webView goForward];//控制前進(jìn)
[webView reload];//重載
[webView stopLoading];//取消載入內(nèi)容
4、UIWebView的代理:
-(void)webViewDidStartLoad:(UIWebView*)webView ;//當(dāng)網(wǎng)頁(yè)視圖已經(jīng)開始加載一個(gè)請(qǐng)求后,得到通知。
-(void)webViewDidFinishLoad:(UIWebView*)webView ;//當(dāng)網(wǎng)頁(yè)視圖結(jié)束加載一個(gè)請(qǐng)求之后,得到通知。
-(void)webView:(UIWebView*)webView DidFailLoadWithError:(NSError*)error;//當(dāng)在請(qǐng)求加載中發(fā)生錯(cuò)誤時(shí),得到通知。會(huì)提供一個(gè)NSSError對(duì)象,以標(biāo)識(shí)所發(fā)生錯(cuò)誤類型。
二、加載UIWebView需要注意的點(diǎn)
1、處理UIWebView加載網(wǎng)頁(yè)展示doc、txt、xls等等的文檔亂碼問題:
1.1 處理展示txt文檔亂碼問題:
if ([theType isEqualToString:@".txt"]){
//txt分帶編碼和不帶編碼兩種,帶編碼的如UTF-8格式txt,不帶編碼的如ANSI格式txt。不帶的,可以依次嘗試GBK和GB18030編碼
NSString* aStr = [[NSString alloc] initWithData:attachmentData encoding:NSUTF8StringEncoding];
if (!aStr){
//用GBK進(jìn)行編碼
aStr=[[NSString alloc] initWithData:attachmentData encoding:0x80000632];
}
if (!aStr){
//用GBK編碼不行,再用GB18030編碼
aStr=[[NSString alloc] initWithData:attachmentData encoding:0x80000631];
}
加載完成之后,會(huì)顯示不全,可用textview進(jìn)行排版,或者是通過(guò)html進(jìn)行排版,下面列舉html進(jìn)行排版:
NSString* responseStr = [NSString stringWithFormat:
@""
""
""
""
"%@"
"/pre>"
""
"",
aStr];
[attachmentWebView loadHTMLString:responseStr baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
return;
}
其他的處理亂碼就用utf8轉(zhuǎn)化就ok。
2、取消長(zhǎng)按webView上的鏈接彈出actionSheet的問題:
-(void)webViewDidFinishLoad:(UIWebView *)webView{
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout = 'none';"];
}
3、取消webView上的超級(jí)鏈接加載問題:
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
if (navigationType==UIWebViewNavigationTypeLinkClicked) {
return NO;
}else {
return YES;
}
}
4、刪除 webView的cookie的方法:
-(void)deleteCookieForDominPathStr:(NSString *)thePath
{
//刪除本地cookie,thePath為cookie路徑通過(guò)打印cookie可知道其路徑
for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
if([[cookie domain] isEqualToString:thePath]) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];}
}
}
5、根據(jù)內(nèi)容獲取UIWebView的高度:
1.1 .使用sizeThatFits方法:
-(void)webViewDidFinishLoad:(UIWebView *)webView{
CGRect frame = webView.frame;
frame.size.height = 1;
webView.frame = frame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
webView.frame = frame;
}
這個(gè)需要注意:使用 sizeThatFits前,先將UIWebView的高度設(shè)為最小,即1,再次調(diào)用就會(huì)返回最合適的大小
1.2 使用JavaScript方法
-(void)webViewDidFinishLoad:(UIWebView *)webView{
CGRect frame = webView.frame;
NSString *fitHeight = [webview stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"];
frame.size.height = [fitHeight floatValue];
webView.frame = frame;
}
三、iOS與js的交互問題
1、OC掉JS的方法:
第一步:需要添加系統(tǒng)庫(kù) JavaScriptCore.framework,引入頭文件#import <JavaScriptCore/JavaScriptCore.h>
第二步:創(chuàng)建webview
第三步:創(chuàng)建 JSContext 橋梁
-(void)webViewDidFinishLoad:(UIWebView *)webView {
//創(chuàng)建JSContext 對(duì)象
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSString *alertJS=@"alert('我是拉拉吖')"; //準(zhǔn)備執(zhí)行的js代碼
[context evaluateScript:alertJS];//通過(guò)oc方法調(diào)用js的alert
}
2、JS調(diào)用OC方法:
例如:我們的app最近開發(fā)的七夕開獎(jiǎng)活動(dòng),每次打開app,如果沒開獎(jiǎng),就會(huì)有百寶箱,提示打開百寶箱
第一步:需要添加系統(tǒng)庫(kù) JavaScriptCore.framework,引入頭文件#import <JavaScriptCore/JavaScriptCore.h>
第二步:創(chuàng)建webview
第三步:創(chuàng)建 JSContext 橋梁
第四步:規(guī)定名稱:TestJSObject
第五步:規(guī)定方法帶參數(shù)的:-(void)TestOneParameter:(NSString *)message
@property (nonatomic, strong) JSContext *jsContext;
-(void)webViewDidFinishLoad:(UIWebView *)webView {
//建立連接
self.jsContext = (JSContext *)[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
self.jsContext.exceptionHandler = ^(JSContext *con, JSValue *exception) {
NSLog(@"%@", exception);
con.exception = exception;
};
//創(chuàng)建對(duì)象,處理來(lái)自JS調(diào)用的類
TestJSObject *textJS = [[TestJSObject alloc] init];
self.jsContext[@"TestJSObject"]= textJS;
}
重寫TestJSObject類
#import <Foundation/Foundation.h>
#import <JavaScriptCore/JavaScriptCore.h>
//首先創(chuàng)建一個(gè)實(shí)現(xiàn)了JSExport協(xié)議的協(xié)議
@protocol TestJSObjectProtocol <JSExport>
//此處我們測(cè)試幾種參數(shù)的情況
-(void)TestNOParameter;
-(void)TestOneParameter:(NSString *)message;
@end
//讓我們創(chuàng)建的類實(shí)現(xiàn)上邊的協(xié)議
@interface TestJSObject : NSObject<TestJSObjectProtocol>
@end
#import "TestJSObject.h"
@implementation TestJSObject
-(void)TestOneParameter:(NSString *)message
{
NSLog(@"this is ios TestOneParameter=%@",message);
}
@end
注意:如果js是多個(gè)參數(shù)的話 我們代理方法的所有變量前的名字連起來(lái)要和js的方法名字一樣
比如: js方法為 testobject.TestTowParameterSecondParameter('參數(shù)A','參數(shù)B')
他有兩個(gè)參數(shù) 那么我們的代理方法 就是把js的方法名 TestTowParameterSecondParameter 任意拆分成兩段作為代理方法名
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
3、使用第三方的WebViewJavascriptBridge
第一步:導(dǎo)入第三方WebViewJavascriptBridge
第二步:引入頭文件:#import "WebViewJavascriptBridge.h"
第三步:同js方規(guī)定方法:@"pushAppParam"
@property (nonatomic,strong) WebViewJavascriptBridge *bridge;
- (void)viewDidLoad{
//調(diào)用方法
[self addInitWebViewJavascriptBridge];
}
實(shí)現(xiàn)方法
- (void) addInitWebViewJavascriptBridge{
self.bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView];
[self.bridge setWebViewDelegate:self];
[self.bridge registerHandler:@"pushAppParam" handler:^(id data, WVJBResponseCallback responseCallback) {
NSDictionary *dic = data;
//實(shí)現(xiàn)需要的功能
}