Secret-Of-SwiftUI / SSDC22

๐Ÿคก ์‘~ ์งˆ๋ ค? deprecated ํ•˜๋ฉด ๊ทธ๋งŒ์ด์•ผ~
9 stars 0 forks source link

Complications and widgets: Reloaded #24

Open hyun99999 opened 2 years ago

hyun99999 commented 2 years ago

Our widgets code-along returns as we adventure onto the watchOS and iOS Lock Screen. Learn about the latest improvements to WidgetKit that help power complex complications on watchOS and can help you create Lock Screen widgets for iPhone. We'll show you how to incorporate the latest SwiftUI views to provide great glanceable data, explore how each platform renders content, and learn how you can customize the design and feel of your content within a widget or complication.

hyun99999 commented 2 years ago

Complications and widgets: Reloaded - WWDC22 - Videos - Apple Developer

๋ณธ ๊ธ€์€ WWDC ๋ฅผ ๋ณด๊ณ , ๋ฒˆ์—ญ ๋ฐ ์š”์•ฝ ๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ํ•ด๋ณด๋Š” ์Šคํ„ฐ๋”” ํ”„๋กœ์ ํŠธ์˜ ์ผํ™˜์ž…๋‹ˆ๋‹ค.

1

๋‚ด์šฉ

๐Ÿ”ฅย Overview

2

๐Ÿ”ฅย Complication timeline

4

์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ watchOS ์˜ ์ฃผ์š” ์š”์†Œ๋กœ ์‹œ๊ณ„ ํŽ˜์ด์Šค์— quick, glaceable information ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ฆ‰์‹œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” high-value ์˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ํƒญ ํ•˜์—ฌ ์•ฑ์˜ ๊ด€๋ จ ์œ„์น˜๋กœ ์ด๋™์‹œ์ผœ์ค๋‹ˆ๋‹ค.

4

watchOS 2์—์„œ๋Š” ClockKit ๊ฐ€ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๊ณ  ๊ทธ๋•Œ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ’๋ถ€ํ•œ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ทธ๋ž˜ํ”ฝ ์ปจํ…์ธ ์™€ ์ƒˆ๋กœ์šด families ์„ธํŠธ์™€ ํ•จ๊ป˜ watchOS 5 ๊ฐ€ ์†Œ๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

SwiftUI ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋‹ค์ˆ˜์˜ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ watchOS 7์—์„œ ์†Œ๊ฐœ๋˜์–ด ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋ฉฐ ๋ฐœ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

5

์˜ค๋Š˜ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ WidgetKit ๊ณผ ์žฌ์ฐฝ์กฐ๋˜์–ด iOS 16 ๊ณผ watchOS 9 ์˜ WidgetKit ์œผ๋กœ ๋‘ ํ”Œ๋žซํผ์—์„œ ํ›Œ๋ฅญํ•œ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์œ„์ ฏ์„ ๊ตฌ์ถ•ํ•ด ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ์“ฐ๋ฉด ๊ธฐ์กด ํ™ˆ ํ™”๋ฉด ์œ„์ ฏ๊ณผ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

6

์ด๋ฅผ ์œ„ํ•ด์„œ ๊ธฐ์กด WidgetFamily ์œ ํ˜•์— accessory ๋ผ๋Š” ์ ‘๋‘์–ด๋ฅผ ๊ฐ€์ง„ ์œ„์˜ ์ƒˆ๋กœ์šด ์œ„์ ฏ๊ตฐ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃย accessoryRectangular

7

์ƒˆ๋กœ์šด accessoryRectangular ๋Š” ๊ธฐ์กด์˜ ClockKit ์˜graphicRectangular ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ํ…์ŠคํŠธ์˜ ์—ฌ๋Ÿฌ๋ผ์ธ์ด๋‚˜ ์ž‘์€ ์ฐจํŠธ๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃย accessoryCircular

8

accessoryCircular ๋Š” ๊ฐ„๋‹จํ•œ ์ •๋ณด, progress view ์— ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ๋˜ํ•œ ClockKit ์˜ graphicCircular ๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃย accessoryInline

9

accessoryInline ๋Š” ํ…์ŠคํŠธ๋งŒ ๋˜๋Š” ์Šฌ๋กฏ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ํŽ˜์ด์Šค์™€ iOS ์‹œ๊ฐ„ ์œ„์— ๋ณด์—ฌ์ง‘๋‹ˆ๋‹ค.

