Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Go further with Complications in WidgetKit #28

Open
hyun99999 opened this issue Sep 6, 2022 · 1 comment
Open

Go further with Complications in WidgetKit #28

hyun99999 opened this issue Sep 6, 2022 · 1 comment
Assignees
Labels
Essential WWDC Topic: 에센셜 wwdc22 wwdc2022

Comments

@hyun99999
Copy link
Member

hyun99999 commented Sep 6, 2022

Discover how you can use WidgetKit to create beautiful complications on watch faces. We'll introduce you to the watchOS-specific features found in WidgetKit, and help you migrate from existing ClockKit complications. For more on WidgetKit, watch “Complications and Widgets: Reloaded” from WWDC22.

@hyun99999 hyun99999 added wwdc22 wwdc2022 Essential WWDC Topic: 에센셜 labels Sep 6, 2022
@hyun99999 hyun99999 self-assigned this Sep 6, 2022
@hyun99999
Copy link
Member Author

Go further with Complications in WidgetKit - WWDC22 - Videos - Apple Developer

본 글은 WWDC 를 보고, 번역 및 요약 그리고 실행해보는 스터디 프로젝트의 일환입니다.

1

내용

  • watchOS 에서만 가능한 widgetKit 의 기능과 ClockKit 컴플리케이션을 WidgetKit 에 마이그레이션 하는 방법

Developer Apple - widgets

이제 WidgetKit을 사용하여 iPhone 잠금 화면의 위젯과 watchOS의 컴플리케이션을 생성할 수 있습니다.

이제 WidgetKit을 사용하여 Apple Watch용 컴플리케이션과 iPhone용 잠금 화면의 위젯을 빌드하고, … iOS 16 및 watchOS 9용 코드를 한 번 작성하고 기존의 홈 화면 위젯에 인프라를 공유해 보십시오.

✅ Overview

2

  • watchOS 에서만 가능한 WidgetKit 기능
  • ClockKit complications 을 WidgetKit 에 마이그레이션 하는 방법

Coffe Tracker sample app

  • 하루 종일 물을 제외한 음료 섭취 횟수를 기록해 시간이 지날수록 쌓이는 체내 카페인량을 추적하는 앱

(coffe tracker 샘플 앱을 예시로 세션을 진행하겠습니다.)

✅ Unique to watchOS

🧑‍🏭 : watchOS 에서만 나타나는 특징을 살펴봅시다.

3

iOS 16 에서는 컴플리케이션 스타일 위젯을 iPhone 잠금 화면에 가지고 왔으며 watchOS 9 에서는 WidgetKit 을 watch complications 에 가져왔습니다.

4

  • watch specific family

watch face 에서는 screen corner 에 독특한 컴플리케이션을 구성해 보았는데요. 이때문에 accessoryCorner 라는 특유의 WidgetKit family 가 필요합니다.

  • Auxiliary(보조자) content

5

unique 한 표현은 보조 콘텐츠로 SwiftUI 뷰에서 구체화됩니다. 즉, 워치 페이스에 의해 렌더링됩니다.

6

코너의 circular 부분은 표준 SwiftUI 렌더링으로 보조 콘텐츠는 코너의 곡선 부분입니다.

7

또는 Infograph 페이스의 다이얼이 있습니다.

  • Mutiple representations

8

acessoryInline family 는 독특한 행동을 합니다. 페이스에 따라 렌더링되는 방식이 다양합니다. 어떨때는 평평하고, 어떨때는 다이얼에 맞게 곡선형입니다.

✅ How to Support Unique Features

iOS 16에서는 complication-styled widget families 로 accessoryRectangular, accessoryCircular, acessoryInline 외에도 accessoryCorner 라는 family 를 개발하였습니다.

9

크고 둥근 콘텐츠인 하단에 나타나는 지도, 심장박동을 나타내거나 상단 코너에 나타나는 커피 추적기나 달 형상처럼 곡선 label 이나 게이지가 있는 작고 둥근 콘텐츠로 나타납니다.

inner auxiliary content 를 보여주는 여부를 제어하기 위해 watchOS 9에는 새로운 view modifier 가 추가되었습니다.

✅ Building a Corner Complication

