Multiple Firebase Configuration 설정하기

Requirements xcconfig 과 Xcode scheme 을 이용하여 하나의 Xcode 프로젝트로 각 서버환경에 따른 앱을 구성했다. (요건 별도의 포스팅을 통해 상세히 서술해보겠습니다.) 오류 로그 관리를 위해 Firebase Crashlytics 서비스를 이용하기로 결정하였고 Firebase 에서 제공하는 메뉴얼을 통해 SDK를 연동 중 GoogleService-Info.plist를 다운받았다. 서버 환경이 3종류다보니 3개의 파일을 받았다. Try First FirebaseOption 클래스를 보니 파일이름을 파라미터로 instance를 생성하는 인터페이스가 존재한다. 동일한 파일명의 파일 3개를 프로젝트에 포함시켜야 하니 구분을 용이하게 하기 위해 파일이름을 아래와 같이 변경하였다. GoogleService-Info-Dev.plist GoogleService-Info-Staging.plist GoogleService-Info-Production.plist 그리고 아래와 같이 코드를 작성하였다. 실행을 했더니 GoogleService-Info.plist 파일을 찾을 수 없다는 경고가 로그창에 나타난다. 😣😤😡 Firebase SDK 개발팀에 대한 불만은 이전부터 있었다. SDK가 업데이트 될 때마다 자잘한 버그들이 끊이지 않은 것 때문인데, 이 경우도 그렇다. 인터페이스는 만들어두고 왜 코드 내부에서는 이를 처리하도록 하지 않는 것인가! 반성 좀 하길.. 😡 구글링을 해서 찾아보니 이 문제 때문에 발행된 이슈들이 꽤 있었다. In new Firebase, how to use multiple config file in xcode? Use different GoogleService-Info.plist for…

Swift Package Manager(SPM) 써보기 #2

현재 필자가 관리 중인 프로젝트에서 SPM으로 등록된 library들을 import 할 수 없는 문제가 발생했다. 내가 뭔가 잘못한 것인가? 를 검증하기 위해 구글링을 해보던 차에 apple developer forums 에서 아래와 같은 글을 발견하였다. Ok so after various tries I’ve created new project, added files from the old one and during this I’ve encountered at identical situation, it turns out that the issue is not in build settings but rather in configuration.You cannot build SPM with different configuration than ‘Debug’ and as in most of my projects I have multiple configurations, that why I wasn’t able to use SPM in them.Unfortunately I couldn’t find a way to change target configuration, nevertheless I’m closing this thread, I hope that my explanation above will hope someone with the same issue 필자가 관리하고 있는 프로젝트 역시 여러 개의 configuration을 설정해놓은 상태인데 과연 이 문제일까해서 몇 가지 테스트를 진행해보았다. 테스트 Configuration 설정을 기본값으로… 새로운 프로젝트를 하나…

Swift Package Manager(SPM) 써보기 #1

기다리던 Xcode 11 GM이 나왔다. 과감하게(?) 개발 중이던 프로젝트를 열고 SPM을 지원하는 외부 library를 리스팅 후 Podfile 에서 삭제하고 이를 SPM으로 관리할 수 있게 설정을 해보았다… 과정은 아래와 같다. SPM을 이용해 외부 라이브러리 등록하기 SPM을 이용하여 외부 프레임워크를 등록하기 위해서는 Project -> Swift Package로 이동하여 +버튼 선택 혹은 상단 메뉴 File -> Swift Packages -> Add Package Dependency… 를 선택한다. 현재 SPM을 지원하는 인기(필자가 주로 사용하는 ㅋ) 외부 라이브러리는 얼추 아래와 같다. RxSwift, RxCocoa, RxDataSources Alamofire SDWebImage SnapKit 위에 나열된 것 외의 오픈소스 library가 SPM을 지원하는지 여부를 확인하기 위해서는 해당 Git Repository로 가서 확인하면 되겠다. (CocoaPods으로 관리하던 라이브러리가 대부분일텐데 https://cocoapods.org 로 이동 후 원하는 라이브러리를 검색하고 상세 보기에서 오른쪽 하단에 보면 GitHub Repo 링크를 통해 이동하면 편리하다.) 버전 관리 룰 지정 Repository URL 을 입력하고 하단 Next 버튼을 누르면 해당 Repository를 검색한 후 아래와 같이 버전 관리 rules를 어떻게 할 것인지 묻는 창으로 바뀐다. 버전 관리룰은 아래와 같으며, 편한 방법으로…

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>…