IOS之云端应用(转)

10.1 GET请求

10.2 XML解析

10.3 JSON解析

10.4 POST请求

10.1 GET请求

通过一个第三方提供的云服务,查询IP归属地:http://www.youdao.com/smartresult-xml/search.s?type=ip&q=218.241.121.186

它的返回格式是xml :

新建个例子:CSSimpleXML,设计原型:

编辑按钮事件:

- (IBAction)query:(id)sender {
    NSString* strUrl = [NSString stringWithFormat:@"http://www.youdao.com/smartresult-xml/search.s?type=ip&q=%@", ipText.text];
    NSURL* url = [NSURL URLWithString:strUrl];

    NSURLRequest* request = [[NSURLRequest alloc]initWithURL:url];

    NSURLConnection* connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];

    [connection release];
    [request release];
    [activityIndicator startAnimating];
}

定义NSURLConnection的委托:

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];

NSURLConnection *connection = [[NSURLConnection alloc]   initWithRequest:request   delegate:self];

委托(delegate)是一种事件处理机制,当满足条件时候触发。delegate:self说明是委托当前对象处理事件,我们需要实现它们回调方法。

 NSURLConnection 回调方法

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 请求成功,并且接收数据。
-(void) connection:(NSURLConnection *)connection  didFailWithError: (NSError *)error  请求成功,但是加载数据出现异常。
-(void) connectionDidFinishLoading: (NSURLConnection*) connection加载数据成功,在connection:didReceiveData方法之后执行。

接收数据处理

-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData *)data {
    //默认对于中文的支持不好
    NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    NSString* gbkNSString = [[NSString alloc]initWithData:data encoding:enc];
    //如果是黑UTF-8 NSXMLParese会报错
    xmlString = [[NSString alloc]initWithString:[gbkNSString stringByReplacingOccurrencesOfString:@"<?xml version=\"1.0\" encoding=\"gbk\"?>" withString:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>"]];
    NSLog(@"%@", xmlString);
    [gbkNSString release];
}

iPhone SDK提供的XML解析类只能解析utf-8编码,如果从服务器返回的xml编码是gbk等,要转换成utf-8再开始解析。

10.2 XML解析

关于iPhone发送GET请求,就是通过NSURLRequest和NSURLConnection两个类实现的。

在众多的回调方法。解析XML是在 connectionDidFinishLoading:方法开始的。

解析XML文件也是要通过XML回调方式实现解析处理的。

NSXMLParser,是iPhone解析XML SDK工具类。

NSXMLParser采用SAX方式而不是DOM方式解析,SAX是基于事件触发的解析方式,解析器从上到下遍历xml文档,遇到开始标签、结束标签、文档开始、文档结束和字符串都会触发事件。

 解析开始处理

-(void)connectionDidFinishLoading:(NSURLConnection*)connection {
    [activityIndicator stopAnimating];
    //开始解析XML
    NSXMLParser* ipParser = [[NSXMLParser alloc]initWithData:[xmlString dataUsingEncoding:NSUTF8StringEncoding ]];;
    ipParser.delegate = self;
    [ipParser parse];
    [ipParser release];
}

NSXMLParser回调方法

- (void)parserDidStartDocument:(NSXMLParser *)parser文档开始的时候触发
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError  文档出错的时候触发
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *) qualifiedName attributes:(NSDictionary *)attributeDict 遇到一个开始标签时候触发。
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 遇到字符串时候触发
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementNamenamespaceURI:(NSString *)
namespaceURIqualifiedName:(NSString *)qName 遇到结束标签时候出发。
- (void)parserDidEndDocument:(NSXMLParser *)parser  遇到文档结束时候触发。

文档开始的回调方法

这个方法在解析过程中只调运一次,一般在这个方法中进行有关解析的初始化处理。

//文档开始的时候触发
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    info = [[NSMutableDictionary alloc]initWithCapacity:1];
}

文档出错回调方法

//文档出错的时候触发
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    UIAlertView* errorAlert = [[UIAlertView alloc]initWithTitle:[parseError localizedDescription] message:[parseError localizedFailureReason] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
    [errorAlert release];
}

遇到开始标签回调方法

参数elementName是标签的名字,attributeDict 是属性列表,namespaceURI 是命名空间,如果有命名空间qualifiedName是指定的前缀名。

//遇到一个开始标签时候触发。
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *) qualifiedName attributes:(NSDictionary *)attributeDict {
    NSLog(@"value:%@\n", elementName);
    currentTagName = elementName;
}

遇到字符串回调方法

//遇到字符串时候触发
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSLog(@"value:%@\n", string);
    string = [string stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    if ([currentTagName isEqualToString:@"ip"]) {
        if (![string isEqualToString:@""]) {
            [info setValue:string forKey:currentTagName];
        }
    } else if([currentTagName isEqualToString:@"location"]) {
        if (![string isEqualToString:@""]) {
            [info setValue:string forKey:currentTagName];
        }
    }
}

