iOS 프로젝트 모범 사례 및 도구

오픈 소스 Xcode 프로젝트 템플릿

그린 필드 iOS 프로젝트에서 작업 할 때 종종 새 프로젝트를 처음부터 시작해야했습니다. 그렇게하는 동안 저와 제 팀은 항상 도구 통합, 프로젝트 구조 설정, 기본 클래스 작성, 외부 라이브러리 통합 등과 같은 기본 프로젝트 설정에 많은 시간을 소비했습니다.

프로젝트 시작에 소요되는 시간을 절약하고 프로세스를 대부분 자동화 할 수 있다고 결정했습니다. 나는 우리가 사용한 모든 일반적인 모범 사례와 도구를 작성하고 새 프로젝트를 시작할 때 나와 팀이 사용할 수있는 프로젝트 템플릿을 준비했습니다. 이 템플릿을 사용하면 프로젝트 설정 시간을 절약 할 수있을뿐만 아니라 프로젝트 구조와 기초를 생각하고 탐색 할 필요가 없도록 각 팀원이 익숙해 질 공통 기초를 제공 할 수 있습니다. 그들은 항상 동일합니다.

템플릿에 포함 된 각각의 모든 도구 또는 모범 사례는 자체적으로 기사가 필요하지만 각 포인트를 요약하고 포함시킨 이유를 간단히 설명하고자했습니다.

코코아 포드

나는 이것이 소개가 필요하다고 생각하지 않습니다. 이것은 iOS 프로젝트의 외부 종속성을 관리하기위한 라이브러리입니다. 오랫동안 주변에 있었고 수천 (수백만이 아닌 경우)의 프로젝트에서 강력하고 전투 테스트되었습니다. Carthage와 같은 대체 종속성 관리자가 있지만 Cocoapods가 지원하는 가장 광범위한 오픈 소스 프로젝트를 가지고 있기 때문에 Cocoapods와 함께하기로 결정했습니다. Cocoapods를 사용하는 것은 매우 쉽고 필요한 색인을 쉽게 찾을 수있는 검색 색인과 함께 제공됩니다.

템플릿 프로젝트에는 Swiftlint 및 R.swift가 포함 된 간단한 Podfile이 제공됩니다. 템플릿에는 또한 종속성을 해결하는 데 사용되는 Cocoapods 버전을 관리하기위한 Gemfile이 포함되어 있습니다. 이는 팀의 개발자가 다른 버전의 Cocoapod 자체를 사용하여 종속성을 설치할 때 발생하는 문제를 방지하기 위해 간과되는 개선입니다. Gemfile은 전체 팀에서 동일한 Cocoapods 버전을 사용하도록 강제합니다.

스위프트 린트

Swiftlint는 팀의 모든 프로그래머에게 특정 규칙 및 코딩 스타일을 적용하는 데 매우 유용한 도구입니다. 강제 풀기, 강제 실행, 강제 시도 등과 같은 위험한 것에 대해 프로그래머에게 경고하는 자동 코드 검토 시스템으로 생각할 수 있지만 모든 프로그래머가 동일한 "코드 스타일"관련 규칙을 준수하도록하여 일반적인 코딩 스타일을 적용합니다. 들여 쓰기 또는 간격 규칙과 같은 이는 기본적인 검사를 수행하여 코드 검토 시간을 절약 할뿐만 아니라 프로젝트의 모든 파일을 친숙하게 보이게하여 가독성을 높이고 결과적으로 모든 개발자의 이해를 높입니다. 여기에서 모든 규칙 목록을 찾을 수 있습니다. 템플릿에서 Swiftlint는 Cocoapods를 통해 설치되고 Build Phases 단계에 포함되어 모든 프로젝트 빌드에서 개발자에게 보푸라기를 경고합니다.

R.swift

R.swift는 이미지, 폰트, 언어 및 현지화와 같은 강력한 유형의 자동 완성 리소스를 얻기위한 도구입니다. 프로젝트를 스캔하고 리소스를 얻는 데 필요한 빠른 클래스를 생성하여이를 수행합니다. 이 라이브러리의 가장 큰 판매 포인트는 리소스를 사용하면서 코드를 작성한다는 것입니다.

  • 완전 타이핑-덜 캐스팅하고 메소드가 무엇을 리턴할지 추측
  • 컴파일 시간 확인 — 런타임에 앱이 충돌하는 더 이상 잘못된 문자열이 없습니다.
  • 자동 완성 — 이미지 / 니브 / 스토리 보드 이름을 다시 추측 할 필요가 없습니다.

