一、webView
UIwebView是iOS中内置的浏览器控件。除了能够加载网络资源外,也可以加载本地资源,目前支持的常用的文档格式:html、pdf、docx、txt等。
1.获取页面
1.创建request请求
将要访问的地址保存在字符串url中
NSString
*url = [
Url
stringByReplacingOccurrencesOfString
:
@"CLIENT_ID"
withString
:
AppKey
];
将字符串转换为request请求
NSURLRequest
*request = [[
NSURLRequest
alloc
]
initWithURL
:url];
2.加载请求页面
[
_webview
loadRequest
:request
];
在viewController中添加webView,在该webView上增加UISearchBar,获取地址后展现结果:
在这个浏览器中将实现这样几个功能:
1.如果输入以”file://”开头的地址将加载Bundle中的文件
2.如果输入以“http”开头的地址将加载网络资源
实现效果:
2.与页面交互
目前网站及软件都是3端鼎力:web端,iOS端,android端。3端分别开发代码,大大增加工作量,此时就可以在客户端复用web端html5的代码。在客户端加载html5页面展示后,需要在客户端完成与html5的交互。
UIWebView与页面的交互主要体现在两方面:使用ObjC方法进行页面操作、在页面中调用ObjC方法两部分。和其他移动操作系统不同,iOS中所有的交互都集中于一个
stringByEvaluatingJavaScriptFromString:方法中,以此来简化开发过程。
UIWebView与页面交互
UIWebView与页面的交互主要体现在两方面:使用ObjC方法进行页面操作、在页面中调用ObjC方法两部分。和其他移动操作系统不同,iOS中所有的交互都集中于一个stringByEvaluatingJavaScriptFromString:方法中,以此来简化开发过程。
在iOS中操作页面
1.首先在request方法中使用loadHTMLString:加载了html内容,当然你也可以将html放到bundle或沙盒中读取并且加载。
-(
void)request{
NSString *htmlStr=@
"<html>\ <head><title>Amanda's Blog</title></head>\ <body style=\"color:#0092FF;\">\ <h1 id=\"header\">I am HuoDaJie</h1>\ <p>iOS 开发</p>\ </body></html>";
[_webView loadHTMLString:htmlStr baseURL:nil];
}
2.然后在webViewDidFinishLoad:代理方法中通过
stringByEvaluatingJavaScriptFromString: 方法可以操作页面中的元素,例如在下面的方法中读取了页面标题、修改了其中的内容。
-(
void)webViewDidFinishLoad:(UIWebView *)webView{
[UIApplication sharedApplication].networkActivityIndicatorVisible=
false;
NSLog(@
"%@",[_webView stringByEvaluatingJavaScriptFromString:@
"document.title"]);
NSLog(@
"%@",[_webView stringByEvaluatingJavaScriptFromString:@
"document.getElementById('header').innerHTML=‘Amanda's Blog'"]); }
实现效果:
我们可以看到:html页面中header由
I am HuoDaJie 变为Amanda
's Blog
二、viewController中web请求和响应
在Web开发中主要的请求方法有如下几种:
GET请求:get是获取数据的意思,数据以明文在URL中传递,受限于URL长度。
POST请求:post是向服务器提交数据的意思,提交的数据以实际内容形式存放到消息头中进行传递,无法在浏览器url中查看到,大小没有限制。
HEAD请求:请求头信息,并不返回请求数据体,而只返回请求头信息,常用用于在文件下载中取得文件大小、类型等信息。
例如我想制作一个微博客户端,首页显示新的微博。客户端需要访问服务器端的接口
https://api.weibo.com/2/statuses/friends_timeline.json?access_token=ACCESS_TOKEN来获取展示的微博信息。
网络请求需要依赖以下几个对象:
NSURLRequest:建立了一个请求,可以指定缓存策略、超时时间等参数。
NSMutableURLRequest,如果请求定义为NSMutableURLRequest则可以指定请求方法(GET或POST)等信息。
NSURLConnection:用于发送请求,可以指定请求和代理。
如果请求不设置请求方法,默认为Get请求,所以Get请求可以直接使用NSURLRequest,而POST请求只能使用NSMutableURLRequest。
Get请求
NSString
*url = [[
NSString
alloc
]
initWithFormat
:
@"%s?access_token=%@&page=%d"
,
HomeUrl
,
_Access_token
,
_page
];
NSURL *HomeDataUrl =[[NSURL alloc] initWithString:url];
NSData *data = [[NSData alloc] initWithContentsOfURL:HomeDataUrl];
post请求
NSString
* body = [[
NSString
alloc
]
initWithFormat
:
@"access_token=%@&comment=%@&id=%@"
,
_access_token
,
_commentText
.
text
,
_Tid
];
NSString
*encodingString = (
NSString
*)
CFBridgingRelease
(
CFURLCreateStringByAddingPercentEscapes
(
kCFAllocatorDefault
, (
CFStringRef
) body, (
CFStringRef
)
@"&%"
,
nil
,
kCFStringEncodingUTF8
));
NSData
*bodydata =[encodingString
dataUsingEncoding
:
NSUTF8StringEncoding
];
//post请求的地址
NSMutableURLRequest
* request = [[
NSMutableURLRequest
alloc
]
initWithURL
:[[
NSURL
alloc
]
initWithString
:@
CommentUrl
]];
//设置请求方法为POST
[request
setHTTPMethod
:
@"POST"
];
//设置请求体(请求的参数)
[request setHTTPBody:bodydata];
NSData
*data =[
NSURLConnection
sendSynchronousRequest
:request
returningResponse
:
nil
error
:
nil
];
NSURLConnection方法有两个方法
+ (void)sendAsynchronousRequest:request: queue:queue:completionHandler:发送一个异步请求
+ (NSData *)sendSynchronousRequest: returningResponse: error:发送一个同步请求
同步请求:前端页面一直等待返回数据不能做其他事情
异步请求:前端页面可以做其他事情,等到异步请求返回数据后再做处理