IOS開(kāi)發(fā)系列——UIWebView專題

UIWebView專題

1初始化

1.1API接口使用

1.1.1loadhtmlstring

iOS: UIWebview loadhtmlstring & Localcss/js/image resources

http://blog.csdn.net/totogogo/article/details/7613790

UIWebView既可以load by url麦向,還可以load?html string缤剧。即你可以自己generate?html string來(lái)用webview顯示核畴。load?html string典型的應(yīng)用是:url所對(duì)應(yīng)的web page內(nèi)容太多乘瓤,如果只需要部分的html content,那么可以通過(guò)http request獲取url的html content策泣,然后只選取需要的部分衙傀,然后通過(guò)load html string來(lái)顯示。

自己生成的html萨咕,有時(shí)無(wú)法避免要使用local css, js or image(當(dāng)然你也可以使用url來(lái)鏈接到網(wǎng)上的css/js/image)统抬。

假設(shè)在你的ios app里的resource folder里已經(jīng)存放了a webpage.css and a test.js,那么你生成的html string應(yīng)該這樣include them

NSString*

htmlHeader=@"

type='text/css'>@import url('webpage.css');

type='text/javascript' charset='utf-8' src='test.js'>";

NSString* htmlBody=@"";

NSString*htmlFooter=@"";

NSString*strHtml=[[NSStringalloc]initWithFormat:@"%@%@%@",htmlHeader,htmlBody,htmlFooter];

[webViewloadHTMLString:strHtmlbaseURL:[NSURLfileURLWithPath: [[NSBundlemainBundle]resourcePath]isDirectory:YES]];

注意:

1.baseURL就是你的resourcefolder path

2.如果把charset='utf-8' src='test.js'>改成

charset='utf-8' src='test.js' />則無(wú)法load js(ref link:http://stackoverflow.com/questions/7840127/uiwebview-loadhtmlstring-not-working-in-ios5

3.當(dāng)你在ios project里創(chuàng)建js或者把js添加進(jìn)來(lái)后危队,by default?.js文件默認(rèn)會(huì)被當(dāng)作代碼被compiled(你在build project時(shí)就會(huì)看到warning)聪建,因此你需要將.js files從“compile sources” move to

"Copy bundle resources",見(jiàn)下圖


1.1.2UIWebView加載本地html文件

UIWebView *webView_=[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320,400)];

webView_.delegate=self;

[self.view addSubview:webView_];

NSString *filePath = [[NSBundle

mainBundle]pathForResource:@"創(chuàng)業(yè)企業(yè)_詳情" ofType:@"html"];

NSString *htmlString = [NSStringstringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];

[webView_ loadHTMLString:htmlString baseURL:[NSURL

URLWithString:filePath]];

2與web交互

2.1WebView中使用Ajax

2.1.1實(shí)現(xiàn)機(jī)制

Hybrid框架下的app茫陆,使用的Ajax金麸,需要注意的是UIWebViewDelegate不會(huì)監(jiān)測(cè)到Ajax的request,也就是再執(zhí)行Ajax代碼時(shí)簿盅,shouldStartLoadWithReuqest等方法并不會(huì)被調(diào)用钱骂。

其解決方法需要Javascript和navtive code一起來(lái)做,其基本原理可參考這片文章挪鹏,其流程是在Javascript handler中每創(chuàng)建Ajax的請(qǐng)求時(shí),需要將這段js存在ajax_handler.js放在app中

vars_ajaxListener=newObject();

s_ajaxListener.tempOpen=XMLHttpRequest.prototype.open;

s_ajaxListener.tempSend=XMLHttpRequest.prototype.send;

s_ajaxListener.callback=function()?{

window.location='mpAjaxHandler://'+?this.url;

};


XMLHttpRequest.prototype.open=function(a,b)?{

if?(!a)?vara='';

if?(!b)?varb='';

s_ajaxListener.tempOpen.apply(this,?arguments);

s_ajaxListener.method=a;

s_ajaxListener.url=b;

if?(a.toLowerCase()?==?'get')?{

s_ajaxListener.data=b.split('?');

s_ajaxListener.data=s_ajaxListener.data[1];

}

}


XMLHttpRequest.prototype.send=function(a,b)?{

if?(!a)?vara='';

if?(!b)?varb='';

s_ajaxListener.tempSend.apply(this,?arguments);

if(s_ajaxListener.method.toLowerCase()?==?'post')s_ajaxListener.data=a;

s_ajaxListener.callback();

}

其中的"mpAjaxHandler"為自定義的Scheme,用于區(qū)別request是否是由Ajax發(fā)出的。

2.1.2在App端獲得js

staticNSString*JSHandler;

+?(void)initialize?{

JSHandler?=?[[NSStringstringWithContentsOfURL:[[NSBundlemainBundle]URLForResource:@"ajax_handler"withExtension:@"js"]encoding:NSUTF8StringEncodingerror:nil]retain];

}