공식 문자열 API를 사용하여 다음 코드를 고려하십시오.

let icon = UIImage (이름 :“custom-icon”)

이미지 이름의 철자가 틀리면 여기에 0이 표시됩니다. 팀원 중 한 명이 이미지 리소스의 이름을 변경하면이 코드는 nil을 반환하거나 이미지를 강제로 풀면 충돌합니다. R.swift를 사용하면 다음과 같이됩니다.

let icon = R.image.customIcon ()

이제 아이콘이 실제로 존재하는지 확인할 수 있습니다 (컴파일 시간 검사 덕분에 컴파일러가 경고를 표시합니다). 자동 완성을 사용하기 때문에 아이콘 이름에 오타가 생기지 않을 것입니다.

R.swift는 Cocoapods를 통해 설치되고 빌드 단계로 템플릿에 통합되며 각 빌드에서 Swift 래퍼 클래스를 생성합니다. 즉, 파일 / 이미지 / 현지화 / 글꼴 / 컬러 / 니브 등을 추가하면 프로젝트를 컴파일 한 후에 R.swift를 사용할 수 있습니다.

테스트를위한 별도의 AppDelegate

종종 간과되는 모범 사례는 테스트를 실행할 때 별도의 TestAppDelegate 클래스를 갖는 것입니다. 왜 좋은 생각입니까? 일반적으로 AppDelegate 클래스는 앱 시작시 많은 작업을 수행합니다. 창을 설정하고, 앱의 기본 UI 구조를 구축하고, 알림을 등록하고, 데이터베이스를 설정하고, 때로는 일부 백엔드 서비스에 대한 API 호출을 수행 할 수도 있습니다. 단위 테스트에는 부작용이 없어야합니다. 임의의 API 호출을하고 앱의 모든 UI 구조를 설정하여 단위 테스트를 실행하고 싶지 않습니까?

TestAppDelegate는 테스트 스위트 실행 중에 한 번만 실행하려는 코드를 저장하기에 좋은 장소입니다. 모의 객체, 스텁 네트워크 요청 등을 생성하는 코드가 포함될 수 있습니다.

템플릿에는 앱의 기본 진입 점 인 main.swift 파일이 포함되어 있습니다. 이 파일에는 앱이 현재 실행중인 환경을 확인하고 테스트 환경 인 경우 TestAppDelegate를 호출하는 메소드가 있습니다.

컴파일러 성능 프로파일 링 플래그

Swift는 Objective-C (IMO)보다 뛰어난 언어이며 사용하기 쉽고 안전합니다. 그러나 처음 소개되었을 때 컴파일 시간이라는 큰 단점이있었습니다. Swift에서 이틀 동안, 나는 대략 40k 줄의 Swift 코드 (중간 규모 프로젝트)를 가진 프로젝트를 작업하고있었습니다. 이 코드는 제네릭과 형식 유추로 무거웠으며 깨끗한 빌드를 컴파일하는 데 거의 5 분이 걸렸습니다. 약간만 변경하면 프로젝트가 다시 컴파일되고 변경 사항을 확인하는 데 약 2 분이 걸렸습니다. 그것은 내가 가진 최악의 개발자 경험 중 하나 였고 그로 인해 Swift 사용을 거의 중단했습니다.

당시 유일한 해결책은 프로젝트의 컴파일 시간을 프로파일 링하고 코드를 변경하여 컴파일러를 더 빠르게 만드는 방법이었습니다. 이를 돕기 위해 Apple은 메소드 본문을 컴파일하거나 표현식 유형을 해석 할 때 너무 오래 걸렸을 때 경고하는 비공식 컴파일러 플래그를 소개합니다. 이 플래그를 템플릿 프로젝트에 추가 했으므로 처음부터 앱의 컴파일 시간이 길다는 경고가 표시됩니다.

요즘 빌드 시간이 크게 향상되었으며 빌드 시간을 향상시키기 위해 코드를 조정할 필요가 거의 없습니다. 그러나 프로젝트가 너무 커질 때 문제를 해결하기 위해 미리 알고있는 것이 좋습니다.

