AFNetworking 2.x 와 iOS6

AFNetworking은 Server-Client 개발 시 많이 사용하는 오픈소스입니다. Connection 세션관리부터 iOS7에서 새로이 추가된 Task 개념까지 충실히 지원하고 있으며 현재도 업데이트가 활발한 오픈소스입니다. iOS7이 정식으로 발표되고 또 iPhone5s/iPad mini retina가 출시되면서 64bit 지원이 또 다른 개발 화두가 된 시점에서 제가 진행 중인 프로젝트의 앱에도 64bit를 지원해보고자 세팅을 바꾸고 여러 compile warning을 하나씩 확인하면서 수정하다보니 기 적용되어있던 AFNetworking 1.x가 문제가 되었습니다. 이를 다 바꾸기보다는 최신버전이 있는지 확인을 해보았더니 2.0이 등록되어 있었고 반갑게 64bit 지원을 한다고 되어 있어 선뜻 업데이트를 했습니다. 문제는 여기서부터.. 현재 진행 중인 프로젝트 iOS Client의 deployment target이 6.0부터인데 7.0에서만 주로 테스트하다보니 간과하고 넘어간 부분이 있었습니다. 바로 AFHTTPSessionManager 의 블록코드 정의에 있는 NSURLSessionDataTask 였습니다. 이 녀석이 7.0에 추가된 개념이더군요.. 바로 수정에 들어갔는데 블럭 정의를 바꿀 수 있는 방법이.. 있을리 만무하죠; 결론은.. 역시나 저와 같은 문제를 겪은 분의 친절한 Q&A thread가 있더군요. http://stackoverflow.com/questions/20772984/afnetworking-2-0-3-not-working-on-ios-6 참 친절한 stackoverflow입니다. 위 URL의 답변에 보면 iOS7 이상 지원 시에는 AFHTTPSessionManager를 사용하고, iOS6 이상 지원 시에는 AFHTTPReuqestOperationManager를 사용하라고…

웹 페이지에 iOS6의 Smart App Banner 적용하기

iOS6의 새로운 기능 중 하나가 Smart App Banner입니다. 이 기능은 쉽게 말해서 아래와 같이 iOS에 내장된 Safari로 특정 웹페이지를 호출했을 때 화면 상단에 App 배너가 나타나게 하는 기능입니다. 적용을 위해서는 웹 페이지에 간단한 메타태그 한 줄만 넣어주면 됩니다. 참 간단하죠.   자 그럼 위 태그에 입력해야할 값들에 대해서 알아보겠습니다. 1. name 이 부분은 그냥 위와 같이 적어주시면 됩니다. itunes에 적용된 앱이라는 것을 명시하기 위함입니다. 2. content 2.1. app-id (필수) 앱스토어에 등록된 앱이 부여받은 ID값입니다. 이 값을 알기 위해서는 http://itunes.apple.com/linkmaker/ 에서 검색을 합니다. 저는 아래와 같이 아임리얼맛집을 검색했습니다. 하단에 결과가 나왔죠?  그럼 하단 오른쪽에 있는 “iPhone App Link”를 살포시 눌러줍니다. 아래와 같이 검색된 앱의 상세정보가 나타납니다. 여기에서 중요한 부분은 주소 중 “/idXXXXXXXXX?mt=” 의 XXXXXXXXX에 위치한 숫자입니다. 이 숫자가 app-id에 들어갈 ID값입니다. 2.2. affilidate-data (선택) 이 부분은 관련된 컨텐츠를 등록하기 위한 필드이며, http://www.apple.com/itunes/affiliates/ 에서 등록을 해야 사용이 가능합니다. 따로 테스트해 볼 방법은 없는 상황이라 자세한 사항은 위에 명시한 사이트에서 얻으셔야 합니다. 검색을 하다보니 잘…

iOS6에서 특정 View Controller에서의 화면 회전(Auto rotation) 제어하기

