iOS UIWebView

概括:
一、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)需要的功能
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • IOS之UIWebView的使用 剛接觸IOS開發(fā)1年多,現(xiàn)在對(duì)于 混合式 移動(dòng)端開發(fā)越來(lái)越流行,因?yàn)殚_發(fā)成本上、...
    學(xué)無(wú)止境666閱讀 45,907評(píng)論 5 53
  • OS之UIWebView的使用 剛接觸IOS開發(fā)1年多,現(xiàn)在對(duì)于 混合式 移動(dòng)端開發(fā)越來(lái)越流行,因?yàn)殚_發(fā)成本上、速...
    知之未道閱讀 1,668評(píng)論 0 4
  • 現(xiàn)在對(duì)于 混合式 移動(dòng)端開發(fā)越來(lái)越流行,因?yàn)殚_發(fā)成本上、速度上都比傳統(tǒng)的APP開發(fā)要好,混合式開發(fā)是傳統(tǒng)模式與P...
    丶紳士丿丨丨閱讀 2,233評(píng)論 1 2
  • 一、UIWebView的基礎(chǔ)使用 以上是IOS中UIWebView的基礎(chǔ)使用要點(diǎn)詳解,接下來(lái)一些UIWebView...
    朝雨晚風(fēng)閱讀 1,393評(píng)論 0 11
  • 我是個(gè)吃貨,但不是胡吃海喝的那種吃貨,不是什么都吃的那種吃貨,而是對(duì)食物的材質(zhì),烹飪方法,味道,還有尤其衛(wèi)生都要求...
    碧海藍(lán)天1018閱讀 256評(píng)論 4 2