개발 / 무대 / 생산 구성

또 다른 좋은 방법은 개발, 준비 및 프로덕션 환경에 대해 별도의 구성 및 환경 변수를 갖는 것입니다. 오늘날 거의 모든 앱은 일종의 백엔드 서비스에 연결해야하며 일반적으로 이러한 서비스는 여러 환경에 배포됩니다. 개발 환경은 매일 배포하고 개발자가 코드를 테스트하는 데 사용됩니다. 스테이징 환경은 테스터 및 클라이언트가 테스트 할 안정적인 릴리스에 사용됩니다. 우리 모두는 프로덕션 환경이 무엇인지 알고 있습니다.

iOS 프로젝트에서 여러 환경을 지원하는 한 가지 방법은 프로젝트 레벨 구성을 추가하는 것입니다.

프로젝트 레벨 구성

구성을 정의한 후에는 각 환경에 대한 변수가 포함 된 Configuration.plist 파일을 만들 수 있습니다.

Configuration.plist

프로젝트를 실행할 때 사용해야 할 구성을 지정할 수 있습니다. 빌드 체계에서이 작업을 수행 할 수 있습니다.

그런 다음 프로젝트 Info.plist 파일에 하나의 추가 속성을 추가해야합니다. 이 특성의 값은 런타임시 현재 구성 이름으로 동적으로 분석됩니다.

템플릿에서 모두 미리 구성되어 있습니다.

남은 것은 빌드 체계에서 선택한 구성에 따라 런타임에 해당 변수를 검색 할 수있는 클래스를 작성하는 것입니다. 템플릿에는 현재 환경에 대한 변수를 검색 할 수있는 ConfigurationManager 클래스가 포함되어 있습니다. Github에서 해당 클래스의 구현을 확인하여 작동 방식을 확인할 수 있습니다.

읽어보기

모든 프로젝트에는 최소한 종속성을 설치하고 프로젝트를 실행하는 방법에 대한 지침이있는 기본 추가 정보가 있어야합니다. 또한 프로젝트 아키텍처 및 모듈에 대한 설명도 포함해야합니다. 불행히도 개발자는 문서를 작성하는 것을 좋아하지 않으며 (Readme는 그 일부입니다) 몇 달 동안 개발 된 프로젝트를 보았고 기본 Readme도있었습니다. 이 기본 readme 작성 부담을 없애기 위해 템플리트에는 설치 및 프로젝트 구조를 다루는 표준 readme가 포함되어 있습니다. 템플릿을 사용하여 새 프로젝트를 설정하면 추가 정보가 자동으로 포함됩니다.

지 티노 레

오늘날 대부분의 프로젝트는 GIT를 버전 관리 시스템으로 사용합니다. GIT를 사용할 때 일반적으로 빌드 폴더 또는 파생 데이터 폴더와 같은 프로젝트의 일부 파일이나 폴더는 무시하지 않습니다. iOS 프로젝트에 적합한 gitignore 파일을 찾는 데 따르는 어려움을 덜기 위해 템플릿에는 Github 기고자가 제공 한 표준 gitignore가 포함되어 있습니다.

딥 링크 및 알림 처리를위한 기본 클래스

오늘날 거의 모든 앱은 딥 링크 및 알림을 처리해야합니다. 이를 위해 개발자는 AppDelegate 클래스에 약간의 상용구 코드를 작성해야합니다. 템플릿에는 해당 내용이 포함되어 있으며 딥 링크 및 알림 작업을보다 쉽게 ​​수행 할 수있는 기본 클래스도 제공됩니다.

요약

요약하면 템플릿은 모범 사례를 포함 시키려고 시도하고 유용한 타사 도구를 통합합니다. 이를 통해 새로운 프로젝트 설정에 소요되는 시간과 팀 시간을 절약하고 나머지 프로젝트에 공통적이고 강력한 토대를 제공 할 수 있습니다. 잘 지내길 바랍니다!

추신 : 템플릿에 대한 문제 또는 기능 요청이 있으면 Github에 문제를 남겨주세요. 나는 자유 시간에 그것을 해결하려고 노력할 것입니다.