Xcode 14부터 바뀐 것들

Jung Kim
8 min readSep 18, 2022

--

릴리스 노트를 개발자 관점에서 살펴본 소소한 사항

공통

  • 멀티플랫폼 앱 개발을 위한 타깃별 선택 옵션 지원

👉 아래 그림처럼 각 설정마다 플랫폼을 고를 수 있고, SDK나 의존성에 따라서 다른 값이 반영되도록 지정할 수 있습니다

더 자세한 설명은 링크를 참고하세요 https://developer.apple.com/documentation/xcode/configuring-a-multiplatform-app-target

  • iPadOS를 위한 DriverKit 개발을 지원. 특이한 건 DriverKit는 SDK 수준에서 달라지네요
  • 워치앱 기본 템플릿이 WatchKit 앱과 앱 익스텐션 타깃과 합쳐짐

Clang 컴파일러

  • C++ 프로젝트는 C++20 언어를 기본으로 생성
  • C++20 과 C++2b 일부가 구현됨
  • watchOS와 tvOS 앱에 대해 bitcode가 제거됨. 앞으로 앱 스토어 제출시에도 필요없음

에셋 카탈로그

  • 앱 아이콘 1024 x 1024 크기로 통일하고 타깃에 맞춰 크기를 바꿔서 적용함. 속성 인스팩터에서 Single Size 옵션을 선택 (All Sizes로 바꾸면 이전 방식)
  • 파인더에서 이미지 파일 복사하고 붙여넣기 가능 (드래그 앤 드롭 안해도 됨)
  • 더블클릭해서 다른 이미지로 교체 가능
  • 커스텀 심볼에 대한 기본 렌더링 모드를 지정할 수 있음 : automatic, template, multicolor, hierarchical

빌드 시스템

  • 타깃 의존성을 분석해서 여러 타깃을 동시에 병렬로 빌드 가능함
  • 리포트 내비게이터에서 병렬 빌드시 빌드 로그를 확인할 수 있는 어시스턴트 편집기 지원 (확대 축소 지원)
  • 스위프트 컴파일러 프론트엔드를 선택할 수 있도록 앞에 Swift Driver 개념이 추가되면서, Xcode 빌드 시스템에 통합됨
  • Build Phases 화면에서 다중 선택을 지원합니다
  • 스위프트만으로 된 프레임워크나 다이나믹 라이브러리 타깃에서 새 빌드 시스템 최적화 옵션으로 EAGER_LINKING을 설정 가능. 이걸 하면 스위프트 컴파일하면서 부가적인 정보를 만들어서 병렬 빌드 성능 향상을 도와줌
  • 입력-출력 의존성에 따라 서로 다른 단계 작업을 병렬 빌드 처리 가능
  • 앱 스토어에서 미리 컴파일된 메탈 쉐이더를 App Thining 지원
  • watchOS 디바이스도 기본 아키텍처는 arm64
  • 빌드 셋팅에 상대 경로로 대체 가능한 매크로 연산자 지원 $(INSTALL_PATH:relativeto=/usr/lib)
  • Xcode 버전에서 제공하는 최소 버전을 위해 SDK별로 RECOMMENDED_IPHONEOS_DEPLOYMENT_TARGET 빌드 설정 제공
  • 빌드하는 동안에 소스 루트나 파생 데이터 디렉터리 접근을 제한할 수 있는 ENABLE_USER_SCRIPT_SANDBOXING 설정 지원
  • bitcode 자체가 사라짐. iOS와 tvOS, watchOS 모두 제거
  • 기존 빌드 시스템이 제거됨. llbuild로 통일
  • 배포 타깃에서도 armv7, armv7s, i386 아키텍처를 지원하지 않아서 이제 arm64 와 x86_64만 지원 (일부 기기에서 사용가능한 포인터 관련 확장 arm64e가 있긴하네요)

디버깅

  • 메모리 그래프 디버거에서 참조가 되는 경우(incoming), 참조를 하는 경우(outgoing)을 구분해서 보여줌
  • LLDB 에서 Xcode나 명령이 오래 걸리는 경우는 진행 상황을 표시함
  • xcrun crashlog <로그> 명령으로 로그 스크립트를 호출가능
  • 스킴에서 스레드 성능 체커를 선택하면 디버깅 중에 이슈로 표시함
  • 스킴 액션에서 만드는 .xcresult 번들을 확인할 수 있음
  • 리포트 내비게이터에서 launch 시점의 로그를 확인할 수 있음

도큐멘테이션

  • Swift-DocC 기능이 Objective-C와 C API에 대해서도 문서 생성 가능
  • DocC가 생성하는 웹에서 탐색과 필터링을 제공하는 내비게이션 사이드바 제공
  • DocC 문서가 깃헙 페이지 같은 호스팅 서비스들과 호환됨

인스트루먼츠

