`
xindrace
  • 浏览: 97138 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

IOS开发天气预报

    博客分类:
  • IOS
阅读更多

使用的WebService是http://www.webxml.com.cn/WebServices/WeatherWebService.asmx

其中的getWeatherByCityName函数

 

常使用的技术有:SOAP,HTTP GET, HTTP POST三种方式

 

(一) SOAP(简单对象访问协议)方式

 

当你使用SOAP时,必须用到POST方式

 

(1) SOAP 1.1

以下是请求实例:

POST /WebServices/WeatherWebService.asmx HTTP/1.1
Host: www.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/getWeatherbyCityName"
 
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
   <getWeatherbyCityName xmlns="http://WebXml.com.cn/">
      <theCityName>string</theCityName>
    </getWeatherbyCityName>
  </soap:Body>
</soap:Envelope>

 请求方法:

- (void) soap1_1
{
    NSString *province=[NSString stringWithFormat:@"上海"];
    //设置soap请求信息
    NSString *soapString=[[NSString alloc] initWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
                          "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
                          "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
                          "<soap:Body>"
                          "<getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\">"
                          "<theCityName>%@</theCityName>"
                          "</getWeatherbyCityName>"
                          "</soap:Body>"
                          "</soap:Envelope>",province];
    
    NSLog(@"%@",soapString);
    //soap请求地址
    NSURL *url=[[NSURL alloc] initWithString:@"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"];
    //请求
    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
    //设置请求头部
    ////设置ContentType
    [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    ////设置SOAPAction
    [request addValue:@"http://WebXml.com.cn/getWeatherbyCityName" forHTTPHeaderField:@"SOAPAction"];
    //设置Content-length
    [request addValue:[NSString stringWithFormat:@"%d",[soapString length]] forHTTPHeaderField:@"Content-Length"];
    //设置请求类型 POST或GET
    [request setHTTPMethod:@"POST"];
    //设置请求Body(只有post方式有)
    [request setHTTPBody:[soapString dataUsingEncoding:NSUTF8StringEncoding]];
    //连接
    NSURLConnection *connection=[NSURLConnection connectionWithRequest:request delegate:self];
    
    if (connection) {
        webData=[NSMutableData data];
    }
}

 

(2) SOAP 1.2(除了soap不一样外,其他都一样)

以下是请求实例:

POST /WebServices/WeatherWebService.asmx HTTP/1.1
Host: www.webxml.com.cn
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
 
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <getWeatherbyCityName xmlns="http://WebXml.com.cn/">
     <theCityName>string</theCityName>
    </getWeatherbyCityName>
  </soap12:Body>
</soap12:Envelope>

 请求方法:

- (void) soap1_2
{
    NSString *province=[NSString stringWithFormat:@"上海"];
    //设置soap请求信息
    NSString *soapString=[[NSString alloc] initWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
                          "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
                          "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">"
                          "<soap12:Body>"
                          "<getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\">"
                          "<theCityName>%@</theCityName>"
                          "<theCityName>%@</theCityName>"
                          "</getWeatherbyCityName>"
                          "</soap12:Body>"
                          "</soap12:Envelope>",province];
    
    
    NSLog(@"%@",soapString);
    //soap请求地址
    NSURL *url=[[NSURL alloc] initWithString:@"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"];
    //请求
    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
    //设置请求头部
    ////设置ContentType
    [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    ////设置SOAPAction
    [request addValue:@"http://WebXml.com.cn/getWeatherbyCityName" forHTTPHeaderField:@"SOAPAction"];
    //设置Content-length
    [request addValue:[NSString stringWithFormat:@"%d",[soapString length]] forHTTPHeaderField:@"Content-Length"];
    //设置请求类型 POST或GET
    [request setHTTPMethod:@"POST"];
    //设置请求Body(只有post方式有)
    [request setHTTPBody:[soapString dataUsingEncoding:NSUTF8StringEncoding]];
    //连接
    NSURLConnection *connection=[NSURLConnection connectionWithRequest:request delegate:self];
    
    if (connection) {
        webData=[NSMutableData data];
    }
}

 其实和soap1.1除了soap不一样 ,几乎全一样

 

(二) HTTP POST方式

请求实例:

POST /WebServices/WeatherWebService.asmx/getWeatherbyCityName HTTP/1.1
Host: www.webxml.com.cn
Content-Type: application/x-www-form-urlencoded
Content-Length: length

theCityName=string

 方法:

- (void) httpPost
{
    NSString *postString=@"theCityName=上海";
    //此处的URL是POST /WebServices/WeatherWebService.asmx/getWeatherbyCityName 见上!
    NSURL *url=[NSURL URLWithString:@"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName"];
    
    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
    
    [request addValue:@"application/x-www-form-urlencoded"forHTTPHeaderField:@"Content-Type"];//注意是中划线
    [request addValue:[NSString stringWithFormat:@"%d",[postString length]] forHTTPHeaderField:@"Content-Length"];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
    
    NSURLConnection *connection=[NSURLConnection connectionWithRequest:request delegate:self];
    
    if (connection) {
        webData=[NSMutableData data];
    }
}

 

 

以上三种任选一种都可以。下面开始写余下的程序代码了。

 

——————ViewController文件——————

#import <UIKit/UIKit.h>

@interface WebServiceViewController : UIViewController<NSURLConnectionDelegate,NSURLConnectionDataDelegate>
{
    NSMutableData *webData;
    NSMutableArray *parserObjects;
}

@property (strong, nonatomic) NSMutableData *webData;
@property (strong, nonatomic) NSString *m_strCurrentElement;
@property (strong, nonatomic) NSMutableString *tempString;

@end

 

——————NSURLConnectionDelegate,NSURLConnectionDataDelegate实现方法——————

//接收相应的时候触发
-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    [webData setLength:0];
}
//接收数据的时候触发
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    [webData appendData:data];
}
//全部完成时触发
-(void) connectionDidFinishLoading:(NSURLConnection *)connection{
    NSString *dataString=[[NSString alloc] initWithBytes:[webData bytes] length:[webData length] encoding:NSUTF8StringEncoding];
    NSLog(@"%@",dataString);
    
    //XML解析
    NSXMLParser *xmlParser=[[NSXMLParser alloc] initWithData:webData];
    [xmlParser setDelegate:self];
    [xmlParser setShouldResolveExternalEntities:YES];
    [xmlParser parse];
}
//发生异常触发
-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"Error:%@",error);
}

 

现在就应该能看到打印出来的返回数据了,我查了一些资料没找到webserive的解析,我只能用xml解析。

正好我可以学习一下xml的解析:

添加协议NSXMLParserDelegate

 

然后在

-(void) connectionDidFinishLoading:(NSURLConnection *)connection

 方法里添加下面代码:

//XML解析
NSXMLParser *xmlParser=[[NSXMLParser alloc] initWithData:webData];
[xmlParser setDelegate:self];
[xmlParser setShouldResolveExternalEntities:YES];
[xmlParser parse];

—————— NSXMLParserDelegate实现方法—————— 

//开始时触发
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    parserObjects = [[NSMutableArray alloc] init];  //每一组信息都用数组来存,最后得到的数据即在此数组中
}

//解析xml标签对,开始时触发
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {

    NSLog(@">>>%@",elementName);
    
    if ([elementName isEqualToString:@"ArrayOfString"]) {  //开始解析ArrayOfString节点
        
        NSLog(@"开始");
        
    }else {   //开始解析子节点
        if ([elementName isEqualToString:@"string"]) {
            self.m_strCurrentElement = @"string";
            self.tempString = [NSMutableString string];
        }
    }
}

//找到标签时
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSLog(@"found %@",self.m_strCurrentElement);
    //填充string
    if (self.m_strCurrentElement) {
        [self.tempString appendString:string];
        NSLog(@"found is %@",string);
    }
}

//解析xml标签对,结束时触发
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
     NSLog(@"end %@",self.m_strCurrentElement);
    //填充
    if (self.m_strCurrentElement) {
        [parserObjects addObject:self.tempString];
        self.m_strCurrentElement = nil;
        self.tempString = nil;
    }
    
    //结束解析ArrayOfString节点
    if ([elementName isEqualToString:@"ArrayOfString"]) {
        NSLog(@"结束");
    }
    
}

//结束时触发
- (void)parserDidEndDocument:(NSXMLParser *)parser {
    
    //由于标签对的名字都是一样的,只能这样获得
    //天气图片
    NSString *weatherImageName = [parserObjects objectAtIndex:8];
    //今日天气实况
    NSString *temperature = [parserObjects objectAtIndex:10];

    NSString *imageName = [NSString stringWithFormat:@"a_%@",weatherImageName];
    [self gifImageView:imageName];
    
    [self.wendu setText:[self segmentation:temperature]];
    
}

 

由于今日天气实况的格式是:

今日天气实况:气温:26;风向/风力:北风 1级;湿度:78%;空气质量:良;紫外线强度:弱

有时只需要气温,这样我们就要分割这个字符串,分割这个字符串有两种方法:分段,正则表达式。

1.分段

#pragma 分割
- (NSString *)segmentation:(NSString *)segmentationString
{
    //今日天气实况:气温:26℃;风向/风力:北风 1级;湿度:78%;空气质量:良;紫外线强度:弱
    //取出 ————> 26℃
    NSArray *segmentationArray1 = [segmentationString componentsSeparatedByString:@";"];
    NSString *segmentationString1 = [segmentationArray1 objectAtIndex:0];
    
    //今日天气实况:气温:26℃;
    NSArray *segmentationArray2 = [segmentationString1 componentsSeparatedByString:@":"];
    NSString *segmentationResult = [segmentationArray2 objectAtIndex:2];
    
    NSLog(@"segmentation : %@",segmentationResult);
    return segmentationResult;
}

2.正则表达式

#pragma 正则表达式
- (void)regular:(NSString *)regularString
{
    //今日天气实况:气温:26℃;风向/风力:北风 1级;湿度:78%;空气质量:良;紫外线强度:弱
    //取出 ————> 26℃
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[0-9]*℃" options:0 error:nil];
    
    //系统通过自有类NSRegularExpression和NSTextCheckingResult来实现正则表达式的创建和筛选
    if (regex != nil) {
        NSTextCheckingResult *firstMatch = [regex firstMatchInString:regularString options:0 range:NSMakeRange(0, [regularString length])];
        
        if (firstMatch) {
            NSRange resultRange = [firstMatch rangeAtIndex:0];
            //从regularString中截取数据
            NSString *result = [regularString substringWithRange:resultRange];
            NSLog(@"regular %@",result);
        }
    }
}

这样就可以只显示气温了。

 

有时候气温图片需要gif图  

显示gif图的方法:

-(void)gifImageView:(NSString *)imageName
{
    NSLog(@"%@",imageName);
    // 设定位置和大小
    CGRect frame = CGRectMake(50,50,0,0);
    frame.size = [UIImage imageNamed:imageName].size;
    
    NSArray *imageArray = [imageName componentsSeparatedByString:@"."];
    
    // 读取gif图片数据
    NSData *gif = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:[imageArray objectAtIndex:0] ofType:[imageArray objectAtIndex:1]]];
    
    // view生成
    UIWebView *webView = [[UIWebView alloc] initWithFrame:frame];
    webView.userInteractionEnabled = NO;//用户不可交互
    [webView loadData:gif MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
    [self.view addSubview:webView];
}

这样就完成了,

这个demo主要就是练习。。有不对或者更好的方法,欢迎一起讨论。谢谢了。。。

源码看附件吧。。。

分享到:
评论
1 楼 bambjar 2012-09-14  
xcode版本:3.2.5,
打开工程一看不识别“NSURLConnectionDelegate,NSURLConnectionDataDelegate”协议,

估摸着不够新,有其它代替方式么

相关推荐

    IOS APP应用开发 天气预报开发

    在iOS应用开发中,创建一个天气预报APP是一个常见的实践项目,可以帮助开发者掌握基本的iOS编程技巧,特别是对于初学者来说。本项目的核心是利用JSON数据从远程服务器获取天气信息,并在Xcode环境下进行编码实现。...

    IOS应用源码——天气预报.zip

    在iOS平台上开发应用程序,尤其是天气预报类应用,涉及到的知识点非常广泛,涵盖了移动开发、网络编程、数据解析、用户界面设计等多个方面。以下是对"IOS应用源码——天气预报.zip"这一主题的详细分析。 首先,我们...

    ios iphone天气预报例子

    在iOS平台上为iPhone开发天气预报应用是一个常见的任务,涉及到多个技术层面。这个“ios iphone天气预报例子”提供了全面的功能,包括地图集成、GPS定位、导航以及城市添加等,这些都是构建一个实用天气应用不可或缺...

    天气预报 dome

    在iOS开发中,创建一个天气预报应用是一个常见的学习任务,对于初学者来说,这是一个很好的实践项目。本项目名为“天气预报 dome”,它旨在通过JSON API获取数据并展示天气信息,帮助开发者熟悉网络请求、JSON解析...

    ios-天气预报app.zip

    总的来说,"ios-天气预报app.zip"项目涵盖了iOS开发的多个核心方面,从网络请求到UI设计,再到地理定位和本地化。每个环节都涉及了丰富的技术细节,对于学习iOS开发或者提高iOS开发者技能来说,都是宝贵的实践案例。

    ios-天气预报.zip

    在iOS开发领域,Objective-C是一种常用的编程语言,尤其在苹果的旧版框架和库中广泛使用。本项目“ios-天气预报.zip”显然是一个利用Objective-C编写的天气应用示例,旨在帮助开发者学习如何实现一个功能完备的天气...

    IOS天气预报的小应用WeatherDemo

    总结来说,WeatherDemo作为一个iOS天气预报应用,不仅涵盖了XML数据解析、第三方库的集成,还涉及到自定义控件的编程实践,全面体现了iOS开发中的关键技能。通过学习和理解WeatherDemo的实现原理,开发者不仅可以...

    天气预报Demo

    利用聚合数据提供的接口做的一个天气预报DEMO做练习。需要的朋友也可以学着做,仅供参考。

    简单的iOS天气预报Demo

    总的来说,这个"简单的iOS天气预报Demo"是一个实用的教学实例,它涵盖了iOS开发中的关键技能,包括JSON解析、网络请求和API的使用,对于想要踏入iOS开发领域的初学者来说,是一个很好的起点。通过这个Demo,开发者...

    iOS选择不同城市的天气预报

    综上所述,开发一款“iOS选择不同城市的天气预报”应用涵盖了网络编程、数据解析、用户界面设计、数据结构、地理定位、推送通知等多个领域的知识,需要开发者具备全面的iOS开发技能和良好的编程实践。

    IOS天气预报

    以上就是开发一个iOS天气预报应用所需掌握的关键技术点,通过这个过程,开发者不仅可以提升iOS开发技能,还能对网络编程、数据解析、UI设计等有更深入的理解。在实际项目中,还需要不断学习和实践,以适应不断变化的...

    ios 天气预报源代码

    在iOS开发中,创建一个天气预报应用涉及到多个关键知识点,这里我将详细解析"ios 天气预报源代码"这个项目及其可能包含的组件和功能。 1. **天气API集成**: - 天气预报数据通常来自第三方API,如OpenWeatherMap、...

    IOS应用源码Demo-天气预报-毕设学习.zip

    《iOS应用源码分析——基于天气预报的毕设学习》 在移动开发领域,iOS平台以其卓越的用户体验和丰富的功能特性吸引着众多开发者。本文将深入探讨一款名为“天气预报”的iOS应用源码,它是两年前的毕设项目,旨在为...

    ios应用源码之天气预报 2018127

    【标题】"ios应用源码之天气预报 2018127"指的是一个针对iOS平台开发的天气预报应用程序的源代码,日期为2018年12月7日。这个源码可能是开发者在该时间点完成或更新的一个项目版本,用于展示或学习如何在iOS平台上...

    IOS应用源码——天气预报.rar

    在iOS开发领域,源码是理解应用程序工作原理和学习新技能的重要资源。"IOS应用源码——天气预报.rar"提供了一个完整的iOS天气预报应用的源代码,这为开发者提供了研究和学习iOS应用开发,特别是与天气相关的API集成...

    用Hbuilder开发的一款手机天气预报App

    标题中的“用Hbuilder开发的一款手机天气预报App”揭示了我们正在讨论的项目是一个基于HBuilder框架构建的移动应用程序,其主要功能是提供天气预报服务。HBuilder是DCloud(数字天堂)推出的一个强大的HTML5开发工具...

    基于iOS的天气预报查询系统的设计与实现毕业论文.doc

    【摘要】与【关键词】中提到的“基于iOS的天气预报查询系统”是一个移动应用程序,旨在为用户提供便捷的天气查询服务。该系统利用iOS平台进行开发,目的是帮助用户在任何时间、任何地点获取天气信息,提升生活的便利...

    天气预报iOS版

    在iOS开发中,创建一个天气预报应用涉及到多个关键知识点,包括网络请求、数据解析、UI设计和音频播放。以下是对这些技术的详细说明: 1. **XML解析**:XML(Extensible Markup Language)是一种用于存储和传输数据...

Global site tag (gtag.js) - Google Analytics