10

  • SF Symbol 과 background 를 갖춘 ZStack
  • SwiftUI 콘텐츠는 다른 코너 컴플리케이션의 디자인과 맞추기 위해서 자동으로 원 모양으로 고정됩니다.

❗️ AccesoryWidgetBackground()

(출처: WWDC22 Complications and widgets: Reloaded)

background view 는 다양한 위젯 렌더링 모드에서 여러 모습을 가집니다.

11


🦉 New in watchOS 9.0

12

  • inner curved content 를 추가하기 위해서 새로운 watchOS 9 의 widgetLabel 를 사용.

워치 페이스는 family 와 워치 페이스 스타일에 적합한 제어를 끌어내기 위해 modifier 의 contents 를 추출합니다. 그리고 circular content 가 자동으로 축소되어 공간을 만듭니다.

🧑‍🏭 : accessoryCorner 에서는 text, gauge 구체화가, widgetLabel 에서는 progressView 구체화가 가능합니다.

✅ How WidgetLabel used on the AccessoryCircular

accessoryCorner 에서 widgetLabel 을 유일하게 지원하지 않습니다. accessoryCircular 에서는 어떻게 사용될까요?

13

Infograph 워치 페이스에서는 corner complications 외에도 다이얼 내부에 4개의 circular complications 가 있습니다.

🧑‍🏭 : 중간 상단의 커피 추적기 컴플리케이션은 우리가 이전에 만났던 코너 컴플리케이션과 매우 유사합니다. 다이얼 안쪽 텍스트에 어떻게 추가할 까요?

14

위의 디자인을 위하여 corner complication 에 있는 widgetLabel 의 Gauge 를 옮기는 것이 더 좋을 것이라 판단했습니다.

15

Infograph 의 중앙 상단을 이용하기 위해서 원형 콘텐츠에 맞지 않을 긴 베젤 영역에 추가 텍스트를 넣기 위해 widgetLabel 에 gauge 를 추가하였습니다.

이제 메인 뷰와 텍스트 위에 너무 정보가 많습니다.

16

  • circular content 를 커피 컵 심볼로 변환해 이 부분을 지웠습니다.
  • 베젤이 없는 circular complication 으로 바꾸면 카페인 정보가 전부 사라집니다.

우리는 두 사례 모두에게 추가할 수 있는 API 가 있습니다.

🦉 New in watchOS 9.0

17

🧑‍🏭 : showsWidgetLabel 이라는 Environment 프로퍼티를 뷰에 추가하여 컴플리케이션을 업데이트 합니다. 이는 complication 이 widgetLabel 의 콘텐츠가 보이는 워치 페이스에 위치할 때마다 참이 될 것입니다.

18

showsWidgetLabel 의 값에 따라 조건문을 사용하여 콘텐츠를 바꿀 수 있습니다.

🧑‍🏭 : accessoryCircular family 가 시계 페이스를 나타내는 두 가지 방법을 보여드렸습니다. 한 가지 더 알고 계셔야 할 방법이 있습니다.

✅ Extra Large

Extra Large 워치 페이스는 시간을 보기에 좋은 방법입니다. 그리고 하나의 큰 circular complication 을 지원합니다.

19

그리고 accessoryCircular family 를 사용하고 페이스 스타일에 맞게 콘텐츠를 자동으로 확대합니다.

20

단, 이때 canvas size 확대를 통해 complication 을 꽉 채우려고 하지 마세요. 콘텐츠는 보통의 circular family 와 동일하되 약간 커야 합니다.

워치 페이스에서 사용되는 위젯 families 는 accessoryRectangular 와 accessoryInline 도 있습니다. widgetLabel 이 보이는 rectangular 를 가진 페이스는 없습니다.

accessoryInline family 는 이미 widgetLabel 로 작동하고 있습니다. 워치 페이스는 inline content 의 Images 와 Texts 를 추출하고 페이스 모습에 맞춰 스스로 렌더링합니다.

✅ Migration

두 가지 부분으로 나뉩니다.

