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…

Universal Link (iOS9) 적용하기

Universal Link? iOS9에서는 Universal Link 라는 기능이 추가 되었습니다. 이 기능을 쉽게 설명하자면, 일반적인 링크를 유저가 선택 시 해당 웹페이지로 이동하는 것이 아닌 해당 웹페이지에서 제공하는 앱을 띄워주는 기능입니다. 기존에는 앱의 고유 scheme을 정의해서 띄우는 방식이었는데 여기서 조금 더 발전된 기능이죠. Medium이라는 앱을 주로 사용하시는 분들은 이미 이 기능을 보셨을 수도 있겠네요. 짧지만 데모 영상 보고 가실게요~ 영상 최초 화면은 iOS 기본 메모장으로 테스트를 위해서 형식을 달리한 제 홈페이지 주소를 저장해뒀습니다. 그 주소 중 하나를 선택하면 일반적으로는 safari가 열리며 홈페이지가 열리지만 제가 임의로 만든 앱으로 이동하는 것을 볼 수 있습니다. 이것이 Universal Link 입니다. 간단하죠? Universal Link 구현 방법 당연하겠지만 애플 문서에서 잘 설명하고 있습니다. 그 외에도 검색을 해보면 여러 글들이 보입니다. 웹서버에 apple-app-site-association 파일 업로드 앱과 연관된 웹 서버의 루트(ubuntu 서버에서는 기본적으로 /var/www/html)에 정의 된 apple-app-site-association 파일을 업로드 합니다.이 파일은 JSON 형태로 아래와 같은 형태를 가집니다. JSON 내용 중 appID는 애플 개발자 계정의 Account Info 내용 중 Team ID 값과 앱의 identifier입니다.…

이제 Swift로 넘어가도 되요?

iOS 앱 개발자 혹은 관심있는 분들이 관심가지는 화두는 “이제 Swift 로 넘어가도 되요?” 인 것 같다. 어제 OSXDev 모임 때는 내 의견을 언급하지 않았지만 조금 진지체로 내 생각을 얘기하자면 넘어가고 말고는 모두의 마음에 있는 모험심(도전정신)에 달려있다고 본다. 개인적인 이야기를 조금 하자면, 학교에서는 하드웨어 하느라 C/C++만 했었고 대학원 때는 시뮬레이터 만든다고 MFC, 첫 직장에서는 Android 개발을 했었던지라 iOS 앱 개발을 처음 시작했을때는 생소한 Objective-C라는 언어에 익숙해지려 부단히 노력을 했었다. 시중에 나오는 책들 다 사서 이것저것 참조하고 온라인 뒤지고 iOS 업데이트 될 때마다 새로운 기능들 연습삼아 만들어보고.. 다시 그렇게 할 수 있을까란 생각이 들 정도로 재미있었고 문턱 하나씩 넘는 재미에 푹 빠져있었다. 2014년 WWDC에서 Swift가 발표되었을 때는 옆에 계신 분에게 전 계속 Objective-C만 할 겁니다. 라고 했는데 숙소에 돌아와 곰곰히 생각해보니 뭔가에 익숙해지다보니 점점 보수적이 되고 안주하려는 내가 무서워졌었다. 그래서 관심은 가져보자는 생각에 Swift 관련 자료나 도서에 관심을 가지게 되었고 SKP에서 마지막 프로젝트는 함께 프로젝트 수행하는 형님에게 동의를 구하여 Swift로 세팅해서 일단…

xcode7에서 자동으로 관리되는 Provisioning Profile 갱신하는 먼지팁(?)

xcode로 iOS 앱이나 Mac 앱 개발하기 위해 Provisioning Profile 설정을 해야합니다. 저처럼 일일이 손으로 provisioning을 관리하는 개발자분들도 계시겠지만 xcode가 자동으로 관리하도록 하여 편하게 쓰시는 분들도 꽤 계시는 걸로 알고 있습니다. 단말이 추가되거나 갱신이 필요할 때는 아래처럼 Preferences > Accounts > View Details에서 왼쪽 하단에 있는 refresh 버튼을 누르실텐데요. xcode7에서는 이 Refresh 버튼이 사라지고 그 자리에 아래처럼 Download All 버튼이 자리를 잡고 있습니다. UI 버튼 하나가 바뀌었는데 이렇게 되면 Refresh는 어떻게 하냐?! 라고 실제 애플 포럼과 개발자들의 성지인 stackoverflow에 관련 글이 꽤 있는 상황입니다. 이럴 때 손쉽게(?) 갱신을 할 수 있는 먼지팁입니다. Apple Developer Portal에서 단말 변경 (등록 / 삭제)를 한다. xcode로 돌아와 갱신이 필요한 Provisioning Profile에서 마우스 오른쪽 버튼을 눌러 “Move to Trash”를 선택해 로컬에서 해당 Provisioning을 삭제한다. 다시 Download라는 버튼이 나타났을 때 Download 누른다. 네 이 세 단계가 끝입니다. 실제로 해보니 다시 다운로드 받을 때 갱신을 하고 내려주는 걸로 확인했습니다 (Expires Date 가 변경됨) Apple에서는 개발자들이 편하라고(?) Refresh를 다운로드…

3D Touch 적용하기 (2) – UIKit Peek and Pop

이번에는 UIKit peek and pop 중 preview action에 대해서 살펴보겠습니다. 애플에서 제공하는 예제를 참고하였습니다. 애플 공식 예제 Peek and Pop 이란? 우선 Peek과 Pop의 차이점을 먼저 설명하면 Peek은 화면을 누르는 강도를 점점 강하게 했을 때이고 Pop은 아주 강하게 꾸욱 눌렀을 때를 의미합니다. Peek은 지원 단말을 가지고 계신 분들이라면 신기해서 많이 해보셨을텐데 Pop을 해보셨을지는.. (네.. 저는 이 문서 작성하면서 알았습니다..) Peek and Pop의 구현 등록(Register) : registerForPreviewingWithDelegate 메소드를 통해 preview delegate 및 preview가 나타날 대상 view를 지정합니다. 또한 대상 view controller에 UIViewControllerPreviewingDelegate protocol을 지정합니다. 일반적으로 viewDidLoad 메소드에서 등록을 합니다. Peek :  protocol 메소드 중 previewingContext: viewControllerForLocation: 을 통해 기능이 정의되며 Previewing에 사용할 View Controller를 지정하고 animation이 시작될 rect 와 preferred content size를 지정합니다. Pop : protocol 메소드 중 previewingContext: commitViewController: 를 통해 정의됩니다. 일반적으로는 showViewController 혹은 showDetailViewController를 이용하며 둘의 차이점은 타겟이 되는 view controller만 전체화면으로 보여줄 것(showDetailViewController)이냐 대상 view controller를 포함한 container view controller까지 전체화면으로 보여줄 것이냐 차이로 저는 이해를 했습니다. Previewing Action…