본문 바로가기

프로그래밍/아이폰 프로그래밍

21. 구글 날씨 API 사용하기

구글 API를 이용해서 날씨를 출력하고자 하는 경우 http://www.google.co.kr/ig/api?weather=도시명 을 이용하면 xml 형태로 리턴되어 옵니다.



GoogleWeatherViewController.h

#import <UIKit/UIKit.h>


// xml 파싱을 위해서 NSXMLParserDelegate 반드시 참조해줘야 합니다.

@interface GoogleWeatherViewController : UIViewController <NSXMLParserDelegate> {


NSMutableData *receiveData; // xml 받을 데이터

NSURLConnection *urlConnection; // 커넥션

NSString *condition; // 오늘의 날씨를 받을 스트링

}


@property (nonatomic, retain) NSMutableData *receiveData;

@property (nonatomic, retain) NSURLConnection *urlConnection;

@property (nonatomic, retain) NSString *condition;


@end




GoogleWeatherViewController.m

#import "GoogleWeatherViewController.h"


@implementation GoogleWeatherViewController


@synthesize receiveData, urlConnection, condition;


- (void)viewDidLoad {

    [super viewDidLoad];

// 데이터 초기화

self.receiveData = [[NSMutableData alloc] init];

// 서울의 날씨를 가져오기 위한 주소 string 초기화

NSMutableString *str = [NSMutableString stringWithString:@"http://www.google.com/ig/api?weather=seoul"];

// request 초기화

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:str]];

// 다음과 같은 값을 추가해 줘야한다.

[request addValue:@"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ko; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2" forHTTPHeaderField:@"User-Agent"];

// 델리게이트를 이용해 커넥션한다.

self.urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

}


// 커넥션 데이터 받기 완료 델리게이트

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

// xml 데이터를 받아온다.

[self.receiveData appendData:data];

}


// 커넥션 로딩 마침 델리게이트

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

// 받아온 데이터를 파싱한다.

NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:self.receiveData];

[xmlParser setDelegate:self];

[xmlParser parse];

}


// 현재 엘레먼트를 구분하기 위한 BOOL

BOOL flag;


// 파싱 델리게이트

// 여기에서 날씨의 정보를 가져옵니다.

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName

  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName

attributes:(NSDictionary *)attributeDict {

if ([elementName isEqualToString:@"current_conditions"]) {

// 현재 참조할 엘리먼트가 맞으면

flag = YES;

}

if (flag == YES && [elementName isEqualToString:@"condition"]) {

self.condition = [attributeDict objectForKey:@"data"];

         // flag == NO;

//return;

}

if(flag == YES && [elementName isEqualToString:@"temp_c"])

{

//self.temp = [attributeDict objectForKey:@"data"];

// 엘리먼트의 참조가 끝나면 flag 값을 NO로 해줘야 합니다..

 // NO 해주지 않으면 엘리먼트 정보를 계속 불러와서 다음날 정보가 저장되어 있을 것입니다.;;;;;

         // flag == NO;

//return;

}

}