iOS 14

[iOS] MVVM 디자인 패턴에 대한 고찰

안녕하세요. 모리스입니다.😀많진 않지만 velog에서 티스토리로 이사를 드디어 완료했네요.핑계 아닌 핑계로 일하면서 블로그 쓰기 쉽지 않은 것 같아요..😂(매일 연재하시는 분들 존경해요👍)본론으로 들어가서... 이번 노트에서는현재 회사의 iOS 앱은 전통적인 Cocoa MVC 패턴으로 디자인 되어있는데이번에 이 MVC 디자인 패턴을 MVVM디자인 패턴으로 리팩토링을 진행하게 되었습니다.리팩토링을 진행하면서 했던 고민들과 새로 알게된 점들을 작성해 보려 합니다. 사실 iOS에서의 MVVM 패턴은 swiftUI가 나오면서 많은 개발자 분들이 사용하기 시작한 것 같아요.왜냐하면 swiftUI + MVVM(feat. RxSwift)는 Apple에서 권장하는 조합이기도하고거의 국룰처럼 자리잡은 듯 싶어요. ..

iOS 2025.09.02

[iOS] SnapKit 라이브러리 사용하기

안녕하세요. 모리스입니다.😀 이번 노트에서는 iOS의 AutoLayout을 쉽게 설정할 수 있도록 해주는 SnapKit 라이브러리에 대해서 기술해 보려 합니다.SnapKit?SnapKit은 iOS, OS X등의 앱 개발에서 AutoLayout을 코드로 구현할 때 사용하는 강력한 라이브러리에요. 기존의 복잡한 NSLayoutConstraint 코드를 더 읽기 쉽고 유지보수가 용이한 레이아웃 코드를 작성할 수 있게 해줘요. 자, 사실 우리에게 중요한건 SnapKit이 무엇이냐보단 어떻게 쓰느냐일 태니.. 본론으로 들어가 볼게요.설치 방법SnapKit 라이브러리 문서에서는 세 가지 설치 방법을 제공해요.CocoaPods터미널에서 프로젝트 디렉토리로 이동pod init 명령어로 Podfile 생성 (Podfi..

iOS 2025.08.26

[iOS] 오픈소스 라이센스 명시하기

안녕하세요. 모리스입니다.😀 이번 노트에서는 앱에서 사용하는 오픈소스 라이센스를 명시하는 방법에 대해서 기술하려 한다.앱에서 사용하는 오픈 라이브러리를 명시하는 방법에는 크게1) 앱 내에 설정 화면 등에 명시하는 방법과2) iOS 설정 > 앱 목록 > 해당 앱에 라이센스 정보를 명시할 수 있다.이 노트에서는 2번의 경우를 알아보려 한다.LicensePlist 라이브러리앱에서 사용중인 오픈소스 라이센스들의 정보를 자동으로 추출해주는 라이브러리이다. 해당 라이브러리는 Homebrew를 통해 서만 설치가 가능하다. (Homebrew가 설치되어 있지 않다면 다음을 참고.)터미널에 다음 명령어로 LicensePlist 라이브러리를 설치한다.brew install licenseplist licensePlist 설..

iOS 2025.08.26

[iOS] URL Scheme으로 지도 앱 연동하기 (TMap, kakaoMap, naver지도)

