[WWDC] WWDC23 추천 세션들 — 1탄

사실 추천이라기보다는 저의 메모장에 가깝달까여..?

naljin
34 min readJun 11, 2023

들어가기 전에

개-하! 이번주는 덥덥 주간이었져. 아니 이제 자정이 지났으니까 저번주겠군여?

덥덥 기간 아니면 필요한 내용 빼고 잘 안찾아보게 되는 제 자신을 알아서 이 기간 내에 빡!! 들어두려고 하는데요,,,?

첫 날에 보고 싶은 리스트를 한 60개 정도 북마크 해둔 것 같은데 길가면서 듣고, 버스타면서 듣고, 운동하면서 듣고, 친구들이랑 같이 일정 잡아서 듣고, 자기 전에 듣고, 빌드하면서 듣고 한 결과.. 지금까지는 한 목표한 것의 절반 정도 본 것 같네여 ㅎ

나머지 보려고 하고 있는것들은 따로 2탄으로 정리하기로 하고! 우선은 저번주에 본 것들만 들고 왔습니당.

작년 [WWDC] WWDC22 추천 세션들 글에는 냅다 추천 세션들 링크만 달아놨는데, 이번에는 본 세션들 순서대로 다 적고 아래와 같이 분류해뒀어요.

⭐️ 따로 정리해볼만 함. 다시 보면 좋음.

❤️ 인터레스팅

👀 그냥저냥 봄

그리고 각 세션에 대한 메모는 overview 나 핵심적인 내용을 담고 있다기 보다는,, (물론 그런것도 있지만요!) 그냥 제가 인상 깊게 느꼈던 내용이나 생각 위주의 글도 많습니다잇.

참, 이번 WWDC 에는 Chapter 가 생겨서 좋더라구요? 그리고 WWDC 한글 자막 개발자분.. 만수무강 하세요!

WWDC23 시청 목록

What’s new in Xcode 15 ❤️

자동 완성으로 뜨는 함수에서 우측 화살표 클릭하면 알맞은 parameter 함수 추천해주는거.. 드디어 말이 통하는군 애플놈들

이제 이미지도 . 찍고 접근할 수 있다고?!

오 DocC 작성하는거 라이브로 렌더링 되는군

매크로를 통해 boilerplate 코드를 줄일 수 있다

기억하자 cmd shift a (엑스코드 메뉴 옵션)

프리뷰를 UIKit 도 지원해준다고? 웬열?

북마크 잘 써주마 ㅋㅎ TODO 지옥에서 벗어날 수 있을 것인가?

소스 컨트롤의 기능을 좀 더 늘렸다고 하는데,,, 아직 여기서 커밋하고 푸쉬하고 리뷰하는거 안익숙해여.. 15부터 다시 시도해봐야지

UI 테스팅 시각화 제법인데?

What’s new in SwiftUI 👀

저는 원래 있는 것도 다 새로운데 뭐가 new 라는거죠?

@Observable 매크로가 나왔다고? 기존에 있는 것들이랑 이름 비슷해서 헷갈려 죽겠네..

What’s new in Swift 👀

let 에 바로 if 나 switch 로 값 할당하게 하는거 좋은데?

type parameter pack 은 문법이 뭐 저렇담? repeat.. each.. 다른 세션 나중에 들어야겠군..

NonCopyable 은 내가 쓸 일이 있을까?

Design for spatial input ❤️

홀리.. 새 창을 띄울때는 원래 보던 창의 depth 에 그대로 띄우는게 눈에 덜 피로하다든가.. 이런 공간 컴퓨팅을 위한 새로운 정보들 너무 신기해버리고~~?

What’s new in UIKit ❤️

viewWillAppearviewDidAppear 사이에 viewIsAppearing 이라고 새로운 life cycle 이 생겼군. 여기가 accurate geometry 을 갖는 지점이라고 ㅇㅋㅇㅋ. iOS 13 도 사용 가넝한 ㅇㅇ

sf symbol 애니메이션 되는거 맘에 들어! .addSymbolEffect 로 추가 가능

Empty state 를 UIContentUnavailableConfiguration 로 표현할 수 있게 도와준다는데.. 일단 예제로만 봤을때는 상용 앱에서 empty 상태를 표시하기에는 불충분할 것 같은디…?

⭐️ 언어에 따른 dynamic line height adjustment 내용 다시 보고 예전 line height 글에 추가하자

uniformAcrossSibling 좋아보인다. row 에서 제일 큰 item 의 높이를 계산해서 맞출 필요 없이 자동으로 맞춰준다는거 아님?

preferredStatusBarStyle 가 default 면 뒤에 깔린 content 에 따라서 계속해서 대비되는 색으로 변함. 심지어 왼 / 오에 있는 status bar 색상이 다를 수 있음

pageControl 에 progress 생긴거 제법 멋져~

Bring widgets to new places 👀

위젯이 어느 context 에 있냐에 따라서 widgetContentMargins 이 적용 됨. 없애려면 contentMarginsDisabled() 호출해라

containerBackgroundRemovable 로 위젯의 백그라운드가 removable 하다는걸 설정할 수 있군. 사진 위젯 같이 냅다 사진만 꽉차게 위젯 보여주는 곳에서는 false 로 설정..

작년에 나온 내용이긴 하지만 위젯 렌더링 모드가 vibrant, fullColor, accented 다양하다..? 잠금 화면에 대한 렌더링 모드는 vibrant 같은데.. 언제 공부하지?

