개발을 하면서 하나의 프로젝트를 하는데 아무리 단순한 앱이여도 안에 들어가보면 많은 기능들이 들어가있다. 그 기능들을 다 하나하나 손으로 만들면 최적화나 개발능력에 큰 도움이 되겠지만 시간이 그걸 허락해주지 않을때가 많다 보니 나는 오픈 소스를 사용하는것을 좋아한다. 그중에 iOS/OSX 앱을 만들때 네트워크 관련기능을 쓰게 되면서 세션, 에러, 다운로드, 진행상황 등등….처리해야할게 많은데 이럴때AFNetworking을 짠 하고 사용하면 http 통신 관련은 다 해결된다고 보면 된다. 최근에 AFNetworking가 2.x에서 3.x로 바뀌면서 실행이 안되거나 디플리케이티드 된 기능들도 많아서 해당 포스팅은 3.0을 기준으로 작성한다.
AFNetworking 깃헙 주소 – https://github.com/AFNetworking/AFNetworking
AFNetworking 2.x->3.x 마이그레이션 가이드 주소 – https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-3.0-Migration-Guide
podfile
1 2 3 4 |
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' pod 'AFNetworking', '~> 3.0' |
간단하게 빈 프로젝트를 만들고 코코아팟을 사용하여 AFNetworking을 셋팅해본다. 만약 코코아팟 사용법을 모른다면 아래 포스팅을 참고하여 설정해본다.
http://a.lotco.de/?p=49
보통 AFNetworking을 사용할때는 파일 다운로드나 restful을 사용할때 많이 사용한다. get/post 방식을 이용하여 데이터를 가져올때이다. 간단하게 get 형식을 통해 json형식의 데이터를 받아오는 예제를 작성해보겠다. 먼저 사용할 프레임워크를 추가해준다.
1 |
#import <AFNetworking/AFNetworking.h> |
그리고 UI를 따로 만들기 귀찮으니 viewDidLoad 시점에서 리퀘스트를 요청해보겠다.
여기서 중요한건 기존 2.x 버젼에 사용하던 GET:parameters:success:failure:는 디플리케이티드 되었다. 3.x 버전부터는 GET:parameters:progress:success:failure: 을 사용하여야 한다. 중간에 progress 파라미터가 추가되어서 파일 다운로드나 다른 작업을 할때 굳이 델리게이트나 노티피케이션 설정을 안하고도 블록문으로 리퀘스트의 진행 상황을 바로 파악할 수 있게 되었다.
기존 값으로는 parameters에는 파라미터가 들어간다….개그가 아니라 설명을 잘 못하겠다… 리퀘스트 쿼리를 날리면서 요청할 값들에 대하여 값들을 집어 넣고 그 밑에는 success블록과 failure블록이 있다. 딱 그대로 리퀘스트가 성공했을때와 실패했을때를 구분하여 실행된다. 실패 할 경우에는 서버가 응답하지 않을때, 리퀘스트 요청 시간이 초과하였을때, 앱이 네트워크를 사용 할 수 없을때 등이 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/* 네트워크 세션 메니져를 초기화해준다 해당 메니져로 동시에 최대 몇개의 리퀘스트를 처리할지나 n초 이상 리스폰스가 오지않으면 실패처리등을 설정해서 관리 할 수 있다. 받을 리스폰스 값이 json 형식이여서 메니져에다가 json이라고 미리 셋팅을 해준다 */ AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer = [AFJSONResponseSerializer serializer]; /* 요청할 url */ NSString *url = @"http://api.openweathermap.org/data/2.5/forecast"; /* 메니져를 통해 리퀘스트를 날릴 url과 쿼리를 설정한다. */ [manager GET:url parameters:@{@"q":@"Seoul", @"appid":@"2de143494c0b295cca9337e1e96b00e0"} progress:nil success:^(NSURLSessionTask *task, id responseObject) { NSLog(@"%@", responseObject); } failure:^(NSURLSessionTask *operation, NSError *error) { NSLog(@"%@", error); }]; |
설정이 끝나고 빌드를 해보면 콘솔에 다음과 같은 결과를 얻을 수 있다.
1 2 |
2016-01-20 18:50:36.699 RAFTest[15260:4456027] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file. 2016-01-20 18:50:36.703 RAFTest[15260:4455969] Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSUnderlyingError=0x15454e390 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}, NSErrorFailingURLStringKey=http://api.openweathermap.org/data/2.5/forecast?q=Seoul&appid=2de143494c0b295cca9337e1e96b00e0, NSErrorFailingURLKey=http://api.openweathermap.org/data/2.5/forecast?q=Seoul&appid=2de143494c0b295cca9337e1e96b00e0, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.} |
아씨….iOS 9 부터 추가된 기능으로 앱에 http 요청을 하려면 따로 설정을 해주어야만 한다. 프로젝트 안에 Info.plist항목을 우측버튼으로 누르면 메뉴가 나온다 거기서 Open As->Source Code를 누르면 info.plist의 소스가 보인다. 옆의 메뉴에서 하나씩 속성을 추가해도 되는데 귀찮다. 하단에 있는 코드를 제일 하단에 </dict>전에 입력한다.
1 2 3 4 5 |
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> |
그리고 빌드를 하면 에러없이 빌드가 짠! 하고 된다! 콘솔창에는 오늘의 서울 예보가 json형식으로 짠 하고 나올것이다. 이제 받은 데이터를 이용해 열심히 개발을 하면된다.
One thought on “AFNetworking 3.0 사용하기 [openweathermap을 사용하여 현재 날씨 가져오기]- 1”