웹 페이지에 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>…

iOS6에서 다시 태어난 UUID!

iOS5부터 deprecated된 기기의 UDID를 가져오는 메소드 때문에 골머리 썩고 있는 업체가 많은 것으로 알고 있다. 사실 나부터 이것 때문에 꽤 골머리 아팠으니까.. 기존 UUID를 만드는 메소드는 호출할 때마다 다른 값을 가져와서 이에 대한 적절한 대책이 필요했지만 iOS6부터는 심플하게 해결될 것으로 보인다. 애플에서는 이 문제를 의식했던지 (혹은 외부의 압박에 굴복하여..) 이에 대한 대안을 iOS6에 구현하였다. 결과적으로 UIDevice 클래스내에 추가된 identifierForVendor라는 프로퍼티가 기존 UUID에 대한 대안이다. 주석을 해석해보면 Vendor에 따른 UUID값이라는 것을 알 수 있다. 즉, Project의 Vendor에 따른 UUID값이니 Project의 Identifier가 달라도 Vendor가 동일하다면 동일한 값을 리턴한다는 의미겠지? 의심스러운 마음에 테스트를 진행하여보았다. 아! Vendor는 새 프로젝트 생성 시 입력하게 되는 Company Identifier를 의미한다. 테스트로 진행한 방법은 새 프로젝트를 3개 만드는데 2개는 동일한 Company Identifier를 입력하였고 나머지 1개는 앞의 2개와 다른 Compancy Identifier를 입력하였다. 이렇게 만들어진 프로젝트의 AppDelegate의 최초 호출 메소드인 didFinishLaunchingWithOptions 내에서 [[UIDevice currentDevice] identifierForVendor]의 로그를 확인하는 코드를 입력하였다. NSLog(@"vendor identifier : %@",[[UIDevice currentDevice] identifierForVendor]); 각각의 프로젝트를 iPhone Simulator, iPhone4S, iPad2에서…