UIWebView使用浅析

概述

UIWebView是iOS sdk中一个最常用的控件,是内置的浏览器控件,我们可以用它来浏览网页、打开文档等等。可以在不发布版本的情况下改变其显示的内容。今天和大家一起看下UIWebView的使用。

本文包括下面内容

  • UIWebView的几种加载方式
  • Cookie的读取和赋值
  • UIWebView和JavaScript交互

一.UIWebView的几种加载方式

大体说来,给UIWebView添加内容的方式分两种:

  1. 一种是从一个文件加载,类似在浏览器上输入URL或本地文件路径

  2. 一种是将一段HTML原代码,直接赋给UIWebView

1.1 直接加载本地的HTML文件
NSURL *url = [NSURL URLWithString:@"http://www.google.com"]; 
[self.myWebview loadRequest:[NSURLRequest requestWithURL:url]];
1.2 直接加载本地的HTML文件
NSString *htmlPath = [[[NSBundle mainBundle] bundlePath]
    stringByAppendingPathComponent:@"index.html"];
[self.myWebview loadRequest:[NSURLRequest requestWithURL:
    [NSURL fileURLWithPath:htmlPath]]];
1.3 加载html字符串(可以加载全部或者部分html文件)
NSString *htmlPath = [[[NSBundle mainBundle] bundlePath]
    stringByAppendingPathComponent:@"index.html"];

NSString *htmlString = [NSString stringWithContentsOfFile: htmlPath
                                    encoding:NSUTF8StringEncoding 
                                    error:NULL];
[self.myWebview loadHTMLString:htmlString baseURL:[NSURL
    fileURLWithPath:htmlPath]];

二.Cookie的读取和赋值

2.1 Cookie的读取
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]; 
NSHTTPCookie *cookie;
for (id c in cookies){
    if ([c isKindOfClass:[NSHTTPCookie class]]) {
        cookie=(NSHTTPCookie *)c;
        NSLog(@"%@: %@", cookie.name, cookie.value); }
}
2.2 Cookie的赋值

注:如果提供的属性是无效的,初始化Cookie对象为nil。

NSHTTPCookieValue,NSHTTPCookieName,NSHTTPCookieDomain,NSHTTPCookiePath是必选的

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
    
[cookieProperties setObject:@"test" forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"cookiesid" forKey:NSHTTPCookieName];
[cookieProperties setValue:@".baidu.com" forKey:NSHTTPCookieDomain];
[cookieProperties setValue:@"/" forKey:NSHTTPCookiePath];
    
NSHTTPCookie *cookie = [[NSHTTPCookie alloc] initWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

request还可以这样设置cookie

[request setHTTPShouldHandleCookies:YES];
[request setValue:[NSString stringWithFormat:@"%@=%@", [cookie name], [cookie value]] forHTTPHeaderField:@"Cookie"];

三.UIWebView和JavaScript交互

IOS中UIWebView和JavaScript交互可以分为两种:

  • 客户端传递给JS一些数据
  • JS向客户端请求一些本地操作
3.1 客户端传递给JS一些数据

客户端向JS传递数据,通过插入JS方法来实现,UIWebView的这个方法可以完成这项功能。

- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

实例代码:可以看到html页面有一个由js弹出的弹窗

NSString *jsCode = [NSString stringWithFormat:@"alert("html页面加载成功!");"];
[myWebView stringByEvaluatingJavaScriptFromString:jsCode];

3.2 JS向客户端请求一些本地操作

这里的实现主要是通过对UIWebView的delegate方法进行处理来实现的。UIWebViewDelegate有这个一个方法

- (BOOL)webView:(UIWebView *)webView 
        shouldStartLoadWithRequest:(NSURLRequest *)request 
        navigationType:(UIWebViewNavigationType)navigationType; 

当一个web视图开始加载一个frame的时候会触发它。看起来很符合我们的需求。我们可以在页面里创建一个iframe,使用js代码去改变它的src来触发这个调用,从而实现js对Objc的调用。

实例代码:

html代码:

<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
        <script>
            var JSTest = {
                JSTest_SCHEME : "app",
                _hiddenFrame: null,
                
                createIframeForCallObjc : function () {
                    _hiddenFrame = document.createElement("iframe");
                    _hiddenFrame.style.display = 'none';
                    document.documentElement.appendChild(_hiddenFrame);
                },
                
                callObjcFun : function (funName, args) {
                    _hiddenFrame.src = JSTest.JSTest_SCHEME + "://" + funName;
                    _hiddenFrame.dataset['args'] = JSON.stringify(args);
                },
                
                getJSData : function () {
                    return _hiddenFrame.dataset['args']||"test";
                }
            };
        </script>
        
        <h1>Hello UIWebView!</h1>
        <input type="button" value="click" onclick="JSTest.callObjcFun('login',['xiaohan',666666])" id="testBtn" />
        <script>
            JSTest.createIframeForCallObjc();
        </script>
    </body>
</html>

UIWebViewDelegate处理

- (BOOL)webView:(UIWebView *)webView 
        shouldStartLoadWithRequest:(NSURLRequest *)request
        navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL *url = [request URL];
    if ([[url scheme] isEqualToString:@"app"]) {
        if ([[url host] isEqualToString:@"login"]) {
            //后续处理代码
            NSString *params = [myWebView stringByEvaluatingJavaScriptFromString:@"JSTest.getJSData();"];
            NSLog(@"%@",params);
        } else {
            
        }
        return NO;
    }
    return YES;
}

通过在得到webview所要加载的url来判断是否是需要处理的条件,只需要定义好相关的协议串即可。


后记:这里只是浅析了UIWebView的一些使用方法,欢迎大家指导和交流!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容