載入頁(yè)面后蔓肯,執(zhí)行這段js

-?(void)webViewDidStartLoad:(UIWebView*)webView?{

[webViewstringByEvaluatingJavaScriptFromString:JSHandler];

}

攔截住Request,不讓webview的URL做出改變

#define?CocoaJSHandler??????????@"mpAjaxHandler"

-?(BOOL)webView:(UIWebView*)webViewshouldStartLoadWithRequest:(NSURLRequest*)requestnavigationType:(UIWebViewNavigationType)navigationType?{

if([[[requestURL]scheme]isEqual:CocoaJSHandler])?{

NSString*requestedURLString?=?[[[requestURL]absoluteString]substringFromIndex:[CocoaJSHandlerlength]?+3];

NSLog(@"ajax?request:?%@",?requestedURLString);

returnNO;

}


returnYES;

}

2.1.3Ajax相關(guān)知識(shí)

Ajax作為異步Javascript廣泛應(yīng)用在web網(wǎng)站上调限。下面是一個(gè)來(lái)自于w3school的簡(jiǎn)單使用Ajax的例子:

function?loadXMLDoc()

{

var?xmlhttp;

var?txt,x,i;

if?(window.XMLHttpRequest)

{//?code?for?IE7+,?Firefox,?Chrome,?Opera,?Safari

xmlhttp=newXMLHttpRequest();

}

else

{//?code?for?IE6,?IE5

xmlhttp=newActiveXObject("Microsoft.XMLHTTP");

}

xmlhttp.onreadystatechange=function()

{

if?(xmlhttp.readyState==4?&&xmlhttp.status==200)

{

xmlDoc=xmlhttp.responseXML;

txt="";

x=xmlDoc.getElementsByTagName("title");

for?(i=0;i;i++)

{

txt=txt+?x[i].childNodes[0].nodeValue?+?"/>";

}

document.getElementById("myDiv").innerHTML=txt;

}

}

xmlhttp.open("GET","http://www.w3school.com.cn/example/xmle/books.xml",true);

xmlhttp.send();

}

點(diǎn)擊button,通過(guò)Ajax的方式獲得書(shū)單踱承。部分內(nèi)容參考于stackoverflow

2.1.4UIWebView載入帶有錨點(diǎn)(anchor)的URL時(shí)存在的問(wèn)題及解決辦法

UIWebView載入帶有錨點(diǎn)(anchor)的URL時(shí)存在的問(wèn)題及解決辦法

http://blog.csdn.net/fengbingyang/article/details/7484453

方案一:

最近在使用ios中的UIWebView顯示本地網(wǎng)頁(yè)時(shí),遇到如下問(wèn)題:

UIWebView加載帶有錨點(diǎn)的URL(如"file:///Users/admin/home.html#pos"),程序使用javascript的range.surroundContents方法在網(wǎng)頁(yè)中為選中文字創(chuàng)建高亮標(biāo)簽桅滋,當(dāng)頁(yè)面高度超過(guò)屏幕高度時(shí),如果頁(yè)面頂部和初始加載時(shí)的位置不同(進(jìn)行過(guò)滾動(dòng)),則每次添加高亮号俐,頁(yè)面就重新跳到初始加載時(shí)的位置,而不是保持當(dāng)前位置。

在PC瀏覽器上嘗試并沒(méi)有出現(xiàn)這種問(wèn)題笨忌,因此猜測(cè)是可能是UIWebView自身的原因。經(jīng)過(guò)一番嘗試,摸索出一種解決辦法维费,具體如下:

在javascript代碼的結(jié)尾部分添加一句location.href="###";

通過(guò)這樣的嘗試,成功讓UIWebView不再跳轉(zhuǎn)到初始加載位置。

PS:如果UIWebView加載的URL不帶錨點(diǎn)恶阴,是不會(huì)出現(xiàn)上述問(wèn)題的。

方案二:在shouldStartLoadWithRequest方法中進(jìn)行url相等判斷缓熟,然后對(duì)于#號(hào)url進(jìn)行延遲執(zhí)行l(wèi)oadNavigationTitle的處理:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request

navigationType:(UIWebViewNavigationType)navigationType

{

//如果是第一次加載當(dāng)前界面吕世,不需要做判斷

if([selfcheckUrl:request.URLIsEqualToTargetUrl:_currentUrl]) {

_lastRequest= request;

if([urlStrrangeOfString:@"#"].length>0) {

[selfperformSelector:@selector(loadNavigationTitle)withObject:nilafterDelay:0.5];

}

returnYES;

}

//其他處理代碼

}

2.2自定義WebView的userAgent

//獲取iOS默認(rèn)的UserAgent,可以很巧妙地創(chuàng)建一個(gè)空的UIWebView來(lái)獲榷怼:

NSString *userAgent = [[[UIWebView

alloc] init]

stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];