์Šฌ๋กฏ ์‚ฌ์ด์ฆˆ๋Š” ๋‹ค์–‘ํ•œ ์‚ฌ์ด์ฆˆ๋กœ ์กด์žฌํ•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ตœ์„ ์œผ๋กœ ์ด์šฉํ• ์ง€๋Š” ๋’ค์—์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃย accessoryCorner

10

watchOS ๋ฅผ ํŠน์ •์ง“๋Š” ๊ฒƒ์€ ์ƒˆ๋กœ์šด accessoryCorner ์ž…๋‹ˆ๋‹ค. ์œ„์ ฏ ์ฝ˜ํ…์ธ ์˜ ์ž‘์€ ์›์„ ๊ฒŒ์ด์ง€ ๋ฐ ํ…์ŠคํŠธ์™€ ์„ž์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ์˜ ์ด์•ผ๊ธฐ๋Š” iOS ์™€ watchOS ์‚ฌ์ด์˜ ๊ณตํ†ต families ์— ์ดˆ์ ์„ ๋งž์ถ˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ƒˆ watchOS ์˜ ์ž์„ธํ•œ ์‚ฌํ•ญ์„ ๋” ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ํ•ด๋‹น ์„ธ์…˜์„ ์‹œ์ฒญํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

11

์ƒ‰์ƒ๊ณผ ๋ Œ๋”๋ง ๋ชจ๋“œ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•ด๋ด…์‹œ๋‹ค.

๐Ÿ”ฅย Colors

accessory widget ์ด ๋ช‡ ๊ฐ€์ง€ ๋‹ค์–‘ํ•œ ์™ธ๊ด€์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์„ ๋ˆˆ์น˜์ฑ˜์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

(์•ž์„œ iOS16 ์—์„œ ์ƒˆ๋กญ๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๋ฐ˜ํˆฌ๋ช… ์œ„์ ฏ๋“ค)

์‹œ์Šคํ…œ์€ accessory family widget ๋“ค์˜ ๋ชจ์Šต์„ ์ œ์–ดํ•˜๊ณ  ์šฐ๋ฆฌ๋“ค์€ rendering style ์— ์ ์‘ํ•˜๋Š” ๊ฑธ ๋„์™€์ค„ ๋„๊ตฌ๋ฅผ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์œ„์ ฏ์ด ๋ณด์—ฌ์กŒ์„ ๋•Œ ๋‹ค๋ฅธ ์„ธ ๊ฐ€์ง€ rendering mode set ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ Full color, accented, vibrant ์ž…๋‹ˆ๋‹ค.

12

WidgetRenderingMode ๋ฅผ ๋„์ž…ํ•ด ์„ธ ๊ฐ€์ง€ ๋‹ค๋ฅธ ํ‘œํ˜„์„ ํ•ฉ๋‹ˆ๋‹ค.

13

์•„๋ž˜์˜ ์‚ฌ์šฉ๋œ ์˜ˆ์‹œ๋ฅผ ๋ณด๊ฒŒ๋˜๋ฉด widgetRenderingMode keypath ๋ฅผ ํ™œ์šฉํ•˜์—ฌ Environment ์—์„œ ์ด ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ์ฝ”๋“œ์—์„œ ์ฝ˜ํ…์ธ ๊ฐ€ ์ ํ•ฉํ•ด ๋ณด์ด๋„๋ก switch ๋ฌธ์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃย Full color

14

watchOS ์˜ full color ๋ชจ๋“œ์—์„œ ์ฝ˜ํ…์ธ ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ์ง€์ •ํ•œ๋Œ€๋กœ ๋ณด์—ฌ์ง‘๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ ๋งŽ์€ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‚ ์”จ ๊ฒŒ์ด์ง€์˜ ๋ณ€ํ™”๋‚˜ activity ring ์˜ ์ƒ‰๊น”์ฒ˜๋Ÿผ ๋‹ค์ฑ„๋กœ์šด ์ƒ‰์„ ๋•๋‹ˆ๋‹ค.

2๏ธโƒฃย accented

15