Make features discoverable with TipKit 👀

Tip 을 나타내는 용도. Tip 은 popover 로도, inline 으로도 나타낼 수 있음.

코드 생겨먹은게.. 스유에서만 쓸 수 있는건가?

실행 가능하거나, 교육적이거나, 기억하기 쉬운 것들은 tip 으로 표현하기 적합하지만 홍보용, 오류 메시지, 구구절절문은 적합하지 않음

tip 을 노출시킬 수 있는 룰에는 parameter 기반, 이벤트 기반의 두가지 타입이 있는데 이벤트 기반에서는 .donate() 를 호출해서 이벤트를 쌓는게 신기하다

Meet SwiftData 👀

데이터 모델링 및 관리를 위한 프레임워크

Swift 의 새로운 매크로 시스템을 이용해서 원활한 api 환경을 제공한다는데… 저 아직 매크로 세션 안들었다고요 ㅠ

Adopting SwiftData for a Core Data app 같은 글도 있는걸로 봐서,, 그러니까 결국 CoreData 대체재라는거임?

class 위에 @Model 매크로를 붙이면 해당하는 스키마가 생성되는 듯?

이 안의 프로퍼티에는 @Attribute(.unique)@Relationship(.cascade) 등을 붙일 수 있다는데.. 어지럽다 ㅎㅎ 이해하려면 SwiftData 관련 세션 몇개 더 들어야할 듯 ㅎ

Meet watchOS 10 👀

저는 애플워치가 없어서 뭐가 그렇게 달라졌고, 디자인할 때 주의해야한다는건지 모르겠서여. 기억나는건 navigation 을 얕게 유지하라는거?

역시 애플워치를 사야하나?

Write Swift macros ❤️

ㅋㅋㅋㅋㅋㅋㅋ첫 멘트 좀 어그로 끌 줄 안다?!! 반복적인 boilerplate 코드를 생성하는거 좋아함? 아니죠? Swift macro 가 컴파일 시간에 작성할 수 있게 도와줍니다! 최고져? ㅎㅎ

# 로 시작하는 freestanding 매크로는 함수처럼 어느 곳에서는 단독으로 호출 가능하고, attributes 처럼 @ 로 시작하는 attached macro 는 타입에 멤버를 추가한다든지 등 선언을 확장할 수 있게 도와주는 듯 (아니 근데 attributes 랑 @ 똑같은 기호 쓰는거 굉장히 헷갈릴 것 같은데?? 아직 파악이 덜 돼서 그런가?). 각 macro 종류에 대해 더 자세히 보고 싶으면 Macro roles 부터 보기.

매크로 생성하려면 File -New -Package 로 만들어야함 (매크로는 type 이나 function 처럼 하나의 API 기 때문에, 이를 정의하고 있는 모듈을 import 해서 사용 가능. 참고 — What’s new in Xcode 15)

macro 만들기 위해서는 SwiftSyntax 를 써야하는데, 생성해야할 syntax node 의 정보를 알기 위해서는 syntax tree 를 po 등으로 프린트해서 유추하거나 documentation 을 보는게 가장 좋다고 함.

흠.. @Observable, #Predicate, @Model 등 이미 자체 프레임워크에 정의되어있는거나 잘 쓰면 다행일까?? 어쨌든 개념은 흥미로웠음.

같이 보면 좋은 링크 — What’s the difference between Macros and property wrappers?

What’s new in VisionKit 👀

visual lookup 의 지원 도메인이 iOS 17 부터 음식, 제품, 기호 및 심볼도 추가되었다. 원래는 반려동물, 자연, 랜드마크, 예술, 미디어 총 5개 있었음. 이런 추가 지원으로 인해 이제 세탁 태그에 있는 심볼이 뭘 뜻하는지 등을 알 수 있다 (손 세탁 등..).

라이브 텍스트의 지원이 태국어, 베트남어도 늘어났다는데 원래 한국어 있던거 쩜 기특한 부분.

표(table)도 라이브 텍스트를 지원해서 이제 표 이미지 데이터를 Notes 나 Numbers 에 더 쉽게 가져올 수 있음. 짱이다!

Unlock the power of grammatical agreement ❤️

언어들 중 보면 남성 명사 / 여성 명사 등 문법적 성이 나눠져있는 경우가 있음. 으으.. 한국어 최고!

어쨌거나 이게 통일되어야 자연스러운 문장이 되기 때문에, 특정 단어를 기준으로 해당 성에 맞게 다른 단어를 자동으로 고쳐준다. 단어들이 한 sentence 에 모여있지 않을때는 agreeWithConcept 를 쓰고, 하나의 sentence 에 모여있을때는 agreeWithArgument 를 써서 맞추면 됨

그리고 TermOfAddress 를 feminine, masculine, neutral 의 값을 적용하면 she / her / her, he / his / him, they / their / them 과 같이 설정한 값에 맞는 인칭대명사(?)를 적용할 수 있어서 좀 더 개인화된 느낌을 줄 수 있음. 물론 custom 하게 ze, zem, zes, zes, zirself 등과 같이 정의할 수도 있음

Perform accessibility audits for your app 👀

원래 Accessibility Inspector 에서 접근성 관련해서 뭐가 잘못되는지 알려주는 audit 기능이 있는데, 이걸 코드에서도 performAccessibilityAudit(for:_:) 호출 함으로써 가능해짐. 여기서 첫번째 파라미터는 .dynamicType, .contrast 등 리포트하고 싶은 옵션을 지정할 수 있음 (디폴트는 .all). 그리고 두번째 파라미터인 issue 핸들러에서는 이렇게 리포트 된 이슈 중 ignore 하고 싶은 조건들 넣을 수 있음