遇到结束标签回调方法

//遇到结束标签时候出发。
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName {
}

遇到结束文档回调方法

// 遇到文档结束时候触发。
- (void)parserDidEndDocument:(NSXMLParser *)parser  {
    NSMutableString* outString = [[NSMutableString alloc]initWithCapacity:1];
    for (id key in info) {
        [outString appendFormat:@"%@:%@\n", key, [info objectForKey:key]];
    }
    msgText.text = outString;
    [outString release];
    [xmlString release];
}

10.3 JSON解析

http://www.geonames.org/export/ws-overview.html

获得JSON:

{
    status =     {
        message = "the daily limit of 30000 credits demo has been exceeded.Please throttle your requests or use the commercial service.";
        value = 18;
    };
}

10.3.1 JSON解析API

iPhone SDK没有提供JSON解析API,可以使用第三方的API类库json-framework,下载地址:

https://github.com/stig/json-framework/

把Classes/JSON/下面的类拷贝到我们的工程的Classes目录下面,右键添加存在的类文件。

实现回调方法

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- (void) connectionDidFinishLoading: (NSURLConnection*) connection
-(void) connection:(NSURLConnection *)connection  didFailWithError: (NSError *)error 

connection:didReceiveData:

-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData *)data {
    outString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", outString);
}

connectionDidFinishLoading:

outString的 JSONValue消息获得NSMutableDictionary,JSON api中提供了NSString的分类(Catelog)

-(void)connectionDidFinishLoading:(NSURLConnection*)connection {
    NSMutableDictionary* jsonObj = [outString JSONValue];
    NSLog(@"%@", jsonObj);
    NSMutableDictionary* jsonSubObj = [jsonObj objectForKey:@"status"];

    NSString* text = [[NSString alloc]initWithFormat:@"message=%@\n\nvalue=%@", [jsonSubObj objectForKey:@"message"],[jsonSubObj objectForKey:@"value"]];
    mstText.text = text;
    [text release];
    [outString release];
    [activity stopAnimating];
}

文档出错回调方法

-(void) connection:(NSURLConnection *)connection  didFailWithError: (NSError *)error {
    UIAlertView* errorAlert = [[UIAlertView alloc]initWithTitle:[error localizedDescription] message:[error localizedFailureReason]                     delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
    [errorAlert release];
}

点击按钮事件

-(IBAction)go:(id)sender{
    NSString *strurl [email protected]"http://api.geonames.org/findNearByWeatherJSON?lat=43&lng=-2&username=demo";
  NSURL *url = [NSURL URLWithString:strurl];
  NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url];
  NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
  [connection release];
  [request release];
  [activityIndicatorView startAnimating];
}

10.4 POST请求

为了学习iPhone的POST请求,安排案例如下:

在画面中输入用户名和密码,然后以POST方式提交数据到服务器端。

NSMutableURLRequest

POST请求与GET不同,不使用的NSURLRequest,而是使用NSMutableURLRequest类,这是一个可变的NSURLRequest类。

- (IBAction)login:(id)sender {
    //http://www.sunnyer.com/shop/member!login.action
    //member.email:[email protected]
    //member.password:dfgdfgrf
    [activity startAnimating];
    NSString* post = [NSString stringWithFormat:@"memberIdOrCellphoneOrEmail=%@&&password=%@", username.text, password.text];
    NSData* postData = [post dataUsingEncoding:NSUTF8StringEncoding];
    NSURL* postServierURL = [NSURL URLWithString:@"http://www.jinjiang.com/membercenter/member/ordinaryLogin"];
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:postServierURL];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:postData];
    NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    if (!connection) {
        NSLog(@"Failed to submit request");
    } else {
        NSLog(@"Request submitted");
    }
    [connection release];
}

POST参数是以一个字符串方式传递: memberIdOrCellphoneOrEmail=%@&&password=%@

[request setHTTPMethod:@"POST"];

知道请求方法为POST方法,但是要注意POST必须大写。

[request setHTTPBody:postData];该语句是将要提交的数据放到请求体中。

connection:didReceiveData:

-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData *)data {
    outString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", outString);
}

connectionDidFinishLoading:

-(void)connectionDidFinishLoading:(NSURLConnection*)connection{
    NSLog(@"%@", outString);
    [webView loadHTMLString:outString baseURL:[[NSURL alloc]initWithString:@"http://www.jinjiang.com"]];
    [activity stopAnimating];
}

文档出错回调方法

-(void) connection:(NSURLConnection *)connection  didFailWithError: (NSError *)error {
    UIAlertView* errorAlert = [[UIAlertView alloc]initWithTitle:[error localizedDescription] message:[error localizedFailureReason]                  delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];    [errorAlert show];    [errorAlert release];
}

IOS之云端应用(转),布布扣,bubuko.com

时间: 2024-10-17 05:38:26

IOS之云端应用(转)的相关文章