accented ๋ชจ๋“œ์—์„œ๋Š” ๋…๋ฆฝ๋œ ์ƒ‰์˜ ๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋‰˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๊ทธ๋ฃน์€ ์ฐจ๋ถ„ํ•œ ์ƒ‰์œผ๋กœ ์›๋ž˜์˜ ๋ถˆํˆฌ๋ช…๋„๋งŒ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ์ด ์–ด๋–ป๊ฒŒ .widgetAccentable() view modifier ๋กœ view ๋ฅผ ๊ทธ๋ฃน์ง“๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜น์€ ์œ„์ ฏ ๋ Œ๋”๋ง ๋ชจ๋“œ environment ๊ฐ’์— ๊ทผ๊ฑฐํ•ด flattend ๋˜์—ˆ์„ ๋•Œ ์™„๋ฒฝํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ์ปจํ…์ธ ๋ฅผ ์ „ํ™˜ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

(๋งจ ์ขŒ์ธก์ด Accented)

16

์ผ๋ถ€๋Š” ๊ฒ€์ • ๋ฐฐ๊ฒฝ์ธ ๋ฐ˜๋ฉด์— ๋‹ค๋ฅธ ๊ฑด watchOS 9 ์—์„œ full color ๋ฐฐ๊ฒฝ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด watchOS 9 ์˜ ์ƒˆ๋กœ์šด ์ ์ž…๋‹ˆ๋‹ค.

Vibrant ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ์‹œ์ž‘ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

17

iOS ์˜ Vibrant ๋ชจ๋“œ์—์„œ๋Š” ์ปจํ…์ธ ๋Š” ํ๋ฆฟํ•ด์ง„ ๋‹ค์Œ Lock Screen ๋ฐฐ๊ฒฝ์— ๋งž๊ฒŒ ์ ์ ˆํ•œ ์ƒ‰์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ์€ greyscale ์˜ ์ปจํ…์ธ ๋ฅผ ์ฃผ๋ชฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ทธ๋ ค๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ Lock Screen ์€ vibrant rendering mode ๋ฅผ ์ƒ‰์ƒ์œผ๋กœ ๋ฌผ๋“ค์ด๋„๋ก ์„ค์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์€ ์ปฌ๋Ÿฌ๋Š” ๊ฒฐ๊ตญ ์ฃผ๋กœ ๋ถˆํˆฌ๋ช…ํ•ด์ง€๊ณ  ๋” ๋ฐ์•„์ง‘๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ์–ด๋‘์šด ์ปฌ๋Ÿฌ๋Š” ๋ฐฐ๊ฒฝ์—์„œ ์•ฝ๊ฐ„์˜ ๊ด‘ํƒ๋งŒ์œผ๋กœ ํ๋ฆฟํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

18

๊ฐ€๋…์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ Vibrant ๋ชจ๋“œ์—์„œ ํˆฌ๋ช… ์ปฌ๋Ÿฌ๋Š” ์‚ฌ์šฉ์„ ํ”ผํ•˜๊ณ  ๋Œ€์‹  ์–ด๋‘์šด์ƒ‰์ด๋‚˜ ๊ฒ€์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋…์„ฑ์€ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ˜ํ…์ธ ๋Š” ๋ˆˆ์— ๋œ ๋„๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด์ธ ์ผ๊ด€๋œ ๋ฐฐ๊ฒฝ์„ ์œ„์ ฏ์— ์ฃผ๊ธฐ ์œ„ํ•ด์„œ AccessoryWidgetBackground view ๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

19

background view ๋Š” ๋‹ค์–‘ํ•œ ์œ„์ ฏ ๋ Œ๋”๋ง ๋ชจ๋“œ์—์„œ ์—ฌ๋Ÿฌ ๋ชจ์Šต์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

โœ…ย Project setup

๊ธฐ์กด ์•ฑ์ธ Emoji Rangers ์— ์ƒˆ๋กœ์šด ์œ„์ ฏ ๊ทธ๋ฃน๊ตฐ์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

20

์œ„์™€ ๊ฐ™์ด Widget Extension target ์„ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(Emoji Rangers ๋Š” ์ด๋ฏธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ ์œ„์ ฏ๊ณผ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.)

21