accessibilityElement 를 따로 지정하면 여기에 지정되지 않은 element 는 identifier 로도 찾지 못하는 이슈가 있는데, 접근성 경험을 해치지 않으면서도 test 를 위한 element 를 지정하고 싶다면 automationElements 를 사용하면 됨

Unleash the UIKit trait system ⭐️

여기서 말하는 trait 내용 자체가 나한테 중요하다기 보다는, 중간 중간 나오는 레이아웃들에 대한 설명 때문에 다시 보면 좋을듯

trait 는 시스템이 view controller 및 view 에 전파하는 데이터로, UIKit 에서는 dark / light 같은 user interface style, compact 같은 horizontal size 등의 속성을 기본적으로 제공함. iOS 17 부터는 custom trait 도 정의 가능한데, 이렇게 하면 앱의 뷰 컨트롤러 및 뷰에 데이터를 제공할 수 있는 새로운 장이 열리는거임.

Screen -Windows Scene -Window -Presentation Conroller -View Controller -View 의 계층으로 구성된 Trait Environment 들이 있으며 각각 자신의 trait collection 을 가지고 있음. 이 순서대로 trait 가 흘러가는데, 각 Trait Environment 는 상위에서 값을 상속받으므로, 가능한 가장 구체적인 trait environment 의 trait collection 을 사용하는 것이 좋음

viewWillAppear 과 같이 view 가 계층에 add 되기 전에 trait collectoin 에 접근하면, 여기서는 최신 값을 가지고 있지 않음. 대신 view 가 add 된 이후인 viewIsAppearing 에서는 최신 trait collection 접근 가능.

layoutSubviews() 가 traits 를 사용하기 가장 적합한 곳. 하지만 setNeedLayout 이 뷰에서 호출될 때마다 다시 실행되므로 여러 번 호출되는 경우에는 작업이 중복되지 않도록 구현 필요.

traitOverrides 는 특성 계층 내에서 데이터를 수정하는 데 사용하는 메커니즘. override 가 세팅되어있지 않는데 traitOverrides 에서 값을 읽으러고 하면 exception 발생할 수 있으므로, trait 값을 읽을때는 언제나 traitCollection 을 사용.

traitCollectionDidChange(_:) 는 deprecated 됨

Meet mergeable libraries ⭐️

와 앞에 5분 빼고 거의 다 못알아 들음. 한 다섯번 다시 봐야함;;

동적 라이브러리는 luanch 시간에 영향이 가고, 정적 라이브러리는 build 시간에 영향 가서 지금까지 이 둘 중 가장 적합한 항목을 측정할 것을 권장했지만, mergeable 라이브러리는 두 가지 링킹 전략의 좋은 것만 뽑아냄?

동적 라이브러리 여러개 있으면 dyld 가 로드하는데 오래걸리지만, 동적 라이브러리들 하나로 합쳐서 dyld 부담 줄일 수 있음..?

흠…………….모르겠다………역시 나중에 다시 듣는 수 밖에

관련 아티클 — Configuring your project to use mergeable libraries

What’s new in SF Symbols 5 ❤️

Meet mergeable libraries 듣고 상처받아서 마음의 안정을 위해 찾아간 세션 ㅎㅎ 역시나 편하게 들을 수 있었고 내용도 흥미로웠음.

symbol 는 layer 별로 애니메이션 됨.

애니메이션에는 깊이감을 위한 front — middle — back 과 같은 공간 개념이 있음

애니메이션 종류에는 Appear, Dissapear, Bounce, Scale, Pulse, Variable Color, Replace 가 있음

Bounce 는 빠르게 튕기는 효과를 가짐. 액션이 발생했거나, 액션이 수행되어야할때는 알려줌.

Scale 은 작아지거나 커짐. 아이콘을 hover 할 때 symbol 이 커지면 인터렉션이 일어났다는 느낌을, 작아졌다가 원래 크기로 돌아오면 누른 듯한 느낌을 줌. 사용자의 행동에 반응해서 인터페이스가 좀 더 촉각적인 느낌을 갖게 할 수 있음.

Pulse 는 불투명도를 변경해서 지속적인 액티비티의 느낌을 전달함. 화면 공유 중일때 화면 공유 심볼에 Pulse 효과를 주면 해당 동작이 진행중이라는 걸 표시할 수 있음.

Variable Color 도 올해부터 애니메이션 라이브러리의 일부가 되었는데, Cumulative 와 Iterative 라는 두 가지 특징을 표현하는 방법을 가짐. Cumulative 는 이전 상태를 유지하면서 레이어를 차례로 강조 표시하고, Iterative 는 한번에 하나씩 순서대로 레이어를 강조 표시함 (ex. wifi 찾을 때 심볼 애니메이션).

Relpace 는 한 심볼이 다른 심볼로 변경되는 건데 (ex. 재생 -정지), 바뀔때 방향성이 down/up 도 있고 up/up 도 있음

Animate symbols in your app 👀

심볼 애니메이션을 API 에서는 “symbol effect” 라고 부름

애니메이션 effect는 네가지 동작으로 나뉨 — Discrete(불연속), Indefinite (한계가 없는), Transition, Content Transition. 어떤 effect 가 어떤 동작을 지원하는지 알고 싶으면 4:45 부터 보기