Ionic在线编译的使用

参见:http://docs.ionic.io/services/profiles/#ios-app-certificate--provisioning-profile Ionic云编译,需要注册.地址:https://apps.ionic.io/ 1,上传项目 CD 项目目录 Ionic upload 上传过程: 2,生成签名文件 需要Apple开发者帐号, 3,上传签名文件 在Ionic在线平台创建一个签名文件,点右下角编辑. 4,打包 回到项目目录,输入:ionic package bui

触摸UITextView找到该触摸点的文字

参加了一个比赛有一道题是如标题一样,在UITextView上触摸找到该触摸点对应的文字,比赛也可以查资料,当时做的时候就是抱着玩玩的心态试试也没认真做,就没查就去吃饭去了,昨晚下班回去在思考这个问题发现还挺有水平的这道题不简单,自己就试着做了下,还是在Stack Overflow中找到的答案.http://stackoverflow.com/questions/19332283/detecting-taps-on-attributed-text-in-a-uitextview-in-ios 自己

【原】使用Bmob作为iOS后台开发心得——云端代码添加其他User的Relation关系

问题描述 我在User表中增加了两个列,分别为“我关注的人”(Relation关系)和“我的粉丝”(Relation关系)当我关注某个人的时候,一方面我要添加他到“我关注的人”,另一方面在他的粉丝中要将我添加上去.看起来很简单,但是实际中操作时,使用bmob sdk中的updateInBackgroundWithResultBlock会遇到我想更新别人的User信息,是无法成功的,因为权!限! 解决方法 这里就得使用Bmob给我们提供的Master Key了(慎用,因为权限太大). functi

最详细iOS APP发布App Store上架流程

上架iOS需要一个付费的开发者账号,还没有的话申请一个或者借用. 申请开发者账号介绍 上架过程分七个步骤,按步骤一步步来. 仔细看这个流程,少走很多弯路,不用一步步去试错,提示效率. 1.创建APP身份证(App IDs) 2.申请发布证书 3.申请发布描述文件 4.Windows下上传证书编译打包 5.在iTunes Connect创建App 6.Windows下上传IPA到App Store 7.上传好IPA回到iTunes Connect填写APP信息并提交审核 一.创建唯一标示符App

APICloud首款全功能集成开发工具重磅发布,彰显云端一体理念

近日,APICloud重磅推出首款云端一体的全功能集成开发工具--APICloud Studio 2.为了更深入了解这款开发工具的特性及优势,APICloud CTO 邹达针对几个核心问题做出了解答. 一.APICloudStudio 2是一款什么样的开发工具? 我们为APICloud Studio 2提炼出三个关键词,「Atom」.「云端一体」和「全功能集成」. 首先,APICloud Studio 2是一款基于Atom内核的开发工具.众所周知,Atom是一款主流.开源的前端编码工具,在Git

iOS原生和H5的相互调用

为什么现在越来越多的APP中开始出现H5页面? 1,H5页面开发效率更高,更改更加方便: 2,适当缩小APP安装包的大小: 3,蹭热点更加方便,比如五一,十一,双十一搞活动: 那么为什么说H5无法取代原生的APP,只能处在一个共存的例子呢? 1,这个是由系统的底层决定的,极端例子,所有的应用都通过H5展示,那么你是否需要一个浏览器? 2,涉及庞大的功能,涉及复杂的逻辑结构,涉及安全性的要求,H5可以胜任吗? 所以,H5和原生的融合会出现动态的调和,最终会找到一个平衡. 那么接下来就说下iOS开发

IOS中获取各个文件的目录路径的方法和NSFileManager类

转自:http://blog.sina.com.cn/s/blog_5fb39f910101di92.html IOS中获取各种文件的目录路径的方法 iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有

iOS 中这些是否熟练掌握——(1)

声明:本篇博文是作者原创作品.参考1  参考2  参考3  参考4  参考5  参考6 关于网上一些关于iOS资料,自己通过学习做了一些整理,这里仅仅作为笔记,方便自己编码过程中约束规范,加深理解. 1.什么是 Handoff ? 参考 Handoff 使用前要保证,手机 和 电脑在同一局域网下(连接同一个WiFi),首先要在电脑(iCloud)和手机上登陆你的苹果ID,然后手机上开启 Handoff 在 电脑的 Dock 上会看到有一条来自于 ***IPhone 的邮件,这样就将手机与电脑进行

iOS项目在非测试设备上的安装方法(项目上线前)

转载自:http://blog.csdn.net/ai379558502/article/details/49003383 方法一: 这个办法,其实是国外一个创业项目 TestFlight,面向移动应用开发者,提供一站式超级简易的测试平台,让开发者的移动应用在上线之前通过真正的用户进行应用测试. 使用TestFlight,甚至不需要有苹果开发者账户,就可以测试APP.TestFlight提供了一个云端安装app的方案,可以大大降低目前iTunes同步的难度.TestFlight能做比云端安装ap