ATS(App Transport Security) 예외 도메인을 적용했는데도 ATS 오류가 날 때 확인 방법

ATS? WWDC 2016에서 발표된 ATS (App Transport Security) 도입은 iOS9부터 적용되었습니다. SSL 통신을 해야하고 최소 TLSv1.2를 만족해야 하며, 인증서는 SHA256 이상의 해쉬 알고리즘으로 서명되어야 한다는 의미입니다. 하지만 이를 당장에 만족시키기에는 무리다보니 선택적으로 적용되었고 2016년 12월말까지는 필수 적용을 해야한다고 발표했습니다. (그 후 연기가 되었고 지금은 어떤지 모르겠습니다..) 하지만 ATS를 설정한 이후에는 규칙과 예외 도메인을 관리해야하니 귀찮긴합니다… 설정하는 디테일 한 방법은 이 글에서 설명을 하진 않겠습니다. 오류 발생 ATS를 잘 정의했는데 관련 도메인의 추가 등의 이슈로 어느 순간 만날 수 있는 오류 메시지가 있습니다. Connection failed: 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=0x7fada0f31880 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 “(null)”}, NSErrorFailingURLStringKey=MyServiceURL, NSErrorFailingURLKey=MyServiceURL, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.} The resource could not be loaded because the App Transport Security policy requires the use of a secure…

FaceID 지원하도록 기존 코드를 migration 하기

내일이면 1차 출시국에는 iPhone X 이 사용되기 시작하겠군요. (슬픕니다..) 아시다시피 iPhone X에서는 기존의 생체 인증 장치인 Touch ID 가 아닌 얼굴을 인식하는 Face ID만 지원됩니다. 사용자의 단말에 내장된 생체 인증 장치가 Touch ID인지 Face ID인지 구분은 어떻게 하지? 뭔가 다른 걸 해줘야하나? 란 고민에 빠지셨으니 이 글을 보고 계신거겠죠? 이미 Touch ID를 구현하여 사용하고 계시다면 사실 큰 고민이 필요없습니다. LAContext 클래스의 구조는 기존과 거의 동일하니까요. 다른 점은 아래에 나열해보겠습니다. info.plist에 안내 문구 명시하기. Touch ID를 앱 내에서 사용할 때. 즉, LAContext 의 evaluate 메소드가 호출될 때는 아무런 안내 문구가 없었습니다. Touch ID 가 evaluate 될 때 얼럿이 나타나니까요. 하지만 Face ID는 얼럿이 아니라 얼굴 모양의 뷰가 뜨며, 문구를 정의할 수 없도록 되어 있습니다. 그렇다보니 앱 내에서 최초로 활성화 될 때 아래처럼 권한 허용 안내문구가 뜹니다. 그런데, 문구가 개발자 입장에서 참 기분 나쁜 문구죠.. (저만 그런가요…?) 이 부분은 info.plist에 아래와 같이 필드를 추가하면 됩니다. <key>NSFaceIDUsageDescription</key> <string>금전 이동 및 본인 확인을 위해서 사용됩니다.</string>…

다각형의 버튼들 배치

일반적으로 버튼은 rectangle. 즉, 사각형의 영역으로 범위를 정의한다. 하지만 위 스크린샷(노란색과 파란색이 각각 버튼이다.)처럼 종종 다각형(polygon) 형태의 버튼 모양이 디자인으로 나올 수 있고 이를 무조건 rectangle로 만들라고 디자이너에게 요구할 수도 없다. 다각형 버튼 각자의 영역이 겹치지 않는다면 큰 문제가 되지 않지만 여기서 문제는 겹칠 때. 이 때는 respond가 addSubview 메소드를 나중에 호출한 버튼이 호출된다. 당연하다. iOS의 UIView 구조는 포토샵의 레이어와 유사한 구조이다. 이를 해결하기 위해서는 여러가지 방법이 있을 수 있지만 가장 효율적인 방법은 터치한 지점에 해당하는 버튼 이미지의 alpha 값을 가지고와 미리 정해놓은 threshold와 비교해서 response를 return값으로 판단할 수 있다. 이를 충실하게 구현해놓은 Open Source가 있어서 소개한다. https://github.com/ole/OBShapedButton 위 코드는 UIButton을 상속받은 OBShapedButton 클래스와 특정 지점의 Alpha값을 가지고 올 수 있도록 메소드가 정의된 UIImage의 category 클래스가 전부이다. 사용법은 두 클래스를 프로젝트에 추가하고 UIButton으로 정의하던 클래스를 OBShapedButton으로 정의하면 된다. 이 코드는 대부분의 iOS에서 사용할 수 있다. 추가적인 팁으로 화면에 여러 개의 버튼이 배치되었을 때 동시에 버튼들을 누르면 모두 눌러지는 것을 확인할…

포인터형 CF Object를 NS Object로 bridge 하기

iOS 내부에는 NS Object와 함께 CF Object로 이루어진(based) framework가 존재합니다. xcode 4 이후 ARC가 적용되면서 이 두 object간 값을 bridge하는 __bridge 전처리기가 사용되는데 이 두 object간의 변환 방법입니다. CFTypeRef inTypeRef = (__bridge CFTypeRef)result; OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)baseInformation, &inTypeRef); if (status == errSecSuccess) { result = (__bridge_transfer NSData *)inTypeRef; password = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding]; } 위 예제는 Security.framework를 이용하여 Keychain에 저장된 값을 가져오는 예제입니다. SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result) 함수의 두 번째 인자는 포인트를 가지는 CFTypeRef인데 이 값을 NSData로 옮기는 과정에서 위에서 설명한 변환법을 볼 수 있습니다. 즉, __bridge_transfer (NS Object)CG Object를 이용하여 옮긴 것입니다.  

UIStatusBar에 현재 앱 상황 보여주기 (트위터 앱처럼..)

트위터 공식 앱에서 트윗 작성을 하면 화면 상단의 UIStatusBar이 가려지면서 “트윗 전송 중”, “전송 완료”라는 글자가 나타났다가 사라진다. 이 부분 처리가 궁금했는데 github에서 관련 코드를 찾았다. https://github.com/brunow/BWStatusBarOverlay 위 경로에서 받은 코드를 분석하며 구조를 살펴보았는데, 이전에 내가 해보았던 방법과 달랐다… (역시… ㅠㅠ) 일단 위 코드에서 중요한 부분은 UIWindow를 상속받은 클래스이며, window의 level을 UIWindowLevelStatusBar에서 + 1(above)하는 것. 또한 보여주길 원하는 시점에서 window에 올린 UIView를 보여줄 때는 self.hidden = NO로 해야한다는 것이다. 그 외 부수적으로 눈여겨 봐야할 부분은 클래스가 singleton 모델로 구현이 되어 있다는 것 (개인적으로 singleton 모델을 반기지는 않지만 위 코드는 당근 singleton이 맞음!) 이 부분만 염두한다면 코드 보기가 수월할 것이다. 위에서 언급한 부분으로 클래스를 살짝 구현해봤는데 이전에 내가 했던 방법에서 문제가 되었던 부분이 말끔히 해결되었다. (이전에 구현한 코드의 문제점은 메시지가 나타난 후 push/pop 했을 때 view가 깨지는 문제였다.) 배웠다면 써먹어야지~! 구현한 것 돌아가는 것 살짝 동영상으로 찍어봤습니다. YouTube capture 앱 테스트도 해볼 겸.. 영상에서는 상단 Status Bar 변화를 잘 보면 이해하실거라…