스유에서는 symbolEffect 메서드를 통해 effect 를 줄 수 있음 (ex. .symbolEffect(.variableColor)).

UIKit 에서는 addSymbolEffect 를 사용해서 effect 추가하면 됨 (ex. .addSymbolEffect(.variableColor)). 이 함수를 통해 다른 effect 도 동시에 추가 가능함. effect 제거를 위해서는 removeSymbolEffect 를 호출하면 됨.

심볼을 Dissapear 시킬때 심볼이 있던 자리는 유지된채 사라지길 원할 수도 있고, 심볼 자리 자체가 없어져서 주변 뷰의 레이아웃도 함께 변하기를 원할 수도 있는데, 둘 다 지원함. 코드와 함께 자세한 내용은 10:58 부터~

Create animated symbols 👀

SF Symbols 앱에서 애니메이션을 돌려본다든지.. 많은 것들을 할 수 있군?

custom symbol 이랑 symbol component (ex. circle, badge, slash 등..) 를 결합해서 새로운 심볼 만들 수 있는거 신기~

솔직히 마지막에 큐브 맞추는거 자랑하려고 덥덥 발표 나오신거져?

Explore pie charts and interactivity in Swift Charts 👀

스유에서 파이 차트 생김. 안에 구멍 뚫으면 도넛 차트 됨

chartXSelection 이 추가되어서 클릭에 대한 정보를 나타낼 수 있음

도넛 차트 생겼다고 마지막에 도넛 드시는거 살짝 킹받아여 ㅠ

Meet Assistive Access 👀

Assistive Access는 인지 부담을 줄이기 위한 효과적인 경험을 만드는 것을 목표로 함. 더 적은 단계와 더 적은 옵션을 통해 사용자가 원하는 항목을 찾고 탐색할 수 있도록 함.

중요하지.. 키오스크도 다 이런 디자인으로 되었으면 좋겠다 ㅎㅎ 키오스크 사용하기 어려워 죽겠어요!

관련 기사 — Apple, Live Speech, Personal Voice, 확대기 내 Point and Speak 등 새로운 손쉬운 사용 기능 사전 공개

Discover streamlined location updates ❤️

CLLocationUpdate 라는 struct 가 새로 나왔다. 여기서 liveUpdates(_:) 를 쓰면 업데이트되는 위치 정보를 짱 쉽게 받을 수 있는데, 인자로 airbone, fitness 등의 activity type 을 넣을 수도 있다.

liveUpdates 를 호출하고 나면 나오는 CLLocationUpdatelocation 정보와 isStationary (멈춰있는지) 정보를 포함하고 있음.

LiveActivity 는 백그라운드 업데이트 위치 업데이트를 활성화하는 가장 좋은 방법으로, LiveActivity 가 활성화되어있는 동안에는 추가 설정 없이 업데이트를 받을 수 있음.

만약 Live Activity 가 없더라도 CLBackgroundActivitySession 을 사용하면 되는데, 이를 사용하기 위해서는 인스턴스를 생성하고 hold 해야함. 객체가 deallocation 되면 세션이 자동으로 비활성화되어 앱의 백그라운드 위치 액세스가 종료될 수 있으므로 hold 파트를 주의해야함.

사용자가 활동을 중지하는 경우 (ex. 사무실 책상에 앉아있을때)에는 API 가 이를 자동으로 인식하고 일시 중단 함. 그리고 다시 이동하면 자동으로 업데이트 시작됨.

앱이 suspend 된 상태 뿐만 아니라, 앱 크래시나, 유저의 종료, 리소스 부족 등으로 인해 terminated 되더라도, 백그라운드에서 앱을 실행해서 location updates 를 사용할 수 있는 경우에 앱을 즉시 복구하고 background running 상태로 전환함.

What’s new in privacy 👀

이제 OHTTP (Oblivious HTTP) 지원함. application layer protocol 임. what 에서 who 를 분리함으로써 사람들의 앱 사용과 IP 주소를 보호한다는데 신기하당.

OHTTP 를 사용하면 네트워크 공급자는 application server 대신 relay provider 에 대한 연결만 관찰 가능함. 이 아키텍처의 핵심은 relay 로, 얘는 클라이언트의 IP 주소와 목적지 서버 이름은 알고 있지만, content 는 암호화되어있지 않음. application server 에 대한 최종 연결은 relay 에 의해 이뤄짐. third party 가 realy 를 운영하는 경우, source / destination IP 및 콘텐츠를 전부 볼 수 있는 single party 는 없음. iCloud Private Relay와 같은 서비스는 이미 OHTTP 사용 중.

Sensitive Content Anlysis 프레임워크를 사용해서 앱에서 민감한 콘텐츠를 감지할 수 있다고 함. 시스템이 재공하는 ML 모델을 사용하기 때문에 콘텐츠를 서버와 공유할 필요 없음. SCSensitivityAnalyzer 를 사용해서 손쉽게 이미지나 비디오의 nudity 를 분석할 수 있음.

흠.. 그나저나 공포 이미지나 징그러운 이미지 포함하고 있는지 판단해주는 Analyzer 도 만들어주면 안되나? ㅠ 웹툰 같은거 볼때 그런 이미지 자동으로 모자이크 해줬으면 좋겠다 ㅠ