안녕하세요. 모리스입니다.😀 iOS 지도 앱 연동 (URL Scheme)이번 노트에서는 URL Scheme을 사용하여 한국에서 대표적으로 많이 쓰이는 지도 앱들을 연동하는 방법에 대해 기술하려한다.앱이 설치돼 있으면 앱을 실행 시켜 절정한 위치가 노출되도록 하며, 설치되어 있지 않다면 app store로 이동해 앱 설치를 유도한다.🛠 사전 설정URL Scheme을 사용하려면 Project file > TARGETS > Info 탭에서 Queried URL Schemes 항목을 추가해야 한다.설정하지 않으면 앱이 Scheme을 인식하지 못해 동작하지 않는다.🚗 티맵 연동func openTMap(latitude: Double, longitude: Double) { let urlString = "t..

iOS 2025.08.26

[iOS] Main Thread Checker: UI API called on a background thread: 오류

안녕하세요. 모리스입니다.😀 이번 노트에서는 UI 업데이트 시 한 오류에 관해 작성해보려한다.Main Thread Checker: UI API called on a background thread: 위 오류는 UI를 Main Thread가 아닌 다른 Thread로 접근하려 할때 노출되는 에러 메시지이다.앱의 퍼포먼스를 위해 UI 업데이트 관련 작업은 Main Thread에서 작업을 수행하도록 해야한다.DispatchQueue.main.async {} 구문을 통해 해당 UI작업이 Main Thread에서 구동되도록 해야 다음 에러가 해결된다. 기존 velog에 글을 옮겨오다보니.. 티스토리에서는 구어체로 쓰고 싶었지만 기존엔 문어체로 써놔서..글이뒤죽박죽입니다..!(양해부탁드립니다..😂)

iOS 2025.08.26

[iOS] WKWebView로 JavaScript의 이벤트 받기

안녕하세요. 모리스입니다.😀 회사에서 webView의 특정 버튼을 누르면 앱 UI의 변화를 줘야하는 기능을 구현해야 했다.그중 생각한 것이 webView의 특정 버튼을 눌렀을 때, 이벤트를 받아와 처리해주면 되겠다는 생각을 했다.그래서 프론트개발자에게 버튼을 누르면 이벤트를 앱으로 보내주는 방법을 설명해 해당 함수를 작성해 달라고 요청했고, 나는 front에서 보낸 메시지를 받는 방법을 구현했다.이번 노트에서는 WKWebView가 javascript의 함수를 호출해 메시지를 받아오는 방법에 대해 작성해 보려한다.웹에서 앱으로 보내는 방법 또한 기술하면 좋겠지만.. 아직 front기술에 무지한 터라 앱에서 이벤트를 받는 방법에 대해서만 기술하려한다. 추후 스택이 더 쌓이면 추가 포스트 해보겠다.impor..

iOS 2025.08.26

[iOS] SQLite 사용하기

안녕하세요. 모리스입니다.😀기존 velog에 글을 옮겨오다보니.. 티스토리에서는 구어체로 쓰고 싶었지만 기존엔 문어체로 써놔서..글이뒤죽박죽입니다..!(양해부탁드립니다..😂)그럼 시작하겠습니다.... 이번 노트에서는 앱 내에서 database를 사용해 보려한다. 여러 방법이 있지만 sqlite를 사용하여 데이터 CRUD하는 방법을 알아보려 한다.importimport SQLite3sqlite3는 기본 내장 되어있어 import만 해주면 된다.createvar database: OpaquePointer?let tableName: String = "dbTable"func createTable() { let fileURL = try! FileManager.default.url( for: ..

iOS 2025.08.26

[iOS] WebView LocalStorage 사용하기

안녕하세요. 모리스입니다.😀 기존 velog에 글을 옮겨오다보니.. 티스토리에서는 구어체로 쓰고 싶었지만 기존엔 문어체로 써놔서..글이뒤죽박죽입니다..!(양해부탁드립니다..😂) 그럼 시작하겠습니다.... 이번에 회사에서 프로젝트 진행 중 webKit의 webView localStorage에 회원의 이름과 생년월일을 저장하고 이를 웹에서 보여주도록 하는 로직이 필요했다.이번 노트에서는 iOS앱에서 webView를 통해 web의 localStorage에 데이터를 저장하는 방법을 기술하려 한다. 우선 사용법에 들어가기 앞서 web storage에 대해서 알아보자.web storage는 데이터를 서버가 아닌 클라이언트 레벨에 저장하는 기술을 말한다.web storage는 크게 session stora..

iOS 2025.08.26

[iOS] UITextField 글자 수 제한하기

안녕하세요. 모리스입니다.😀기존 velog에 글을 옮겨오다보니.. 티스토리에서는 구어체로 쓰고 싶었지만 기존엔 문어체로 써놔서..글이뒤죽박죽입니다..!(양해부탁드립니다..😂)그럼 시작하겠습니다.... 이번 노트에서는 UITextField로 text를 입력받을 때 글자 수를 제안하는 방법에 대해 작성해 보려한다.예전에 React-Native로 앱을 개발할 땐 TextInput component에 maxLength를 지원해 간단히 조건만 추가해주면 됐는데 iOS에서는 이런 간단한 글자 수 제한조차 직접 다.... 구현해 줘야한다...ㅠ입력 받는 text를 UITextFieldDelegate로 읽어와 글자 수를 제안하도록 할 것이다.구현은 생각보다 간단하다. UITextFieldDelegate의 shoul..

iOS 2025.08.26

[iOS] UITableView 특정한 위치로 스크롤 이동

안녕하세요. 모리스입니다.😀이번 노트는 간단하게 UITableView의 scroll에서 특정 IndexPath로 scroll되는 방법을 기술하려합니다.방법은 간단해요.tableView의 scrollToRow를 사용하여 특정 IndexPath로 scroll 되게 할 수 있어요.let indexPath = IndexPath(row: 0, section: 0)self.tableView?.scrollToRow(at: indexPath, at: UITableView.ScrollPosition.top, animated: true)이렇게하면 indexPath의 row와 section을 모두 0번째로 설정해 tableView의 최상단으로 scroll할 수 있어요.다른 방법으로는 UITableView의 contentO..

iOS 2025.08.25