Emoji Rangers ํ”„๋กœ์ ํŠธ๋Š” Emoji Rangers ๋ฅผ ์ถ”์ ํ•˜๊ณ , ํ™ˆ ํ™”๋ฉด ์œ„์ ฏ ์‚ฌ์šฉ์œผ๋กœ Ranger ์˜ ๊ฑด๊ฐ•๊ณผ ์žฌ์ถฉ์ „ ์‹œ๊ฐ„์˜ ์ตœ์‹  ์ •๋ณด๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

watch Extension target

๊ธฐ์กด iOS target(CharacterDetailExtension) ๊ณผ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ƒˆ๋กœ์šด watchOS target ์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

22

CharacterDetailExtension ์ธ widget extension target ์„ ๋ณต์‚ฌํ•˜์—ฌ ์ด๋ฆ„์„ ๋ฐ”๊พธ์—ˆ์Šต๋‹ˆ๋‹ค.

Bundle Identifier ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  Base SDK ๋„ ๋ณ€๊ฒฝํ•˜์—ฌ watch App ์„ ์œ„ํ•œ extension ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

23

WatchApp ์— ์ƒˆ๋กœ์šด extension(CharacterDetailExtension watch)์„ ์ž„๋ฒ ๋“œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

24

(์ด ๊ณผ์ •์€ ๊ธฐ์กด์— ๋งŒ๋“  iOS target ๊ณผ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

์ž, ์ด์ œ watchOS ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค.

25

EmojiRangerWidget ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด timeline provider ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์‹œ์Šคํ…œ์ด ์ฝ˜ํ…์ธ ๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ iOS ํ™ˆ ํ™”๋ฉด ์œ„์ ฏ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” small ๊ณผ medium family ์— ์ƒˆ ๊ทธ๋ฃน๊ตฐ์„ ์ถ”๊ฐ€ํ•  ๊ฒ๋‹ˆ๋‹ค.

26

accessory families ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ system families ๋Š” watch ์—์„œ๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์„œ supprtedFamilies ๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ”Œ๋žซํผ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

27

preview provider ์— ์ƒˆ families ๋ฅผ ์œ„ํ•œ preview ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ด…์‹œ๋‹ค.(๊ธธ์ด๊ฐ€ ๊ธธ์–ด ์ฝ”๋“œ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.)

EmojiRangerWidgetEntryView(entry: SimpleEntry(date: Date(), relevance: nil, character: .spouty))
                .previewContext(WidgetPreviewContext(family: .accessoryCircular))
                .previewDisplayName("Circular")
EmojiRangerWidgetEntryView(entry: SimpleEntry(date: Date(), relevance: nil, character: .spouty))
                .previewContext(WidgetPreviewContext(family: .accessoryRectangular))
                .previewDisplayName("Rectangular")
EmojiRangerWidgetEntryView(entry: SimpleEntry(date: Date(), relevance: nil, character: .spouty))
                .previewContext(WidgetPreviewContext(family: .accessoryInline))
                .previewDisplayName("Inline")

#if os(iOS)

// ...

#endif

๋‹ค์Œ์œผ๋กœ watchOS ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋นŒ๋“œํ•˜๊ธฐ ์ „์— ์ƒˆ๋กœ์šด intentRecommendation API ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Intent ๊ฐ€ iOS ์˜ ์œ„์ ฏ ํŽธ์ง‘ UI ์—์„œ configurable ํ•  ๋•Œ watchOS ์—์„œ๋Š” preconfigured list ๋ฅผ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” IntentTimelineProvider ์—์„œ ์ƒˆ๋กœ์šด recommendations ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ฅย recommendations

[Apple Developer Documentation - recommendations](https://developer.apple.com/documentation/widgetkit/intenttimelineprovider/recommendations()-5ltr5)

(intent ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์œ„์ ฏ์„ ๊พน ๋ˆŒ๋Ÿฌ ์œ„์ ฏ ํŽธ์ง‘์„ ํ†ตํ•ด ์ œ๊ณตํ•˜๋Š” ์˜ต์…˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, configurable widget ์ด๋ผ๋Š” ์ด์•ผ๊ธฐ ์ž…๋‹ˆ๋‹ค. widget ์—์„œ๋Š” configurable ํ•˜๋„๋ก intent ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด, watchOS ์—์„œ๋Š” preconfigured list ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋Š” IntentTimelineProvider ์˜ ์ƒˆ๋กœ์šด recommendations ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  preconfigured list ๋Š” ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ์ž์™€ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ์œ„ํ•œ ๋ชฉ์ ์ด๊ณ  ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชฉ๋ก์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ถ”์ฒœ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์• ํ”Œ์›Œ์น˜์—์„œ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํŽธ์ง‘ํ•  ๋•Œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ถ”์ฒœ๋˜๋Š” preconfigured complications ์„ ๋งŒ๋“œ๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค.)

28

Apple Developer Documentation - Making a Configurable Widget

์ด ๋ฌธ์„œ์—๋Š” configuable ํ•œ widget ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , watch ์— preconfigured ํ•œ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


29

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

30

preview ์˜ widget ์„ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

31

small widget ์— ๋Œ€ํ•œ ์ปจํ…์ธ ๊ฐ€ ์ƒˆ ํผํŒฉํ„ฐ(accessoryCircular) ์•ˆ์— ์ž˜ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด widget families ๋Š” iOS widgets ๋ณด๋‹ค ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๋ถ„์˜ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ธ ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž, ์ด์ œ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ˆˆ์— ๋„๊ฒŒ ํ•  ์ƒˆ๋กœ์šด view ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ ํ•ด๋ด…์‹œ๋‹ค.

โœ…ย Making glanceable views

1๏ธโƒฃย accessoryCircular

zaccessoryCircular case ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋„ ์ถ”๊ฐ€ํ•ด ๋ด…์‹œ๋‹ค.

32

์ด progressView ๋Š” Ranger ๊ฐ€ ๋‹ค์‹œ ์ „ํˆฌ ์ค€๋น„๊ฐ€ ๋˜๋Š”์ง€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ์—ญํ• ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์ด progress view ๊ฐ€ ํ†ต์šฉ๋˜๋„๋ก ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ๋‹ฌ์•„ timeline entries ๋ฅผ ๋งŽ์ด ์š”๊ตฌํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค.

(widget ์ด ์–ธ์ œ ์‹คํ–‰๋˜์–ด ์ •๋ณด๋ฅผ ์ตœ์‹ ํ™”ํ• ์ง€ timeline ์„ ์•Œ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— timeline entry ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.)

๋Œ€์‹ ! ์šฐ๋ฆฌ๋Š” SwiftUI ์˜ ์ƒˆ๋กœ์šด ์ž๋™ ์—…๋ฐ์ดํŠธ ProgressView ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ Ranger ๊ฐ€ ์™„์ „ํžˆ ํšŒ๋ณต๋  ๋‚ ์งœ ๊ฐ„๊ฒฉ์„ ๊ฐ€์ง€๊ณ , ์ด๊ฒƒ์€ ์‹œ์Šคํ…œ์ด progress view ์˜ ์—…๋ฐ์ดํŠธ ์œ ์ง€๋ฅผ timeline entry ๋‹จ ํ•˜๋‚˜๋งŒ ํ•„์š”ํ•˜๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

33

2๏ธโƒฃย accessoryRectangular

์ด์ œ Retangluar family ๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„, Ractangular preview ๋ฅผ ์„ ํƒํ•ด๋ด…์‹œ๋‹ค.

35

๊ณต๊ฐ„์ด ์žˆ์œผ๋‹ˆ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํƒ€์ผ์˜ ์„ธ ์ค„ view ๋ฅผ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค. ์บ๋ฆญํ„ฐ ์ด๋ฆ„, ๋ ˆ๋ฒจ, ์™„์ „ํžˆ ์น˜์œ ๋  ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„์œผ๋กœ ๊ตฌ์„ฑํ•  ๊ฒƒ์ด๊ณ , ์บ๋ฆญํ„ฐ ์ด๋ฆ„์€ ํ—ค๋“œ๋ผ์ธ ์„œ์ฒด์™€ ์ƒ‰์ƒ์„ ์กฐ์ •ํ•˜๋Š” widgetAccentable modifier ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

36

vibrant ์—์„œ๋Š” view ๊ฐ€ ๊ทผ์‚ฌํ•ด ๋ณด์ด๋Š”๋ฐ watch ์˜ ๋‹ค๋ฅธ ๋ Œ๋”๋ง ๋ชจ๋“œ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค.

37

์บ๋ฆญํ„ฐ ์ด๋ฆ„์ด accent color ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ€์ง€๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. widgets ๊ณผ complications ๋ฅผ ํŽธ์•ˆํ•˜๊ฒŒ ๋Š๋ผ๊ฒŒ ๋งŒ๋“ค๊ณ  default font parameter ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  font styles ๋ฅผ ์‚ฌ์šฉ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

38

iOS ์™€ watchOS ๋Š” ์„œ์ฒด์™€ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. iOS ๋Š” regular ๋””์ž์ธ์ด๊ณ , watchOS ๋Š” rounded ๋””์ž์ธ์ž…๋‹ˆ๋‹ค. ์œ„์ ฏ๊ณผ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค๊ณผ ๊ฐ€๊นŒ์ด ์Šคํฌ๋ฆฐ์— ์ž๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ผ๊ด€๋˜๊ฒŒ ๋ณด์ด๋Š” font styles Title, Headline, Body, Caption ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

39

Avatar ๋ฅผ ๋‚จ์€ ๊ณต๊ฐ„์— ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. iPhone ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค.

40

์ข‹์Šต๋‹ˆ๋‹ค! ๋งˆ์ง€๋ง‰์œผ๋กœ ํ…์ŠคํŠธ ๋ผ์ธ๊ณผ ์„ ํƒ์ ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” accessoryInline ์„ ์ถ”๊ฐ€ํ•ด ๋ด…์‹œ๋‹ค.

3๏ธโƒฃย accessoryInline

system-defined coloring ๊ณผ font ์— ๋”ฐ๋ผ ๊ทธ๋ ค์กŒ๋‹ค๋Š” ๊ฒƒ์— ์ฃผ๋ชฉํ•ด ๋ด…์‹œ๋‹ค.

41

์œ„์˜ ์ฝ”๋“œ์—์„œ ํžˆ์–ด๋กœ ์ด๋ฆ„๊ณผ ์žฌ์ถฉ์ „ ์นด์šดํŠธ๋‹ค์šด์„ ๋ณด์—ฌ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด ํ…์ŠคํŠธ๋Š” watch ์Šฌ๋กฏ์—์„œ ๋„ˆ๋ฌด ๊น๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋“ค๊ป˜ VeiwThatFits ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆด ๋•Œ์ž…๋‹ˆ๋‹ค.

๊ธธ์ด๋ฅผ ์ถ•์•ฝํ•ด์„œ ์—ฌ๋Ÿฌ view ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๊ณ , ViewThatFits ๋Š” ๋Š๊ฑฐ๋‚˜ ์ž˜๋ผ๋‚ด๊ธฐ ์—†์ด ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์— ๋งž์ถฐ์„œ ์ฒ˜์Œ ์ฝ˜ํ…์ธ  view ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

42

๋„ˆ๋ฌด ๊ธธ์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋„ค์š”. ์„ธ๋ฒˆ์งธ ๋Œ€์•ˆ์„ ์ ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

43

์ด๋ ‡๊ฒŒ ์•„๋ฐ”ํƒ€์™€ ์žฌ์ถฉ์ „ ์นด์šดํŠธ๋‹ค์šด์„ ํ†ตํ•ด ๋ณด์—ฌ์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

(๋” ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด Compose Custom layouts with SwiftUI ์„ธ์…˜์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.)

โœ…ย Privacy

์ง€๊ธˆ๊นŒ์ง€ ์œ„์ ฏ๊ณผ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™œ์„ฑํ™” ์ƒํƒœ๋ฅผ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ํ”Œ๋žซํผ์„ ๋„˜์–ด์„œ ์ฝ˜ํ…์ธ ๋ฅผ ํŽธ์ง‘ ์ค‘์ด๊ฑฐ๋‚˜ ๋ฐ๊ธฐ๊ฐ€ ์–ด๋‘์šด์ง€๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

44

iOS Lock Screen ์—์„œ ๊ธฐ๋ณธ ํ–‰๋™์€ ๊ธฐ๊ธฐ๊ฐ€ ์ž ๊ฒจ์žˆ๋Š” ๋™์•ˆ์—๋„ ์…€ ์™ผ์ชฝ ์ƒ๋‹จ์˜ ์ฝ˜ํ…์ธ (ํ•˜์ด๋ผ์ดํŠธ๋œ ์…€)๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒ๋‹ˆ๋‹ค.

45

์ด๊ฒƒ์€ Settings ์—์„œ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์‚ฌ์šฉ์ž๋“ค์€ ์•Œ๋ฆผ์ฒ˜๋Ÿผ ์ž ๊ธด ์ƒํƒœ์—์„œ๋„ ๋ฏผ๊ฐํ•œ ๋‚ด์šฉ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

46

watchOS ์—์„œ๋Š” watch ๋ฅผ ์ฐจ๊ณ  ์žˆ๋Š” ํ•œ ๊ธฐ๊ธฐ๊ฐ€ ์ž ๊ธˆ ํ•ด์ œ๋œ ์ƒํƒœ๋กœ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑํ™”์ผ ๋•Œ watch ๋Š” ์–ด๋‘์šด ๋ฐ๊ธฐ ํ‘œํ˜„์˜ ์ฝ˜ํ…์ธ ์™€ ๋‚ฎ์€ ์—…๋ฐ์ดํŠธ ์ผ€์ด๋˜์Šค๋กœ always-on ์œผ๋กœ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝ˜ํ…์ธ ๋Š” ์ œ์ผ ํ•˜๋‹จ ์™ผ์ชฝ์˜ ์ƒํƒœ๋กœ ์‚ญ์ œ์™€ ๊ฐ™์€ ์ˆ˜์ •์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

47

์ž ๊ธˆ ํ™”๋ฉด์—์„œ์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž๋“ค์ด always-on ์ƒํƒœ์—์„œ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ˜ํ…์ธ ๊ฐ€ ์‚ญ์ œ๋˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ๊ณ ๋ คํ•ด ์—ฌ๋Ÿฌ๋ถ„์˜ ์ปดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์œ„์ ฏ์ด ์ž˜ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

48

watch ์—์„œ๋Š” ์œ„์ ฏ์€ always-on ๋””์Šคํ”Œ๋ ˆ์ด ๊ฒฝํ—˜์„ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. \.isLuminanceReduced environment ๊ฐ’์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ๋Š˜ always-on ์ƒํƒœ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ClockKit ์—์„œ ๋ชจ๋“  timeline entry ์— always-on ์ฝ˜ํ…์ธ ๋ฅผ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

49

always-on ์—์„œ ์‹œ๊ฐ„ ๊ด€๋ จ ํ…์ŠคํŠธ์™€ progress view ๊ฐ€ always-on ์˜ ๋‚ฎ์€ ์—…๋ฐ์ดํŠธ ์ผ€์ด๋˜์Šค๋ฅผ ์ง€์›ํ•˜๋ ค๊ณ  ๊ฐ์†Œํ•œ fidelity mode(์ •ํ™•๋„ ๋ชจ๋“œ)๋กœ ๋ฐ”๋€” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด environment ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„์— ๋ฏผ๊ฐํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ญ์ œํ•˜๊ณ , ์—…๋ฐ์ดํŠธ ๋นˆ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ์ฝ˜ํ…์ธ  ์ตœ์ ํ™”ํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

50

redaction(๋ฏผ๊ฐํ•œ ์‚ฌํ•ญ ํŽธ์ง‘)์— ๊ด€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณผ๊ฒŒ์š”. ๊ธฐ๋ณธ์ ์œผ๋กœ privacy mode ๋Š” TimelineProvider ๊ฐ€ ์ƒ์„ฑํ•˜๋Š” placeholde view ์˜ redaction ๋ฒ„์ „์„ ๋ณด์—ฌ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ถ€ element ๊ฐ€ ๋ฏผ๊ฐํ•˜๊ณ  ๋‹ค๋ฅธ element ๋Š” redacted ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด redacted view ๋งŒ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด .privacySensitive modifier ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์‹œ์—์„œ ์œ„์ ฏ์˜ heart rate ๋ฅผ redact ํ–ˆ์ง€๋งŒ ์ด๋ฏธ์ง€๋Š” unredact ๋œ ์ฑ„๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค.

51

SwiftUI ์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋” ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์„ธ์…˜์„ ์‹œ์ฒญํ•ด์ฃผ์„ธ์š”.

52