⭐️ Safari 17의 Private Browsing 모드에서는 고급 추적 및 지문 보호 기능이 추가되어 웹 사이트 간 추적을 방지하는 두 가지 새로운 보호 기능이 포함됨.

첫번째로 known tracking 과 fingerprinting resource 가 로드되는 것을 방지함. 따라서 웹 사이트 개발자라면, 로그인 흐름에 초점을 맞춘 테스트, 웹 사이트 간 탐색, 화면, 오디오 및 그래픽과 관련된 브라우저 API 사용 등 Private Browsing 모드에서 웹 사이트의 기능을 테스트해야 함. 고급 추적 및 지문 보호 없이 다시 로드해서 웹 사이트의 동작 차이가 이 새로운 보호 기능 때문인지 확인할 수 있음. known tracker 에 연결해서 차단된 네트워크 요청은 “Blocked connection to known tracker”으로 시작하는 메시지로 표시 됨.

cross-website 트래킹을 위한 또 다른 일반적인 방법은 URL에 내장된 고유 identifier (ex. click_id="YmVhOD1MmZmNGU4" 와 같은 쿼리 파라미터) 임. 사용자가 추적 당할 수 있는 곳을 제어할 수 있도록, 브라우저 탐색 중이나 링크를 복사할 때 이런 트래킹 파라미터를 제거함. tracking parameter 가 감지되면 , Safari는 URL의 identifying 컴포넌트를 제거하고 식별할 수 없는 부분은 유지함. 이제 Private Browsing 모드에서 광고 속성은 탭을 기반으로 한 단일 탐색 컨텍스트에 한정됨.

관련 기사 — Apple announces powerful new privacy and security features

vistion pro 에서는 사람들이 무엇을 보는지가 그들이 생각하는 것을 드러낼 수 있기 때문에, 무엇을 보는지를 제외하고 무엇과 상호작용하는지만을 배우는게(learn) 중요함

Build custom workouts with WorkoutKit 👀

애플 워치가 있었으면 내용을 이해하는데 좀 더 도움이 되었을것도 같고..? 역시 사야하나?

WorkoutKit은 새로운 Swift 프레임워크로, 사용자가 자신의 앱 내에서 Workout 앱에서 생성할 수 있는 다양한 운동 유형을 생성하고 사용자 정의할 수 있게 해줌. 또한, WorkoutKit은 이러한 운동을 사용자가 수행할 수 있도록 Workout 앱으로 가져올 수 있는 다리 역할을 함.

이번 WorkoutKit 은 Goal, Pacer, Swim-Bike-Run, Custom 네 가지 운동 유형을 추가함. 그 중 CustomWorkoutComposition 은 warp up 단계 — Interval block — cool down 단계 세가지 워크아웃 단계를 사용해서 구성할 수 있음.

수영은 custom workout 지원 안됨

Bring widgets to life ⭐️

위젯이 애니메이션 및 인터렉션이 가능해지면서 더 강력해짐!!! 최신 SDK 로 위젯을 다시 컴파일하면, 위젯의 콘텐츠가 변경될 때마다 시스템이 기본 애니메이션으로 항목간의 전환을 애니메이션 함.

원래 스유에서는 withAnimation 같은 modifier 에서 state 변화에 따라 애니메이션 됨. 하지만 위젯은 약간 다르게 작동함. 위젯에는 state 가 없고, 특정 시간에 렌더링 되는 다양한 view 로 구성된 타임라인을 만듦. 그리고 이 사이에 뭐가 다르고 같은지를 결정해서 변경된 부분을 애니메이션 함.

일반적으로 위젯 애니메이션을 보려면 특정 시간동안 기다려야하지만, 올해 Preview API 를 통해 바로 확인 가능함!

