스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
Xcode 15의 새로운 기능
Xcode 15의 생산성 및 성능 향상에 대해 알아보세요. Xcode Previews와 코드 자동 완성의 개선 사항을 탐구하고, 테스트 내비게이터와 테스트 보고서에 관해 배우고, 단순화된 배포 과정에 관해 자세히 알아보세요. 개선된 내비게이션과 소스 컨트롤 관리, 디버깅도 다룹니다.
챕터
- 0:00 - Introduction
- 0:39 - Downloading Xcode
- 1:29 - Code completion updates
- 3:45 - What's new in asset catalogs
- 4:30 - Meet string catalogs
- 5:25 - What's new in Swift-DocC
- 7:01 - Meet Swift macros
- 8:40 - What's new in Previews
- 10:00 - The bookmark navigator
- 12:18 - What's new in source control
- 14:50 - What's new in testing
- 17:23 - Updates in the debug console
- 18:37 - Updates in Xcode Cloud distribution
- 19:37 - Signature verification and privacy manifests
- 21:03 - What's new in Xcode distribution
리소스
관련 비디오
WWDC23
-
다운로드
♪ 부드러운 힙합 연주곡 ♪ ♪ 안녕하세요 제 이름은 Shilpa입니다 저는 Ryan이죠 오늘은 Xcode 15와 관련된 모든 개발 사항을 전달해 드릴 예정입니다 Xcode는 여러분 개발 경험의 중심에 있죠 Xcode에서는 여러분의 개발 작업 흐름을 한곳에 통합하고 앱 제작을 쉽고 재미있게 하며 하나의 툴에만 집중하도록 합니다 오늘은 올해 Xcode 15의 개선 사항을 다룰 예정이며 편집으로 시작하여 탐색, 공유, 테스트를 거쳐 디버깅과 앱의 배포까지 아우를 예정이죠 Xcode의 새로운 사항을 보여 주기 전에 다운로드부터 해야 합니다 Xcode 출시 버전을 받는 가장 좋은 방법은 Mac App Store죠 최신 버전의 툴을 다운로드받아 새로운 기능을 사용하는 것을 보장할 수 있습니다 작년에는 쉬운 시작을 돕기 위해 Watch와 TV 시뮬레이터를 선택 다운로드로 바꿨죠 올해는 더 나아가서 모든 시뮬레이터를 다운로드할 수 있도록 했고 iOS와 Apple의 새로운 공간 컴퓨팅 플랫폼을 포함하여 여러분의 필요에 맞게 Xcode를 설정할 수 있습니다 이제 Xcode를 받을 때 파일이 작고 시뮬레이터를 작동하기 전부터 코드 작성이 쉬워지죠 만약 Developer 웹사이트에서 최신 베타와 같은 Xcode를 다운로드받아야 한다면 어떤 시뮬레이터를 포함할지 미리 선택할 수 있습니다 이제 Xcode를 받았으니 바로 시작해서 소스 에디터의 새로운 사항을 살펴보죠 코드 자동 완성으로 원하는 코드를 빠르게 작성하고 실수를 줄일 수 있습니다 Xcode 15는 더 똑똑해졌죠 살펴봅시다 자동 완성이 새로운 정보를 이용하죠 이건 Backyard Birds입니다 일단 새로운 파일을 만들고 PlantSummaryRow라고 이름을 붙일게요 필요한 임포트 문을 추가하죠 새 구조체를 만들 때 자동 완성이 타입 이름으로 PlantSummaryRow를 제안하는데 제가 생성한 파일의 이름이기 때문이죠 이 파일을 마저 구현하겠습니다
구현이 끝났습니다 자동 완성이 나타나는 방식도 개선됐죠 기본값의 매개변수가 있는 함수를 호출하면 정확한 매개변수를 얻는 것이 아주 힘듭니다 기본값 매개변수의 가능한 모든 순열을 보고 원하는 걸 고를 수 있죠 VStack에 frame 모디파이어를 추가하고 키보드의 오른쪽 화살표를 누르겠습니다 필요한 걸 선택하죠 여기서는 width입니다 자동 완성이 맥락을 더 잘 파악하여 작성 중인 코드에 맞게 나은 제안을 합니다 다시 VStack으로 돌아와서 모디파이어를 추가하기 위해 마침표를 입력하면 padding이 최상위 제안으로 나오는데 가장 많이 쓰는 모디파이어라는 걸 Xcode가 알기 때문이죠 하지만 Text에 모디파이어를 추가하면 font가 최상위 제안으로 나옵니다 에디터의 제안은 주변의 코드도 고려하죠 이미 텍스트의 폰트를 바꿨습니다 모디파이어를 추가하려고 하면 최상위 제안이 bold죠 Text를 작업하면서 같은 모디파이어를 두 번 쓰지 않을 테니까요 다른 예시입니다 이 파일에서는 CLLocation을 사용하여 새가 어디 있는지 찾죠 이미 latitude를 입력하여 longitude를 제안합니다 함께 자주 사용하는 프로퍼티이기 때문이죠 이렇게 하면 최상위 제안을 통해 안전한 코드를 빠르게 입력할 수 있습니다 Ryan, 자동 완성의 강력한 기능을 애셋 카탈로그에도 가져온다고 하던데요? 자세히 얘기해 줄래요? 물론이죠, Shilpa 색상과 이미지 애셋은 Swift 기호에서 지원합니다 코드로 완성할 수 있다는 의미죠 제 애셋 카탈로그에는 커스텀 색상과 이미지가 있습니다 Xcode 15는 자동으로 각 이미지에 대한 기호를 생성하여 코드에서 참조할 수 있고 스트링 이름을 쓰지 않아도 되죠 이 이미지의 이름을 MultipleClouds로 바꾸고 프로젝트를 빌드하면 이 애셋을 사용하는 다른 파일에서 문제가 발생합니다 그때 CodeComplete로 수정할 수 있죠 이 기호는 타입 안정성을 주므로 런타임 때 갑자기 사라진 색상이나 이미지를 걱정하지 않아도 됩니다 Xcode 15는 카탈로그의 강력함과 유연성을 현지화 경험에도 제공하죠 스트링 카탈로그가 여러분의 현지화 작업을 한곳에 취합하여 중앙화된 방식으로 검토하고 업데이트할 수 있습니다 스트링 카탈로그 사용을 위해 프로젝트를 변환하려면 편집, 스트링 카탈로그로 변환을 선택하세요 마이그레이션할 수 있는 스토리보드, .strings와 .stringsdict 파일을 한곳에 정리한 시트가 나옵니다 마이그레이션이 끝나면 모든 번역을 하나의 에디터에 정리할 수 있죠 왼쪽의 사이드바에서 여러분이 지원하는 각 언어의 번역 상황을 검토할 수 있습니다 업데이트도 쉽죠 모든 스트링은 빌드할 때마다 소스에서 직접 가져옵니다 스트링을 추가하거나 제거할 때 에디터가 영향을 받은 언어에 주석을 달고 관련 스트링에 배지를 표시하죠 마이그레이션을 시작하려면 '스트링 카탈로그 발견하기' 세션을 시청하세요 Shilpa, 올해 Xcode의 문서는 어떤 점이 새롭죠? 많은 점이요 명확하고 간결한 코드는 문서화로 더욱 좋아졌죠 미래의 자신이나 API의 소비자에게 뭔가를 설명하기 위해서는 훌륭한 문서를 작성해야 합니다 훌륭한 문서는 훌륭한 프레젠테이션이 필요하죠 Xcode 15는 새로운 스타일과 간격을 적용하여 문서의 가독성을 높였습니다 하지만 제일 큰 개선 사항은 새로운 어시스턴트로 여러분의 문서를 실시간으로 미리 볼 수 있죠 문서를 작성하는 동안 어시스턴트를 보려면 에디터, 어시스턴트를 선택하고 점프 바에서 문서 미리보기를 선택하세요 소스 에디터에 입력하자 실시간으로 미리보기가 업데이트됩니다 제 문서가 전부 완성된 문서 아카이브에서 어떻게 보일지 정확하게 알려 주죠 예시 코드를 추가하여 실제 사용 방식을 알려 드리겠습니다 작성할 문구는 '이 이니셜라이저를 사용하여' '특정 새의 이미지를 표시하세요'죠 이후에 예시 코드를 붙여넣겠습니다 이 예시는 UI가 관련되므로 결과 화면이 어떤 모습일지 스크린샷을 첨부하죠 BirdIcon이라는 이미지를 참조할 수 있는데 문서 카탈로그에 포함시켰기 때문이죠 새로운 문서 미리보기를 통해 여러분이 원하는 방식으로 문서를 작성할 수 있습니다 저처럼 문서화에 관심이 많다면 이 세션을 시청하세요 'Swift-DocC로 풍성한 문서 만들기'입니다 문서화만큼 중요한 것은 코드가 간결하고 이해가 쉬워야 하는 거죠 올해 Swift의 새로운 기능은 강력한 언어 기능입니다 Swift 매크로죠 매크로는 표현력이 풍부한 API를 만들고 반복 코드를 없애게 해 줍니다 Xcode의 통합으로 매크로를 완벽하게 볼 수 있어 매크로로 생성한 코드를 앱의 다른 코드와 똑같이 간주할 수 있죠 매크로는 SDK 안에 있는 Swift 패키지의 일부입니다 이제 매크로의 성능을 Apple의 프레임워크인 Swift 표준 라이브러리와 파운데이션 SwiftData 프레임워크에 활용할 수 있죠 직접 매크로 패키지를 만들어 공유할 수도 있습니다 패키지를 생성하기 위해 빠른 동작을 사용할게요 새로운 기능으로 커맨드-시프트-A를 눌러 Xcode의 메뉴 옵션에 접근할 수 있죠 새로운 매크로 패키지는 멋진 예시가 적용되어 바로 시작할 수 있게 도와줍니다 이미 매크로 패키지인 EnumHelper를 만들었죠 EnumHelper에 CaseDetection을 매크로로 적용했습니다 매크로의 묘미는 정상적인 Swift 코드를 생성한다는 거죠 제공하는 코드를 감싸서 가지런히 치워 둡니다 하지만 매크로가 하는 걸 보고 싶거나 매크로로 생성된 코드를 디버깅해야 할 때는 빠른 동작의 도움으로 그 줄에 매크로를 확장할 수 있죠 디버깅을 해야 할 때는 매크로 내부의 코드에 브레이크포인트를 설정할 수도 있습니다 'Swift 매크로 확장하기' 세션을 시청하여 Swift 매크로의 기술적 부분을 이해할 수 있죠 새로운 지식을 바탕으로 처음부터 매크로와 함께 코드를 작성하는 세션인 'Swift 매크로 작성하기'도 준비돼 있죠 매크로를 이용한 Xcode의 다른 분야인 미리보기도 탐구해 보죠 매크로의 도움을 받은 새로운 Previews API는 간단하고 기억하기 쉽습니다 #Preview를 입력하여 미리보기를 추가하죠 계정 화면을 미리 보고 싶습니다 앱 상세 정보 열에 다양한 상태가 있는데 새로운 미리보기를 만들어 볼 수 있죠 두 가지 시나리오를 볼 수 있는 겁니다 그런데 UI에 두 개의 미리보기가 있죠 둘을 구분하기 위해 제목인 '플레이스홀더 뷰'를 추가할게요
잠깐만요 개선 사항이 더 있습니다 UIKit과 AppKit에도 미리보기를 가져오죠 예전에 만든 Food Truck 앱도 UIViewController를 위한 미리보기를 추가하여 SwiftUI에서 그랬던 것처럼 빠르게 반복할 수 있습니다 이제 미리보기를 통한 위젯 개발을 살펴보죠 API가 새로운 작업 흐름을 도입하여 시간을 기반으로 한 위젯을 제작합니다
캔버스에 모든 엔트리를 보여 주는 공간이 생겼죠 이를 탐색하다 보면 위젯 전환과 관련된 애니메이션을 볼 수 있습니다 우리가 준비한 세션 'Xcode Previews로 프로그래밍적 UI 만들기'에서 새롭고 짜릿한 미리보기 기능을 여러분 프로젝트에 적용하는 법을 배우세요 다시 Ryan을 통해 탐색 개선 사항을 다루도록 하죠 고마워요, Shilpa 프로젝트가 커지면 더 복잡해지면서 태스크 중에 참조하고 싶은 주요 부분을 추적하는 게 힘들어집니다 이를 위해 Xcode 15가 북마크 내비게이터를 도입하죠 소스 컨트롤 내비게이터 옆을 클릭해서 열겠습니다 문서화를 추가해야 하는 코드에 북마크를 추가해 왔죠 이 파일에 하나 더 추가할 건데 정말 쉽습니다 이 위치에서 오른쪽 클릭하고 북마크를 선택하죠
내비게이터에 북마크가 나타나며 위치를 미리 볼 수 있지만 내용을 고치려면 클릭해서 다른 설명을 입력하면 됩니다 Xcode가 코드에 제 설명을 주석으로 달아서 쉽게 볼 수 있고 제가 원하는 걸 기억할 수 있죠 북마크의 목록이 불어나도 제가 원하는 방식으로 정렬 및 그룹화하여 관리할 수 있습니다 문서화와 관련된 북마크를 하나의 그룹으로 묶고 싶죠 제가 관심 있는 항목들을 선택하고 오른쪽 클릭하여 컨텍스트 메뉴를 연 뒤에 선택한 항목으로 새 그룹 만들기를 선택합니다 새로운 그룹의 이름은 '문서화 추가 지점'으로 하죠 북마크는 제 코드를 기억하게 해 주지만 할 일 목록으로 사용할 수도 있습니다 여기서 왼쪽을 클릭하여 완료 표시를 하거나 컨텍스트 메뉴에서 북마크 삭제를 선택하여 전부 삭제할 수도 있습니다 이러면 에디터의 북마크 주석이 제거되죠 코드만 북마크할 수 있는 게 아닙니다 북마크는 Find 쿼리를 추적하는 좋은 방법이죠 Xcode 15 이전에는 코드에 할 일 목록을 추가했는데 찾기가 힘들어서 모두 찾기 위해 쿼리를 북마크했죠
하지만 모든 Find 쿼리를 북마크할 수 있습니다 코드 내 view 모디파이어의 목록을 관리하고 싶죠 새로운 Conforming Types 쿼리로 viewModifier 프로토콜의 모든 컨포먼스를 찾겠습니다
그리고 이 쿼리를 북마크하기 위해 결과에서 오른쪽 클릭 후 Find 'viewModifier' 북마크하기를 선택하면 되죠 제 쿼리는 북마크 내비게이터에 있습니다 제 쿼리의 결괏값이 바뀌면 북마크 옆에 있는 새로고침 버튼을 클릭하여 목록을 새로 고치면 되죠 Xcode 15의 북마크 내비게이터는 여러분의 작업을 추적하므로 현재 작업에 집중할 수 있습니다 개발의 또 다른 중요 부분은 작업을 공유하는 거죠 수정 사항을 통합하고 특히 커밋을 통해 동료와 공유하는 건 변동 사항만큼 중요할 수 있습니다 Xcode 15가 새로운 변경 사항 내비게이터와 커밋 에디터를 도입하여 여러분의 수정 사항 일체를 검토할 수 있습니다 저는 프로젝트에 문서를 추가하는 작업 중이었죠 소스 컨트롤 내비게이터에서 수정 사항을 검토할 수 있습니다 제일 먼저 눈에 띄는 건 각자의 파일 상황을 보고하고 보여 주는 방식을 개선한 거죠 저의 스테이지 수정 사항이 파일 이름 옆에 아이콘으로 나타납니다 수정 사항을 검토하기 위해 커밋하지 않은 변동 사항을 클릭하여 커밋 에디터를 실행하죠 이제 모든 수정 사항을 단일 스크롤 뷰로 검토할 수 있습니다 각 섹션에 맥락을 보여 줘서 주변 코드를 이해할 수 있죠 더 보고 싶다면 드래그 핸들을 사용하여 파일을 더 볼 수 있습니다 각 변동 사항은 소스 에디터에 나타나며 저에게 익숙한 주석과 컨트롤에 접근할 수 있죠 검토 중 BirdsNavigationStack 파일에 문제가 있는 걸 포착했습니다 문서화에 오타가 있었군요 하지만 뷰에서 나가지 않고 바로 수정할 수 있습니다 Xcode가 수정 사항을 처리하고 문제를 삭제했죠 저의 편집 작업도 변동 사항 바에서 언스테이지 상태로 표시됩니다 상태 인디케이터에서 BirdsNavigationStack이 스테이지 및 언스테이지된 변동 사항이 있다고 나오죠 수정 사항을 다음 커밋에 포함하고 싶어서 스테이징을 위해 수정 사항 옆의 변동 사항 바를 클릭하고 스테이지 변경을 선택합니다 디버깅을 위해 사용했던 로그 문을 잘못 스테이징했다는 걸 알게 됐죠 다시 변동 사항 바를 통해 변동 사항을 언스테이지합니다 이런 스테이징 컨트롤을 사용하기 쉽고 Xcode 전반에 통합돼 있죠 이제 변동 사항을 확인하겠습니다 커밋 메시지 상자에 설명을 추가한 뒤에 커밋 버튼을 클릭합니다 Xcode가 커밋을 생성하여 커밋 뷰어에 열어서 어떤 것이 포함됐는지 요약합니다 마지막으로 저의 커밋을 팀원들과 공유할 수 있죠 커밋 옆의 상태 인디케이터를 클릭하고 푸시를 선택한 뒤 안내를 따릅니다 이러한 소스 컨트롤 기능은 멋진 개선 사항으로 Xcode 15에서 집중할 수 있게 도와줍니다 그런데 Shilpa, 테스트를 도와주는 새로운 기능도 있어요 얘기해 줄래요? 그럼요, Ryan, 퀄리티 높은 앱을 배포하기 위해서는 테스트가 중요합니다 이전 상태로 회귀하는 걸 빠르게 잡아내고 앱이 복잡해져도 퀄리티를 유지하게 해 주죠 올해 테스트에서 많은 개선 사항이 있었는데 개선된 테스트 내비게이터는 Swift로 처음부터 다시 작성하여 더 효율적입니다 실시간으로 테스트 결과를 실행하고 보고할 때 Xcode가 45% 빨라졌죠 테스트 내비게이터는 테스트 계획에 맞게 정리되어 여러분에게 필요한 테스트를 쉽게 찾을 수 있습니다 예상된 실패와 같은 결과 종류 기반 테스트를 필터로 찾을 수 있죠 Xcode나 Xcode Cloud로 테스트를 실행하면 테스트 보고서에서 결과를 탐색하여 어디에 집중해야 하는지 보여 줍니다 전체 테스트에 대한 상위 수준의 요약으로 시작하죠 여기에 포함된 인사이트는 결과를 패턴 기반으로 분석한 것입니다 테스트 섹션 안에서 테스트 성과가 어땠는지 이해할 수 있죠 서로 다른 기기와 설정에서 성공 및 실패 테스트 횟수를 쉽게 이해할 수 있습니다 인사이트는 테스트 결과를 분석하여 이전에는 찾기 힘들었던 잠재적으로 관련된 실패를 식별하죠 전체적으로 결과를 반환하는 게 오래 걸릴 수 있는 런을 테스트하라고 경고하기도 합니다
두 번째 인사이트가 눈에 띄네요 계정 버튼을 탭하려고 하다가 테스트가 실패했습니다 이 문제를 자세히 조사하고 싶군요 개요에서 테스트 목록으로 이동하면 모든 테스트 런을 보여 주는데 결과 타입, 런 목적지와 테스트 계획 설정으로 핕터할 수 있죠 계정 버튼을 탭하다가 테스트가 실패한 사례가 다수의 언어에서 발생했고 오류 메시지가 같습니다 더 알아보기 위해 개별 클래스를 보거나 개별 테스트 방식에 대한 테스트 세부 사항 뷰로 이동하죠 테스트 세부 사항 뷰에는 여러 가지 방식으로 결과 데이터를 탐색하는데 모든 런의 분석과 전용 성능 메트릭스 탭까지 포함합니다 UI 테스트 실패를 디버깅하는 건 자동 탐색기로 즐거워졌죠 탐색기는 상호 작용적이어서 테스트 과정을 시청하거나 타임라인을 따라 이동할 수 있죠 터치나 마우스 이벤트도 영상에 표시돼 있습니다 실패 지점에서 계정 버튼을 탭하다가 테스트가 실패했는데 제 앱의 UI 계층 구조를 점검할 수 있죠 UI 테스트 실패 수정이 훨씬 쉬워집니다 자세히 알고 싶으면 'Xcode 테스트 보고서로 실패를 빠르게 수정하기'를 시청하세요 다시 Ryan과 함께 디버깅을 이야기해 봅시다 테스트와 디버깅은 밀접한 연관이 있죠 고품질의 앱을 만드는 과정입니다 올해 디버깅도 개선 사항이 많았는데 OSLog를 Xcode에 통합시켰죠 OSLog는 런타임 정보를 포착하는 훌륭한 툴입니다 구조화와 커스텀 설정이 가능한 로깅 메커니즘을 제공하여 로그 결과물을 체계화할 수 있습니다 그리고 Xcode 15의 콘솔이 OSLog에 대한 완벽한 지원을 도입하여 하위 시스템 카테고리나 심각도와 같은 로그 데이터의 복잡한 필터링을 수행하는 능력을 포함하죠 로그의 표현 방식은 어느 때보다 깔끔합니다 초점이 로그 내용에 맞춰져 있고 추가적인 데이터는 깔끔하게 숨겨져 있죠 각 로그 엔트리의 배경 색상으로 심각도를 표시하여 길게 펼쳐진 로그 결과에서 중요한 메시지를 쉽게 훑어볼 수 있습니다 메타데이터 필드는 기본적으로 숨기지만 클릭 몇 번이면 열람할 수 있죠 보고 싶은 필드만 선택할 수도 있습니다 구체적인 걸 찾을 때는 필터 필드로 검색 범위를 좁힐 수 있죠 메타데이터나 전체 로그 텍스트를 필터할 수 있습니다 제가 정말 좋아하는 기능은 로그 엔트리에서 로그를 만든 코드의 줄로 되돌아가는 거죠 로깅 기능을 깊게 다루는 세션이 있습니다 '구조적 로깅으로 디버그하기'죠 마지막으로 배포를 다루겠습니다 배포는 여러분의 앱을 세상에 내놓고 여러분의 팀원과 베타 테스터 사용자에게 전달하는 거죠 Xcode 15의 개선 사항으로 이 과정이 쉽고 안전해졌습니다 Xcode Cloud부터 시작하죠 Xcode Cloud는 앱을 배포하는 멋진 방식입니다 빌드 버전 작업과 앱 서명 배포 프로파일을 여러분 대신 자동으로 관리해 주죠 올해 Xcode Cloud가 두 가지 작업을 더 처리해 줍니다 먼저 TestFlight의 테스트 세부 사항이죠 Xcode Cloud가 소스 코드 바로 옆에 테스트 메모를 포함하는 기능을 지원합니다 배포 TestFlight 빌드에 자동으로 첨부되어 테스터에게 메모가 앱과 함께 나타나죠 두 번째로 Xcode Cloud가 Mac 앱의 공증을 지원합니다 이제 작업 절차에 공증을 추가해 두면 Xcode Cloud가 알아서 처리하죠 빌드가 완료되면 여러분의 앱을 자동으로 공증하고 스테이플하여 다운로드 준비 상태로 만듭니다 여러분의 앱을 공증하는 건 사용자에게 중요하죠 여러분의 앱이 훼손되지 않았음을 알려 줍니다 하지만 신뢰하는 SDK와 프레임워크의 무결성을 믿을 수 있는 것도 중요합니다 이러한 확신을 제공하기 위해 Xcode에서 XCFrameworks에 대한 서명 인증을 도입합니다 작성자는 디지털로 프레임워크 콘텐츠에 서명하고 여러분은 Xcode로 서명을 확인할 수 있죠 프레임워크 인스펙터에는 서명 슬라이스가 있습니다 누가 프레임워크를 생산하고 서명했는지 정확히 알 수 있죠 Xcode는 이 신원을 기억합니다 프레임워크를 업데이트할 때 신원이 바뀌면 문제에 대해 명확한 경고를 받죠 하지만 더 있습니다 작성자는 프레임워크에 개인 정보 매니페스트를 포함할 수 있죠 매니페스트에는 프레임워크가 어떻게 민감한 정보를 사용하고 보호하는지 상세합니다 개인 정보 매니페스트가 프레임워크와 묶이면서 서명된 패키지의 일부가 되어 작성자가 직접 작성한 내용이라는 걸 믿을 수 있죠 Xcode를 이용하여 매니페스트를 제 앱의 통합 개인 정보 보고서로 요약할 수 있습니다 이건 제가 생성한 보고서죠 이 보고서를 통해 App Store Connect 레이블의 개인 정보 조항을 입력할 수 있어 사용자에게 정확한 정보를 제공할 수 있습니다 Apple은 개인 정보에 영향을 주는 SDK와 작업하여 중요한 의존성 항목들이 정보를 제공하도록 합니다 이런 내용을 더 자세히 다루는 세션은 '전자 서명으로 앱 의존성 확인하기'와 '개인 정보 매니페스트 시작하기'입니다 개인 정보 매니페스트는 사용자에게 앱을 배포할 때 중요한 툴이죠 버그를 수정하거나 새로운 기능을 작업 중일 때는 팀원들에게 앱을 배포해야 하며 다른 사람들에겐 배포하면 안 됩니다 그래서 Xcode 15가 TestFlight 내부 테스트 배포 기능을 지원하죠 TestFlight 내부 빌드는 여러분의 팀에게만 제공되어 실수로 고객에게 배포할 일이 없습니다 만들기도 쉽죠 App Store Connect를 통해 앱을 배포할 때 'TestFlight 내부 테스트' 옵션을 선택하세요
사실 이것보다 더 쉽죠 Xcode는 가장 흔한 배포 방식과 추천 설정을 한곳에 통합했습니다 1단계는 Testflight 내부를 포함한 선택지 중 하나를 고릅니다 2단계는 선택 후에 배포를 클릭하는 거죠 3단계는 없습니다 App Store Connect를 통해 배포한다면 데스크톱 알림을 통해 빌드 상태를 알 수 있죠 앱을 테스트할 준비가 되면 바로 알림을 받습니다 이러한 업데이트를 통해 앱의 반복 작업과 배포가 쉬워져서 팀원과 테스터, 사용자와 긴밀하고 수월하고 빠르게 작업할 수 있죠 이런 기능을 탐구하려면 다음 세션을 참고하세요 'Xcode와 Xcode Cloud로 배포 단순화하기'입니다 Xcode 15의 새로운 사항을 빠르게 훑어봤는데 쉽게 다운로드하여 빠르게 사용할 수 있고 개선 사항이 많아서 더 집중하여 수월하고 재미있게 개발할 수 있죠 Xcode 15를 다운로드하여 멋지고 새로운 기능을 이용해 보세요 시청해 주셔서 감사합니다 ♪
-
-
1:52 - Code Completion - PlantSummaryRow
import Foundation import SwiftUI import BackyardBirdsData import LayeredArtworkLibrary struct PlantSummaryRow: View { var plant: Plant var body: some View { VStack { ComposedPlant(plant: plant) .padding(4) .padding(.bottom, -20) .clipShape(.circle) .background(.fill.tertiary, in: .circle) .padding(.horizontal, 10) VStack { Text(plant.speciesName) } } } }
-
3:28 - Code Completion - Latitude & Longitude
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { if let mostRecent = locations.last?.coordinate { logger.debug("Handled coordinate update: \(mostRecent.latitude)") } }
-
6:18 - BirdIcon Documentation
/// Create the bird icon view. /// /// The bird icon view is a tailored version of the ``ComposedBird`` view. /// /// Use this initializer to display an image of a given bird. /// /// ```swift /// var bird: Bird /// /// var body: some View { /// HStack { /// BirdIcon(bird: bird) /// .frame(width: 60, height: 60) /// Text(bird.speciesName) /// } /// } /// ``` /// /// ![A screenshot of a view containing a bird icon with the bird's species name below it.](birdIcon)
-
7:37 - CaseDetection Macro
extension TokenSyntax { fileprivate var initialUppercased: String { let name = self.text guard let initial = name.first else { return name } return "\(initial.uppercased())\(name.dropFirst())" } } public struct CaseDetectionMacro: MemberMacro { public static func expansion< Declaration: DeclGroupSyntax, Context: MacroExpansionContext >( of node: AttributeSyntax, providingMembersOf declaration: Declaration, in context: Context ) throws -> [DeclSyntax] { declaration.memberBlock.members .compactMap { $0.decl.as(EnumCaseDeclSyntax.self) } .map { $0.elements.first!.identifier } .map { ($0, $0.initialUppercased) } .map { original, uppercased in """ var is\(raw: uppercased): Bool { if case .\(raw: original) = self { return true } return false } """ } } } @main struct EnumHelperPlugin: CompilerPlugin { let providingMacros: [Macro.Type] = [ CaseDetectionMacro.self, ] }
-
8:07 - Using CaseDetection Macro
@CaseDetection enum Element { case one case two } var element: Element = .one if element.isOne { // Handle interesting case }
-
8:50 - New Preview API
#Preview { AppDetailColumn(screen: .account) .backyardBirdsDataContainer() } #Preview("Placeholder View") { AppDetailColumn() .backyardBirdsDataContainer() }
-
9:22 - UIViewController Preview
#Preview { let controller = DetailedMapViewController() controller.mapView.camera = MKMapCamera( lookingAtCenter: CLLocation(latitude: 37.335_690, longitude: -122.013_330).coordinate, fromDistance: 0, pitch: 0, heading: 0 ) return controller }
-
17:34 - OSLog
import OSLog let logger = Logger(subsystem: "BackyardBirdsData", category: "Account") func login(password: String) -> Error? { var error: Error? = nil logger.info("Logging in user '\(username)'...") // ... if let error { logger.error("User '\(username)' failed to log in. Error: \(error)") } else { loggedIn = true logger.notice("User '\(username)' logged in successfully.") } return error }
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.