세밀하게 바뀐게 많은 데 일단 패스해야겠습니다 🤣

인터페이스 빌더

  • 맥과 카탈리스트에서 UISplitViewController가 사이드바를 지원합니다 (이제야!)
  • UINavigationItem 가운데 정렬 그룹을 지원
  • UITextView, WKWebView에서 표준 Find & Replace UI를 지원하도록 속성 추가
  • 비동기로 Scene 화면 업데이트
  • MKMapView와 관련된 Configuration 지원
  • NSButton, NSImageView에서 SF Symbol의 기본 설정 지원
  • iOS용 UIPasteControl에서 노티없이 붙여넣을 수 있도록 지원
  • UIViewController 속성에서 Keyboard가 나올 때 on/off로 확인 가능
  • 심볼 라이브러리 탭에서 SF Symbol 찾고 접근 가능함
  • macOS 13 Ventura에서 NSColorWell 형태로 기본 제공
  • NSComboButton, MKPointOfInterestFilter, MKLookAroundViewController, RoomCaptureView 제작 가능

오거나이저

  • 오거나이저에서 테스트플라이트 스크린샷 피드백을 지원

미리보기

  • 새 프로젝트 생성하고 나면 자동으로 이어가기 resume (이거 이제야 해주다니...)
  • 파일 바꾸거나 프로젝트 더 이상 멈추지 않음 (정말?🤥 예전보다 반응이 빨라진 것 같지만 M1 Ultra정도 되면 멈추지 않을꺼 같지만 인텔맥은 안될꺼 같아...)
  • 위젯과 컴플리케이션 미리보기에서 에러는 캔버스에 표시
  • StoreKit 설정 파일을 이용해서 데이터 제공 가능
  • Editor > Canvas > Diagnostics 메뉴 선택하면 분석 기능을 제공하고 리포트를 만들 수 있음
  • 미리보기를 실제 기기에서 실행할 수 있다고 합니다! 해당 기기에서 Developer Mode 켜고 연결한 다음에, 미리보기 하단에 Preview on Device 버튼을 누르면 됩니다.
  • 그 밖에 수정된 사항이 정말 많네요. 유니코드 Escape 표기법 지원되고, 기본 보기모드가 zoom-to-fit, 미리보기 창 여러개 띄우면 타임아웃 나던 오류, 패키지 로딩 오류나던 것, 스위프트 플레이그라운드 프로젝트 열었을 때 속성 오류, 배터리 사용 최적화, 단독 watchOS 앱에서 컴플리케이션 미리보기 제공 등등
  • 맥 카탈리스트와 맥 앱에서 위젯 미리보기는 WidgetKit 시뮬레이터로 대체

리팩터링

  • Codable 구현에 대한 refactor 메뉴 추가

시뮬레이터

  • 애플 실리콘이나 T2 프로세스를 포함한 맥에서 macOS 13 이상이면 iOS 16 리모트 노티를 지원
  • simctl location 명령으로 위치 정보와 사용 시나리오를 지정할 수 있음
  • simctl runtime 명령으로 런타임 디스크 이미지를 지정해서 사용할 수 있음
  • simctl addmedia 명령으로 RAW 등 추가 이미지 포맷 지원
  • simctl boot 명령에서 --arch 옵션으로 애플 실리콘 맥에서 시뮬레이터 x86_64 런타임 사용할 수 있음

👉 이 명령 영향인지 Xcode 14부터 Simulator.app이 유니버설 바이너리지만 Open using Rosetta 옵션이 사라졌습니다. 몇 가지 이슈 때문에 M1, M2 맥에서 x86_64로 실행해야 했었는데 그게 안되는 거죠.

이런 경우 터미널에서 arch 명령으로 arch -x86_64 /Application/Xcode14.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator 를 실행하면 로제타로 실행할 수 있습니다.

프로젝트 템플릿

  • Cocoa AppleScript 앱 템플릿이 제거되었습니다 (점점 하나씩 사라지는군요)

테스팅

  • 새 프로젝트를 만들면 테스트 번들에 대한 병렬 테스트 실행이 기본값
  • 빌드와 마찬가지로 테스트 타깃도 병렬처리 가능. 스킴이나 테스트 플랜에서 지정
  • XCTAssertThrows()에서 예외에 대해 더 풍부한 분석 정보를 제공한다고 합니다
  • XCTest에 스위프트만을 위한 XCTKeyPathExpectation 키패스 관련 타입이 추가
  • 코드 커버리지 하일라이트와 실행 횟수 등을 커버리지 리포트가 담긴 번들에서 확인할 수 있습니다
  • macOS에서 분석 스크린샷에 마우스 커서가 표시됨
  • XCTest가 에러가 나거나 실패한 경우 sysdiagnose 를 캡처함
  • 워치 액션 버튼을 위해 XCUIDevice.current.press(.action) 명령 추가

--

--