본문 바로가기

분류 전체보기

(51)
[IOS] UI Test 오늘은 저번 포스팅에 이어서 UI Test를 진행하는 방법에 대해 알아 보겠다. 먼저 Project의 General 탭 하단에 + 버튼을 눌러 UI Testing Bundle을 생성해 주면 된다. 이렇게 Test Bundle을 생성하게 되면 test 진행을 위한 swift 파일이 만들어지게 되는데 해당 파일에서 Test 코드를 작성하여 테스트를 진행하면 된다. 그런데 UI Test에서 봤던 testExample 메소드와는 차이점이 있는 걸 확인할 수 있다. app을 launch 시키는 로직이 존재하고 있는데 UI Test를 위해서 app을 실행한다고 이해하면 되겠다. func testExample() throws { // UI tests must launch the application that they..
[IOS] Unit Test 사내에서 Unit Test와 UI Test 고도화를 위해 새로운 TF가 신설되었고 해당 팀의 구성원으로 들어갈 수 있는 기회를 얻었다. 지금까지 테스트 코드를 작성하면서 작업을 진행해오지 않았던 터라 어디서부터 시작을 해야 될지 감이 오지 않고 있는 상태이다. 물론 맛보기로 간단한 테스트 코드 작성과 테스트 진행 플로우를 익혀보고자 경험 삼아 진행해 본 적은 있었지만 오래전의 일이라 기억이 가물가물한 상태이다. 그래서 이번 기회에 처음부터 다시 Unit Test를 배워본다는 느낌으로 감을 살려보고자 글을 작성해 보려 한다. 먼저 Unit Test Bundle을 만드는 방법에 대해 소개하고자 한다. 프로젝트 생성하기 전 시점이라면 프로젝트 생성 시 아래 이미지와 같이 Include Tests를 체크하면 자..
[IOS] Submodule 설정 앱 내의 새로운 피쳐 개발이나 수정 작업이 아닌 프레임워크 작업이라는 좋은 경험을 회사에서 하게되었다. 이번 포스팅에서는 해당 작업을 위한 세팅 작업과 시작하게된 계기를 간단하게 소개하려한다. 어느 환경에서 무엇을 위해 어떤식으로 쓰였는지에 대한 예시를 들자면 A_Project와 B_Project가 존재하고 있으며 각각의 프로젝트는 동일한 비즈니스 로직을 가지고 있는 View를 가지고 있다고 가정하면 될것같다. 그리고 A_Project에서 디자인 수정 요청이 들어왔으며 해당 작업은 B_Project에서도 동일하게 변경될것을 요청한다고 했을때 각 프로젝트에 개별적으로 변경사항 작업을 진행하여 따로따로 반영하는 방법이 있을수 있고 또는 해당 화면을 프레임워크화 하여 변경사항을 한번의 수정 작업으로 두개의 프..
[IOS] Fastlane 최근 개인 프로젝트에 Fastlane을 도입하여 배포하는 과정의 수고를 덜어주는 자동화 시스템을 구현 했다. 해당 툴을 사용하면 일일이 Xcode에서 빌드 넘버 올리고 아카이브하고 기다렸다가 버튼 누루면서 업로드 하는 등 그러한 행위 없이 Fastlane 하나로 단순화 시켜 배포를 진행할 수 있다. 그리하여 Fastlane 툴을 프로젝트에 도입하는 방법에에 대해 소개하겠다. 먼저 Fastlane 세팅 작업을 위한 Xcode 커맨드 라인 툴을 설치 하도록 하겠다. xcode-select --install 그리고 Fastlane을 install 하고 sudo gem install fastlane 아래 명령어를 입력 후 나온 로그중 버전이 현재 최신 버전과 동일한지 확인한다. 필자는 Fastlane 레포에 들..
[ISSUE] Lottie Animation 백그라운드 진입 후 멈춤 현상 이번 포스팅은 Lottie 애니메이션 사용시 발생했던 이슈에 대해 포스팅 하려 한다. 필자는 Lottie 애니메이션이 동작하고 있는 뷰를 그리고 있었다. 그리고 작업 마무리 시점에 테스트 도중 애니메이션과 연관된 이슈를 만나게 되었다. 이슈 내용은 백그라운드 진입후 포어그라운드로 재진입시 애니메이션의 동작이 멈춰있는 현상이 발생하고 있었던것이였다. 그리하여 그다지 무겁지 않았던 이번 이슈의 리졸브 경험을 기록하려 한다. 해당 작업은 사내 프로젝트이기 때문에 새로운 프로젝트로 포스팅을 이어나가보겠다. 세팅 작업으로는 Lottie 파일 1개와 AnimationView를 준비했다. 그리고 애니메이션의 play 동작 호출까지 작성을 했다. class ViewController: UIViewController {..
[ISSUE] enumerateAttribute를 사용한 부분적으로 Font 변경 이번 포스팅은 enumerateAttribute라는 메소드를 사용하므로써 NSMutableAttribbutedString에 적용 되어있는 속성을 부분적으로 수정하여 최종적으로 기대한 값과 동일한 Attribute 결과를 도출해내는 과정에 대해 알아보겠다. 예를들어 label에 표현해줄 text 값을 서버에서 내려 받아 설정해준다고 가정을 하겠다. (html 형태의 String 타입의 값) 아래와 같이 내려온다고 가정 했을때 "12 34 56 78" html을 변환하는 기본적인 방법을 사용하여 진행해보겠다. let resultAtt = NSMutableAttributedString() let data = "12 34 56 78".data(using: .utf8) let att = try! NSAttribu..
[IOS] TableView (with xib) 이번 포스팅은 xib 파일을 사용한 tableView 구현에 대해 알아보겠다. AppDelegate 혹은 SceneDelegate에서의 rooViewController 설정은 앞 포스팅에서 확인 할 수 있다. [IOS] TableView (with Storyboard) 전 포스팅에 이어서 스토리보드를 사용해 tableView를 구현하는 법을 알아보겠다. AppDelegate 스토리보드 base & Scene을 사용하지 않을때는 plist 파일에서 기본적으로 세팅되어 있는 Appliation Scene Manif devddong.tistory.com [IOS] TableView (with Code) 이번에 입사 하게 될 새로운 직장의 앱 레이아웃 구현이 스토리보드와 xib파일들로 구성되어 있다고 전달받았다..
[IOS] TableView (with Storyboard) 전 포스팅에 이어서 스토리보드를 사용해 tableView를 구현하는 법을 알아보겠다. AppDelegate 스토리보드 base & Scene을 사용하지 않을때는 plist 파일에서 기본적으로 세팅되어 있는 Appliation Scene Manifest 정보를 삭제하여 Scene Configuration 설정들을 삭제해준다. 그리고 SceneDelegate 파일을 삭제하고 SceneDelegate가 생기면서 AppDelegate에 새로 생긴 메소드 2가지(새로운 scene이 생성되거나 삭제될때 호출되는 메소드)를 삭제 해준다. 후에 AppDelegate에서 window를 선언만 해주고 빌드를 해보면 잘 나오는걸 볼 수 있을 것이다. var window: UIWindow? 혹시나 나오지 않는다면 스토리보드에..
[IOS] TableView (with Code) 이번에 입사 하게 될 새로운 직장의 앱 레이아웃 구현이 스토리보드와 xib파일들로 구성되어 있다고 전달받았다. 하지만 필자는 Snapkit이라는 오픈소스를 사용하여 코드로 진행하는 걸 추구하고 있었다. 추후에 협업시 예상치 못한 conflict 발생 우려가 첫번째 이유였고 개발을 공부할 당시 맥북이 다소 좋지 않은 사양이어서 로드하는데에 시간이 소요 되었다는 점이 두번째 이유였다. 출근후에 코드로 레이아웃을 구현해도 된다고 전달 받았지만 이미 작성되어있는 부분들의 유지 보수 측면에서도 그렇고 혼자서 코드로 진행을 한다고 해버리면 프로젝트상에서 일관성을 깨버린다고 생각을 했기때문에 빠른 속도로 스토리보드를 이용한 레이아웃 구현을 훑어봤다. 그리고 그 과정에서 코드로 진행 했을때의 느끼지 못했던 앱의 흐름을..
[RxSwift] Operators (2) Transforming Operators toArray Observable이 방출하는 모든 요소를 배열에 담은 다음 Completed 시점에 이 배열을 방출(하나의 요소를 방출)하고자 할때 toArray 연산자를 사용한다. 소스 Observable이 종료되기 전까지 구독자에게 이벤트가 전달되지 않는다. let subject = PublishSubject() subject .toArray() .subscribe { print($0) } .disposed(by: disposeBag) subject.onNext(1) // 구독자로 전달되지 않음 subject.onNext(2) // 구독자로 전달되지 않음 subject.onCompleted() // Observable이 종료되어 구독자애게 하나의 배열을 전달하..