h3 앱을 구현하면서 릴리즈 후 modal 된 view controller 들이 회전이 되어버리는 문제가 생겨서 이 부분을 수정하였다. 수정한 것을 설명하기 이전에 알아두어야 할 것은 auto rotation에 관련된 base method가 변경되었다는 것이다. UIViewController를 들여다보면 이전에 사용하던 – (BOOL)shouldAutorotateToInterfaceOrientation: 메소드가 deprecated되고, 대신 -(BOOL)shouldAutorate 메소드와 -(NSUInteger)supportedInterfaceOrientations,  -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentations 가 추가된 것을 볼 수 있다. 즉, iOS6에서는 기존에 사용하던 메소드가 동작하지 않는다는 것이며, 새로운 메소드를 이용해야 한다는 것을 볼 수 있다. Deployment target이 5.x 일 경우에는 기존 메소드를 정의해놓는 것은 잊지 말고… 처음에 언급했던 이슈에 대해서는 사실 메뉴와 컨텐츠가 위치한 main view controller에서 미리 적용하여 문제가 없었으나, 로그인/회원가입, 사전등록 페이지에서는 화면이 돌아가버리는 문제점이 생겼다. 위의 메소드가 적용되었음에도 말이다. 이 문제 해결을 위해 애플 공식 문서를 비롯해 여러 자료를 참고하다보니 언뜻 떠오른 방법이 생각나 이를 적용했더니 깔끔하게 해결되었다. 문제는 view controller가 modal 할 때 UINavigationController를 품고 modal 되니 auto rotation의 주체는 view controller가 아닌 UINavigationController였다. 따라서, UINavigationController를 상속받는 custom view controller를 정의하여 여기에 -(BOOL)shouldAuotorate와 – (NSUInteger)supportedInterfaceOrientations를 아래와…

iOS5 와 iOS6에서의 Date Formatter

프로젝트를 진행하다가 발견된 문제로 일단 기록에 남기기 위해 급하게 써봅니다. 진행 중인 프로젝트에서 DATE를 받아서 처리하는 부분이 꽤 많은데 서버에서 넘겨받은 DATE 문자열이 “2012-10-31T18:00+09:00“이라고 했을 때 이 포맷은 ISO8601에도 명시되어 있는 포맷이 맞음에도 불구하고 붉은색 문자의 처리가 iOS5와 iOS6에서 다름을 알게 되었습니다. 즉, NSDateFormatter를 이용하여 date format을 정의할 때 iOS6에서는 ‘yyyy-MM-dd’T’HH:mmZZZZ’ 으로 정의하면 제대로 파싱이 되지만, iOS5에서는 (null)로 처리되는 문제가 있었습니다. iOS5에서 따로 처리를 해주는 것이 있는지는 조사를 좀 더 해봐야 알 수 있겠지만 현재로서는 이 문제 하나 때문에 critical bug가 되어버린 상황이네요… 급한대로 마지막 ZZZZ에서의 세미콜론이 있으면 세미콜론을 무시하는 코드로 적용했지만 꺼림직한 것은 사실이네요. 추후 부가정보를 찾아보고 포스팅을 업데이트 하겠습니다. 혹여 이에 대한 정보를 가지고 계신 분 계시다면 댓글로 가르침 부탁드립니다.

Facebook SDK 3.1 for iOS 프로젝트에 적용하기

Facebook에서는 iOS6에서 사용가능한 SDK 3.1을 몇 일 전 내놓았다. 이를 적용하기 위한 방법이 Facebook Document에 명시는 되어있지만 상세하게 나와있지 않아 조금 헤메었는데 그에 대한 내용을 적어본다. 우선 Facebook SDK for iOS 를 다운로드 받는다. pkg 파일로 패키징되어 있어 이를 다운로드하여 실행하면 “도큐멘트”에 FacebookSDK라는 디렉토리명으로 저장된다. 다음으로 이를 프로젝트에 포함시킨다. 포함시키는 방법은 FacebookSDK 디렉토리 내에 있는 FacebookSDK.framework를 프로젝트에 드래그 앤 드롭하거나 파일 추가로 포함시키면 된다. 추가적으로 포함시킬 프레임워크가 있는데 이는 “AdSupport.framework”, “Social.framework”, “Accounts.framework”이다. 여기서 첫 번째 문제가 생긴다. AdSupport와 Social은 iOS6에서 추가된 framework로 iOS6 미만 버전에는 없는 framework이다. 따라서 추가할 때는 옵션을 설정하여 준다. 일반적으로 framework를 추가하게 되면 위 화면 오른쪽 끝에서 볼 수 있듯이 “Required”로 설정이 되는데 AdSupport와 Social은 “Optional”로 설정해준다. Deployment Target이 5.0 미만이라면 Accounts 역시 Optional로 설정한다. 그리고 Project의 Build Settings의 Other Linker Flags에 -lsqlite3.0을 추가한다. 다음으로 info.plist에 FacebookAppID와 URL Scheme을 등록해준다. 이는 기존의 방법과 같다. 다음은 AppDelegate의 헤더. 즉, AppDelegate.h에 아래와 같이 헤더와 FBSessionStateChangeNotification을 정의한다. #import <FacebookSDK/FacebookSDK.h>…