//獲取App名稱,我的App有本地化支持迅皇,所以是如下的寫(xiě)法

NSString *appName =

NSLocalizedStringFromTable(@"CFBundleDisplayName",

@"InfoPlist", nil);

//如果不需要本地化的App名稱,可以使用下面這句

//NSString *appName= [[NSBundle mainBundle]infoDictionary][@"CFBundleDisplayName"];

NSString*version = [[NSBundlemainBundle]infoDictionary][@"CFBundleShortVersionString"];

NSString *customUserAgent = [userAgent

stringByAppendingFormat:@" %@/%@",appName, version];

[[NSUserDefaults standardUserDefaults]

registerDefaults:@{@"UserAgent":customUserAgent}];

// ----------隨便寫(xiě)個(gè)測(cè)試代碼,記得設(shè)置delegate哦茉贡,這只是測(cè)試代碼

UIWebView *webView = [[UIWebView

alloc] init];

webView.delegate = self;

[webView loadRequest:[NSURLRequest

requestWithURL:[NSURL URLWithString:@"http://www.baidu.com/"]]];

-

(void)webViewDidFinishLoad:(UIWebView *)webView

{

NSLog(@"UserAgent = %@",

[webView

stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"]);

}

Xcode 5.1.1iOS 7.1模擬器下得到的結(jié)果是:

Mozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X)

AppleWebKit/537.51.2 (KHTML, like Gecko)中華瀏覽器/1.2.2

3參考鏈接

Hybrid--WebView中使用Ajax

http://blog.csdn.net/xunyn/article/details/38389247

UIWebView怎么攔截到網(wǎng)頁(yè)里面JS發(fā)起的Ajax請(qǐng)求

http://bbs.csdn.net/topics/390967549?page=1

iOS UIWebView自定義UserAgent

http://blog.sina.com.cn/s/blog_6db188450102v529.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市如蚜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖倾芝,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件借尿,死亡現(xiàn)場(chǎng)離奇詭異茄靠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)厌小,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)涨岁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事规阀∽趟牵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵奄喂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我词疼,道長(zhǎng)俯树,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任贰盗,我火速辦了婚禮舵盈,結(jié)果婚禮上陋率,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好先嬉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布重罪。 她就那樣靜靜地躺著息裸,像睡著了一般年扩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上访圃,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天况脆,我揣著相機(jī)與錄音饭宾,去河邊找鬼。 笑死格了,一個(gè)胖子當(dāng)著我的面吹牛看铆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笆搓,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼性湿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了满败?” 一聲冷哼從身側(cè)響起肤频,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎算墨,沒(méi)想到半個(gè)月后宵荒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡净嘀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年报咳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挖藏。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡暑刃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膜眠,到底是詐尸還是另有隱情岩臣,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布宵膨,位于F島的核電站架谎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辟躏。R本人自食惡果不足惜谷扣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捎琐。 院中可真熱鬧会涎,春花似錦、人聲如沸瑞凑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拨黔。三九已至蛔溃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篱蝇,已是汗流浹背贺待。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留零截,地道東北人麸塞。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涧衙,于是被迫代替她去往敵國(guó)和親哪工。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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

  • iOS開(kāi)發(fā)系列--網(wǎng)絡(luò)開(kāi)發(fā) 概覽 大部分應(yīng)用程序都或多或少會(huì)牽扯到網(wǎng)絡(luò)開(kāi)發(fā)弧哎,例如說(shuō)新浪微博雁比、微信等,這些應(yīng)用本身可...
    lichengjin閱讀 3,648評(píng)論 2 7
  • 一撤嫩、簡(jiǎn)介 近兩年隨著HTML5的迅速發(fā)展與日趨成熟偎捎,越來(lái)越多的移動(dòng)開(kāi)發(fā)者選擇使用HTML5來(lái)進(jìn)行混合開(kāi)發(fā),不...
    寶寶teacher閱讀 2,289評(píng)論 3 15
  • 前言 關(guān)于UIWebView的介紹序攘,相信看過(guò)上文的小伙伴們茴她,已經(jīng)大概清楚了吧,如果有問(wèn)題程奠,歡迎提問(wèn)丈牢。 本文是本系列...
    CoderLF閱讀 8,953評(píng)論 2 12
  • IOS之UIWebView的使用 剛接觸IOS開(kāi)發(fā)1年多,現(xiàn)在對(duì)于 混合式 移動(dòng)端開(kāi)發(fā)越來(lái)越流行瞄沙,因?yàn)殚_(kāi)發(fā)成本上己沛、...
    學(xué)無(wú)止境666閱讀 45,778評(píng)論 5 53
  • 告別了樹(shù)海瀑布,我們駕車直奔云水謠帕识。其實(shí)距離并不遠(yuǎn)泛粹,23.2公里用時(shí)50分鐘,與我們失散的那輛車也在我們之后很快到...
    游走的足跡閱讀 825評(píng)論 0 2