contentTransition(_:) 이나 transition(_:) 등의 modifier 를 통해 멋진 애니메이션 추가 가능해짐! (ex. .contentTransition(.numbericText(value: totalCaffein.value) / .transition(.push(from: .bottom)) )

위젯에서 이제 바로 action 을 수행할 수 있음. Button 및 Toggle 과 같은 control 을 사용해서 위젯의 일부를 interactive 하게 만들 수 있음.

여기서 주의할 점은 위젯은 다른 프로세스에서 렌더링 되기 때문에, SwiftUI 는 프로세스 공간에서 클로저를 실행하거나 바인딩을 변경하지 않는 다는 것. 따라서 위젯 extension 에 의해 실행되고, 시스템에 의해 호출될 수 있는 작업을 나타내는 방법이 필요함. 이는 App Intent 를 이용해서 달성 가능.

AppIntent 는 시스템에서 실행할 수 있는 작업을 코드로 정의할 수 있는 protocol 임. UI 에서 바로 App Intent 를 실행할 수 있는 기능을 지원하기 위해, Button 과 Toggle 에서 AppIntent 를 인자로 받는 새로운 initializer 가 있음. 이 말은 즉 AppIntent 를 사용하는 Button 과 Toggle 만 interactive widget 이 지원된다는 거임. AppIntent 가 완료되면 위젯은 타임라인을 다시 로드함.

Beyond the basics of structured concurrency ⭐️

앞에 절반정도는 [WWDC21] Explore structured concurrency in Swift 내용과 비슷한 느낌. 다만 예시와 그림을 더 많은 것 같아서 좋다.

Swift 5.9 에서부터 withDiscardingTaskGroup API 등장함. Discarding task group 은 일반적인 Task Group과 달리 완료된 자식 Task 의 결과를 유지하지 않음. task 에 사용된 리소스는 task 가 완료된 후 즉시 해제하기 때문에 값을 반환하지 않아도 되는 많은 task 가 있는 경우에 사용하면 메모리 소비를 줄이는 데 도움이 됨.

Discarding task groups 은 자식 task 를 자동으로 정리하기 때문에, 그룹을 명시적으로 취소하고 정리할 필요가 없음. 자동으로 sibling cancellation 도 하고, 자식 task 중 하나가 오류를 발생시키면 나머지 task 는 자동으로 취소됨.

Task-local 값은 지정된 task, 더 정확하게는 task 계층과 연결된 데이터임. 글로벌 변수와 비슷하지만 task local 값에 바인딩된 값은 현재 태스크 계층에서만 사용할 수 있음. @TaskLocal static var orderID: Int? 처럼 프로퍼티 래퍼를 사용해서 static property 로 선언함 (원래 있었는데 또 나만 몰랐지?!?!!!). Task local 은 optional 로 만드는게 좋음.

Task-local 값을 직접 할당할 수는 없지만, 특정 scope 에 바인딩되어야 하는데, 바인딩은 해당 범위의 지속 동안 유지되며, scope 의 끝에서 원래 값으로 복원됨.

각 Task 에는 task-local 값에 대한 연관된 공간이 있는데, task-local 변수에 바인딩된 값을 찾기 위해서는 해당 값이 있는 task 을 찾을 때까지 부모를 재귀적으로 탐색해야 함. 값이 바인딩된 task 를 찾으면, task local은 해당 값을 가지게 됨. 만약 못찾은 채로 루트에 도달하면, task local은 바인딩되지 않았으므로 원래의 기본값을 얻게 됨. Swift 런타임은 이러한 쿼리를 더 빠르게 실행하기 위해 최적화되어 있어서, 트리를 탐색하는 대신, 키에 해당하는 Task 에 직접 참조할 수 있음.

SwiftLog 는 server ecosystem 을 위한 로깅 라이브러리. 그 중 MetadataProvider는 SwiftLog 1.5에서 새로 도입된 API 로, 이를 구현함으로써 로깅 로직을 추상화하여 관련 값에 대한 일관된 정보를 발행하는 것이 쉬워짐.

Insruments 에서 HTTP 트래픽을 분석할 때, 서버의 응답을 기다리는 동안 profile 에서는 회색 상자만 표시되므로, 더 많은 정보가 있으면 좋음. 새로운 Swift Distributed Tracing 패키지의 목표는 Instruments 의 모호한 “응답 대기” 상태를 서버에서 발생하는 세부 정보로 채우는 것임.

분산 추적을 위해 withSpan API를 사용하면 추적 시스템에 기록되는 정보를 채울 수 있고, task tree 를 하나의 single trace 로 병합할 수 있음. 추적 시스템은 주어진 span 을 검사하는 동안 일반적으로 attributes 를 표시하는데, 대부분의 스팬은 HTTP 상태 코드, 요청 및 응답 크기, 시작 및 종료 시간 등의 메타데이터와 함께 제공되어 시스템을 통과하는 정보를 추적하기 쉬워짐. 만약 작업이 실패하고 오류를 throw 할 경우, 해당 정보도 스팬에 표시되고 추적 시스템에 보고됨.

분산 추적은 HTTP 클라이언트, 서버 및 기타 RPC 시스템을 포함한 시스템의 모든 부분이 trace 를 수용할 때 가장 강력함. Swift Distributed Tracing 은 task tree 기반으로 구축된 task local 값을 활용하여, 신뢰할 수 있는 노드 간 추적을 위한 모든 정보를 자동으로 전파함. 이 모든 것은 Swift 의 구조화된 동시성 특성 때문에 가능함.

Swift Distributed Tracing 패키지는 OpenTelemetry 프로토콜의 구현을 제공하므로, 기존의 추적 솔루션인 Zipkin과 Jaeger 같은 솔루션을 즉시 사용할 수 있음.

흠..어렵당.. 여기서는 makeSoup 예시 들었다고 마지막에 수프 드시네.. 저도 줘요..

What’s new in Web Inspector 👀

기억하자 Option + Command + I (web inspector 여는법)

Web Inspector 에서 타이포그래피 검사를 위한 새로운 툴이 생김. Element 의 Font 패널에서는 font 의 정보가 나오는데, 올해 추가로 synthetic bold 나 oblique style 에 대한 경고를 표시함.

보통 기울임체는 별도의 고유한 글꼴 파일로 제공되는데, 적절한 이탤릭체 스타일이 없으면 WebKit 은 이에 대한 인공적인 표현을 생성함. 일반 스타일에 알고리즘을 실행해서 비스듬한 스타일을 생성하는건데, 이를 synthetic oblique 라고 함. 모든 글꼴이 이를 지원하는건 아니지만, Web inspector 는 synthetic bold 나 oblique 가 사용될때 경고를 표시함 (ex. Font was synthesized to be oblique becuase no italic font is available). 이는 예상 글꼴 파일이 로드 되지 않았다는 힌트일 수도 있음.

Variable font 는 두께, 너비, 기울기 등과 같은 글꼴에 대한 여러 스타일 변형을 생성하는데 필요한 모든 정보를 단일 파일에 포함할 수 있는 글꼴 형식임. variable font 를 사용하는 element 를 inspect 하면, font 패널에는 지원되는 목록들이 표시 되는데, 올해는 이를 실시간으로 편집하고 결과를 볼 수 있는 interactive control 을 추가함.

Web Inspector 의 또 다른 새 기능은 컬러 스킴, 모션 감소, 색상 대비와 같은 설정을 시스템 기본 설정 값에서 따르지 않고, 테스트 중인 페이지에서만 설정할 수 있게 함. Element tab 에서 User Preference Overrides 팝 오버를 클릭하면 Color sheme, Reduce motion, Increase contrast 값을 해당 페이지에서만 재정의할 수 있음.

Web Inspector 의 Elements 탭에서는 Element 배지가 표시됨. 이를 통해 특정 관심 노드를 한눈에 식별할 수 있는 빠른 방법을 제공함. 이번에는 scroll, event 라는 새로운 badge 를 추가함. event 배지는 자바스크립트 이벤트 리스너가 연결된 element 옆에 나타남. 이 배지를 클릭하면 이벤트를 처리하는 자바스크립트 함수의 이름, 해당 함수가 정의된 소스코드의 위치 등 이벤트 리스너에 대한 개요를 얻을 수 있고, 이벤트 리스너를 비활성화 할 수도 있는 등의 기능이 제공됨.

Breakpoint 에 대한 개선사항도 있음. Breakpoint 섹션의 플러스 버튼을 클릭하면 설정할 수 있는 모든 breakpoint 목록이 표시되는데, 네트워크 요청에 의해 URL breakpoint, click 이벤트 등에 의해 트리거 되는 event breakpoint 등등 다양함. 여기에 올해는 함수가 실행되기 전에 일시 중단할 수 있는 symbolic breakpoint 를 추가함. Symbolic breakpoint 는 내장 JavaScript 함수에 대한 호출을 디버깅하거나, 이름이 같은 여러 함수에 대해 일시 중지하는데 유용함. Symbol 을 지정할때 대소문자 구분을 포함해서 함수 이름을 정확히 일치시킬 수 있고, 패턴과 일치하는 여러 함수에 대해 break 하려는 경우 혹은 완전한 함수 이름을 잘 기억하지 못하는 경우에는 정규식을 사용할 수도 있음.

Rediscover Safari developer features 👀

웹 페이지에서 특정 element 에 대해 control + click 하면 Inspect element (요소 점검) 이라는 메뉴를 볼 수 있다. 이걸 클릭하면 Web Inspector 열리고 바로 해당 element 에 대해 포커스 됨.

command + shift + c 는 element selection tool 을 활성화 시킬 수도 있음.

control + command + R 을 통해서 응답형 디자인 모드로 들어갈 수 있음 (혹은 개발자 메뉴에서 응답형 디자인 모드 선택). 여기서 view port 나 pixel ratio 등 조정 가능. 그리고 올해는 safari 에서 simulator 로 바로 이동 할 수 있도록 함. open with simulator 를 누르면 설치된 시뮬레이터 목록이 뜨고, 여기서 simulator 를 바로 열 수 있음 (xcode 가 설치되어있어야함).

맥북과 아이폰 등을 케이블로 연결해서 폰에 띄워진 웹 페이지를 맥의 Web Inspector 에서 디버깅 할 수도 있지만, 네트워크를 통해 연결 가능함. 사파리의 개발자 메뉴에서 내 핸드폰 기기를 선택하고 connect via network 선택함 (아마 이 과정은 먼저 선으로 연결이 되어있어야 하는거겠지..?). 그러면 두 기기가 같은 네트워크에 있는 한 연결 됨.

올해 새롭게 추가된 기능으로는 isInspectable 프로퍼티를 통해 앱의 릴리스 버전에서 웹 콘텐츠를 검사할 수 있게 됨. macOS 13.3 이상, iOS 및 iPadOS 16.4 이상, xrOS에서 앱의 콘텐츠를 검사할 수 있도록 API가 제공됨. 이 API는 WKWebViewJSContext 모두에서 사용 가능.

WebDriver는 웹 콘텐츠 테스트를 자동화하기 위한 크로스 브라우저 API. 주로 서드 파티 라이브러리를 통해 WebDriver 랑 interact 하는데, 대표적인게 Selenium. 테스트는 iOS 시뮬레이터나 실제 기기에서도 실행 될 수 있음.

Feature flags 메뉴에서 있어서 여기에서 추후에 공개될 feature 들을 미리 실험할 수 있음.

Discover String Catalogs ⭐️

이전에는 앱을 현지화 하려면 strings 및 stringdic 파일을 관리해야했음. 이렇게 하면 모든 string 을 수동으로 코드와 동기화해야했음. 당연히 이러면 현지화 문구 빼먹을 수도 있음.

이제 Xcode 15 부터는 String Catalog 를 도입함!!! 이는 현지화의 새로운 기반이며, 프로젝트에서 번역 관리 프로세스를 단순화함.이를 통해 모든 문자열을 한곳에서 쉽게 관리할 수 있고, 배포 전에 콘텐츠들이 완전히 현지화 되었음을 확신할 수 있음. 시간이 지나면 strings 및 stringdic 파일을 모두 대체하게 될것!!

코드에 있는 모든 문자열들이 자동으로 추출되어서 String Catalog 로 들어감. 사실 코드 뿐만 아니라 Interface builder, Info plist 에서까지 문자열을 뽑아낼 수 있음. String Catalog 는 지역화 가능한 문자열을 추출하기 위해 Swift 컴파일러의 강력한 기능을 사용하므로 Build Setting 에서 Use Compiler to Extract Swift Strings 를 YES 로 활성화 해야함.

Swift 코드 뿐만 아니라 NSLocalizedString 을 사용하는 옵젝씨 코드에서도 문자열을 뽑아낼 수 있는데, 이를 가능하게 하려면 Build Setting 의 Localized String Macro Names 에 따로 지정을 해줘야함.

Xcode 14.3 에서는 Project Editor 에서 디폴트 localization 을 변경할 수 있는 기능도 생겼는데, 이는 소스 코드의 문자열이 영어가 아닌 경우에 유용함.

String Catalog 에서 현지화 되지 않은 문자열이 더 이상 코드에서 사용되지 않는걸 발견했을때, 자동으로 삭제됨. 하지만 현지화 된 상태에서 코드에서 사용되지 않는 경우에는 삭제하지는 않고 Stale 로 표시됨. 그래서 만약 더 이상 이 값이 필요하지 않다면 삭제할 수 있음. Stale 외에도 New, Needs Review, Translated 의 상태가 있음.

물론 수동으로 관리할 수 있는 옵션도 있음. 클라우드에서 문자열을 가지고 올때도 이에 대한 문자열을 수동으로 정의하고 관리 가능함.

String Catalog 에서 플랫폼에 따라 다르게 문자열을 수정할 수도 있음 (아이폰에서는 tap 이라고 되어있는걸 mac 에서는 click 으로 한다든가..)

현지화할때는 pluralization (복수화) 도 중요한데, 영어에서는 단수와 복수에 따라서 s 가 붙는 등 문법이 달라짐. 우크라이나어 같은 경우에는 더 복잡함. String Catalog 에서는 문자열 변형에 대한 빌트인 support 가 포함되어서, 단복수 케이스에 대한 문자열들을 더 쉽게 관리할 수 있음.

XLIFF 는 localization 을 저장하고 전송하기 위한 산업 표준 형식인데, String Catalog 를 사용하는 프로젝트에서 변형되는 문자열들 (varied strings)이 어떻게 표현되는지에 대한 몇 가지 변경 사항도 있음. 이거 보려면 23:42 부터~

String Catalog 는 내부적으로 JSON 파일임. 그리고 build time 에서 .string 과 .stringdic 파일로 컴파일됨. 그래서 최소 deployment target 을 업데이트 하지 않고도 String Catalog 를 바로 사용할 수 있음. 기존 strings 파일을 우측 클릭을 통해 Migrate to String Catalog 를 선택해서 String Catalog 로 전환할 수도 있음. 이를 통해 아직 현지화 되지 않은 문자열을 찾는데도 도움이 됨.

What’s new with text and text interactions 👀

뭐.. 선택 UI에 변경 사항이 있고, UITextView 에 menu 가 생기고.. TextKit 2 에 list 랑 bullet, 로마, 알파벳 등 형식의 글머리 기호가 생기고.. ㅇㅋㅇㅋ..

언어간의 가변적인 줄 높이를 처리할 때 텍스트가 잘리는 문제가 일반적으로 발생할 수 있음. 이를 해결하기 위해 UITextFieldUILabel 과 같은 표준 텍스트 element 에 언어에 따라 동적으로 line height 를 조정하도록 개선점을 추가했음. 이제 line Height 는 디바이스의 선호 언어 세팅에 따라 달라짐. 이러한 자동 조정을 text style 을 사용하는 text element 에만 적용됨. Custom font 는 계속 고정된 line Height 를 사용함.

이러한 동작은 여러 릴리즈에 걸쳐 적용되었기 때문에 완전히 새로운건 아닌데, iOS 17부터 훨씬 dynamic 하며 정확한 조정을 지원함. 이 동작을 사용하기 위해서는 preferredFont(forTextStyle:) 메서드를 사용해서 UIFont 를 생성하고, UILabel 과 같은 text element 에 할당함. 그리고 text element 에는 clipsToBound 를 false 로 줘야함

한국어, 독일어, 일본어, 중국어 같은 언어의 줄 바꿈 동작을 크게 개선함. 이런 개선 사항은 UI 에서 사용중인 text style 의 종류와 표시되는 언어에 따라 다른 규칙을 적용하는데, 예를 들어 한국어에서 줄바꿈이 “동기부여를 위해 피트니스 \n 알림 받기” 이렇게 되었을 수도 있음. 이제 UIKit 이 title text style 에 대해 이러한 분할을 방지해서 “동기부여를 위해 \n 피트니스 알림 받기” 와 같이 원활한 읽기 경험을 보장함. 이러한 동작을 지원받기 위해서는 Text Style 을 채택해야함.

마무리

2탄에는 아마 아래 세션들 후기가 되지 않을까 싶네여!! 이 외에도 추천할 세션 있다면 알려주세여!! 그럼 20000~

Generalize APIs with parameter packs

Expand on Swift macros

Debug with structured logging

Meet ActivityKits

Meet Push Notifications Console

Spotlight your app with App Shortcuts

Update Live Activities with push notifications

Explore enhancements to App Intents

Get started with privacy manifests

Fix failures faster with Xcode test reports

Build programmatic UI with Xcode Previews

What’s new in Background Assets

Meet the App Store Server Library

Wind your way through advanced animations in SwiftUI

Beyond scroll views

Build accessible apps with SwiftUI and UIKit

Demystify SwiftUI performance

Animate with springs

Ready, set, relay: Protect app traffic with network relays

--

--