21

  • WidgetKit 을 적용할 때 시스템은 새 콘텐츠에 대해 ClockKit 데이터 소스를 묻지 않고 face editing picker 에 새로운 complications 만 보여줄 것입니다.
  • WidgetKit 에서 기존의 ClockKit complication 코드를 다시 쓰고 mapping 을 제공함으로써 페이스 적용 컴플리케이션으로 업그레이드하는 방법을 알려줍니다.

🦉 New in watchOS 9.0

22

watchOS 9 은 WidgetKit 을 워치에 가져왔을 뿐만 아니라 모든 페이스에 풍부한 컴플리케이션을 업데이트해주었고, 이것은 complication families 의 수를 드라마틱하게 줄여줄 수 있었습니다. 12개에서 4개로요!

23

  • rectangular 와 corner 는 accessoryRectangular 와 accessoryCircular 로 매핑
  • 세 개의 graphic circular 스타일인 ClockKit families 는 모두 accessoryCircular Widgetkit family 가 되었다.
  • accessoryInline family 는 기존 utilitarianSmallFlat 이나 utilitarianLarge 가 사용되는 곳에 쓰인다.
  • 그리고 utilitarianSmall 이었던 곳이 accessoryCorner family 로 많이 업데이트 되었습니다.

24

  • WidgetKit 에서는 SwiftUI 뷰와 레이아웃이 ClockKit 의 템플릿으로 대체됩니다.
  • WidgetKit 의 타임라인과 엔트리는 친숙합니다. 실제로 이것은 ClockKit 자체에서 영감을 받은 것입니다.(호오…) 이것은 컴플리케이션 데이터 소스가 정적 또는 intent 기반의 WidgetKit 구성에 잘 마이그레이션 한다는 것이죠.

25

WidgetKit 을 지원하는 configurations 타입과 일반적인 family 지원에 대해서 알고싶다면 위의 세션을 확인해 보세요.

✅ Migration API

ClockKit 에 컴플리케이션을 자동으로 마이그레이션하도록 마지막 API 를 추가하였습니다.

26

기존의 컴플리케이션을 사용자 상호작용 없이 자동으로 WidgetKit 으로 업그레이드 할 수 있습니다.

27

1️⃣ 여러분의 앱이 워치에서 업데이트되면

2️⃣ Watch Faces 가 앱의 번들에서 위젯 표시를 확인할 겁니다.

3️⃣ 발견할 경우 ClockKit 컴플리케이션 데이터 소스를 공개해 기존 컴플리케이션에 대한 마이그레이션을 생성합니다.

4️⃣ 더 나아가면 CLKComplicationDataSource 는 당신의 ClockKit 공유 페이스를 누군가 받게 될 때 마이그레이션을 요청하게되고 이때만 작동할 것입니다.

🦉 New in watchOS 9.0

28

WidgetKit 컴플리케이션을 다 만들었다면, 새 프로퍼티 widgetMigrator 를 추가할 수 있습니다. 이는 새 Migrator protocol 을 준수하는 객체를 제공합니다. 컴플리케이션의 데이터 소스 자체이건 다른 유형이건 상관 없습니다.

29

CLKComplicationWidgetMigrator 프로토콜에는 기존 CLKComplicationDescriptors 의 위젯 마이그레이션 구성을 워치 페이스에 제공하는 단일 함수만 존재합니다.

30

새 API 를 채택하는 가장 직접적인 방법은 데이터 소스를 새 프로토콜 Migrator 에 준수시키는 것입니다.

31

WidgetKit 컴플리케이션이 정적 구성을 사용한다면 정적 마이그레이션 구성을 제공합니다.

32

위젯 컴플리케이션에서 인텐트를 사용한다면 동등한 마이그레이션 구성이 됩니다.

33

인텐트 기반 마이그레이션 제공시 watch app 과 widget extension 에 intent definitions 를 추가해야만 할 것입니다. 양쪽에서 intent object 를 만들 수 있어야 하니까요.

🧑‍🏭 : WidgetKit 은 경험을 극적으로 단순화시키면서도 워치 컴플리케이션 만들기를 창의적이고 새롭게 만들어줍니다.

34

35

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Essential WWDC Topic: 에센셜 wwdc22 wwdc2022
Projects
None yet
Development

No branches or pull requests

1 participant