View in English

  • 메뉴 열기 메뉴 닫기
  • Apple Developer
검색
검색 닫기
  • Apple Developer
  • 뉴스
  • 둘러보기
  • 디자인
  • 개발
  • 배포
  • 지원
  • 계정
페이지에서만 검색

빠른 링크

5 빠른 링크

비디오

메뉴 열기 메뉴 닫기
  • 컬렉션
  • 주제
  • 전체 비디오
  • 소개

더 많은 비디오

스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.

  • 소개
  • 요약
  • 자막 전문
  • 코드
  • watchOS 26의 새로운 기능

    watchOS 26의 새로운 기능을 확인하고 이러한 기능을 watchOS 및 iOS 앱에 통합하는 방법을 알아보세요. ARM64 아키텍처를 살펴보고 새로운 디자인 시스템에 대해 자세히 알아보세요. 또한 위젯 업데이트 내용과 Apple Watch 제어 방법에 대한 인사이트도 공유합니다.

    챕터

    • 0:00 - Introduction
    • 0:56 - Update for watchOS 26
    • 3:48 - Bring apps to new places
    • 9:44 - Be relevant and up-to-date

    리소스

    • Creating controls to perform actions across the system
    • Increasing the visibility of widgets in Smart Stacks
    • Making a configurable widget
    • MapKit
    • Migrating ClockKit complications to WidgetKit
    • Workouts and activity rings
      • HD 비디오
      • SD 비디오

    관련 비디오

    WWDC25

    • 위젯의 새로운 기능
    • Icon Composer로 아이콘 생성하기
    • Liquid Glass 만나보기

    WWDC24

    • 시스템 전반에서 앱의 제어 기능 확장하기

    WWDC23

    • SwiftUI용 MapKit 알아보기

    WWDC22

    • WidgetKit로 멋진 컴플리케이션 만들기
  • 비디오 검색…

    안녕하세요, 반갑습니다 저는 Anne이고 오늘 새롭고 멋진 기능을 공유하게 되어 정말 기쁩니다 watchOS 26의 새로운 기능과 앱에서 사용하는 방법을 알아보죠 watchOS 26의 개선점을 소개하고 watchOS와 iOS 앱을 Apple Watch로 확장하는 방법을 보여주며 적절한 타이밍에 관련된 콘텐츠를 앱에 보여줄 새 방식을 공유합니다 그 과정에서 앱을 하나 만들어 볼텐데요 건강 상태와 근처 해변의 여가 활동을 보여주고 바다 정보를 표시하고 마음챙기기 시간을 쉽게 추적하죠 꼭 해변이 아니어도 되지만 저는 해변으로 할게요 바로 시작해 보죠 watchOS 26은 하나부터 열까지 모든 기능을 개선했죠 새 시스템 아키텍처에 새로운 디자인도 도입했습니다 앱이 watchOS를 가장 잘 활용하도록 몇 가지 사항도 알려드립니다 watchOS는 새 디자인 시스템으로 OS 전반에 걸쳐 업데이트 됐죠 재료 및 제어 기능이 바뀌었고 앱 아이콘도 업데이트 되었으며 시계 페이스나 제어 센터와 같은 시스템 공간도 달라졌습니다 도구 막대와 제어 기능 디자인이 watchOS 26에서 업데이트되었죠 watchOS 10 또는 이후 버전 앱에는 전부 새 디자인이 자동 적용됩니다 덕분에 나머지 시스템과 일관되게 느껴지죠 앱을 실행하여 인터페이스 디자인을 확인하세요 맞춤형 디자인이 있다면 UI 요소가 새 시스템 디자인에 부합하는지 확인하세요 앱 디자인과 개선점에 대한 자세한 내용을 알아보려면 'Liquid Glass 만나보기'를 시청하세요

    iOS 및 watchOS 26에서 앱 아이콘도 새롭게 바뀌었습니다

    Icon Composer를 이용해 앱 아이콘을 업데이트하세요 업데이트된 iOS 앱 아이콘은 iPhone에서 Apple Watch로 보낸 알림에 나타납니다 업데이트 된 Watch 앱 아이콘도 격자 보기와 목록 보기에 표시됩니다 그리고 알림은 바로 Apple Watch로 전송됩니다 Icon Composer에 대해 자세히 알아보고 앱 아이콘의 새로운 기능을 전부 확인하려면 'Icon Composer로 아이콘 생성하기'를 확인하세요 새 디자인 시스템이 끝이 아닙니다 watchOS는 새로운 시스템 아키텍처도 지원하죠 Apple Watch Series 9 또는 이후 모델과 Apple Watch Ultra 2는 watchOS 26에서 이제 arm64 아키텍처를 사용하죠 Xcode에서 Apple Watch 타겟을 빌드할 때 표준 아키텍처 빌드 설정을 사용해서 모든 Apple Watch 아키텍처에 대해 빌드되도록 구성하세요 arm64의 유형 차이에 유의해야 합니다 특히 Float 및 Int를 사용하거나 포인터 연산을 할 때 유의하세요 시뮬레이터와 기기 모두에서 테스트하는 것도 잊지 마세요 Xcode는 arm64 아키텍처용 Apple Watch 앱 빌드를 Xcode 14부터 지원해왔습니다 Apple Silicon에서 Apple Watch Simulator는 항상 arm64 아키텍처를 사용합니다 그리고 좋은 소식입니다 표준 아키텍처로 빌드한 경우에는 이미 arm64용으로 빌드한 겁니다 시뮬레이터로 테스트를 진행했다면 이미 arm64을 테스트한 거죠 새 디자인 시스템과 완전히 새로운 아키텍처는 watchOS 26으로 가는 여정의 시작일 뿐입니다 이제 앱을 확장할 수 있는 새로운 환경을 알아보죠 watchOS 26부터 Apple Watch에서 제어 기능을 사용할 수 있습니다 제어 센터나 스마트 스택에 제어 기능을 배치하고 Apple Watch Ultra의 동작 버튼으로 사용할 수 있죠 WidgetKit으로 제어 기능을 빌드하고 앱을 열거나 특정 뷰에서 앱을 실행하지 않고도 빠른 동작이 가능하도록 해보세요 제어 기능은 시스템에 기호 이름, 색조 색상과 추가적인 맥락을 제공합니다 지원되는 시스템 공간에 제어 기능을 추가할 수 있으며 제어 기능은 맥락에 맞게 표시됩니다

    Apple Watch 시스템 공간에 iPhone 앱으로 제어 기능을 추가하세요 Watch 앱이 없어도 상관 없죠 Apple Watch에서 제어 기능을 탭하면 연결된 iPhone에서 동작이 수행됩니다 동작이 iPhone에서 수행되므로 iPhone에서 실행 중인 앱은 Apple Watch에 표시되지 않습니다 Watch 앱이 있다면 iOS 제어 기능 빌드와 동일한 API를 사용하여 Apple Watch 제어 기능을 구축할 수도 있습니다 제어 기능을 탭해 Apple Watch에서 동작을 수행하세요

    SmartStack은 이제 제어 기능과 위젯, 실시간 현황을 지원합니다 스마트 스택에 콘텐츠를 표시할 방법은 너무 많아서 하나만 고르기 어렵습니다 주요 목적을 고려하면 도움이 되죠 주요 목적이 앱에서 설정을 바꾸거나 인터넷에 연결된 기기를 켜는 등 동작의 수행인 경우에는 제어 기능을 빌드합니다 위젯을 만들어 날씨 정보나 다가오는 이벤트 등 오늘의 정보를 표시해보세요 스포츠 경기나 비행 스케줄처럼 시작과 끝이 명확한 이벤트를 위해 실시간 현황을 구축해보세요 제어 기능과 더 자세한 내용을 알아보려면 Cliff와 함께 '시스템 전반으로 앱의 제어 기능 확장하기' 세션에 참여하세요 앱에서 맞춤형 위젯과 제어 기능을 사용하고 싶다면 사용자는 iOS의 시스템 제공 구성 중에 선택해 위젯을 편집할 수 있습니다 watchOS 26부터는 위젯과 제어 기능을 같은 방식으로 사용자화 할 수 있습니다 미리 구성된 추천 위젯 외에도 위젯이 구성 가능하다는 것을 표시할 수 있죠 이제, 제 위젯의 구성을 바꿔서 아멜리아 아일랜드 캘린더를 볼게요 위젯을 구성할 수 있도록 하려면 빈 배열을 반환하여 미리 구성된 위젯이 없다는 걸 보여주고 사용자가 위젯을 시계 페이스나 스마트 스택에서 구성할 수 있다는 걸 알려주세요 기존 위젯을 구성 가능하게 바꾸고 싶다면 watchOS 26 사용 가능성 검사를 추가하세요 빈 배열을 반환하여 지원되는 버전에서 위젯 구성이 가능한 지 표시하세요 이전 버전이라면 앱 인텐트 추천 위젯 배열을 반환하면 됩니다 제어 기능도 구성이 가능합니다 예를 들어, 나의 해변 앱의 명상 타이머 제어 기능에 추가 구성을 제공해볼게요 항상 바다에 갈 수 있는 건 아니니 명상하는 동안 앱에서 바다 소리가 재생되는 옵션을 추가하려 합니다 제어 기능을 구성 가능하게 하려면 AppIntentControlConfiguration로 iOS에서 하는 것처럼 제어 기능을 설명하고 AppIntentControlValueProvider를 값 제공자가 따르도록 합니다 watchOS 26의 스마트 스택에 제어 기능만 가져오는 게 아닙니다 Watch 앱이 HealthKit으로 운동을 기록한다면 사용자 루틴에 따라 스마트 스택에 앱이 제안될 수 있습니다 그럼 탭 한 번으로 운동을 빠르게 시작할 수 있죠

    운동 앱이 적절하게 제안되는지 확인하기 위해서 알맞은 HKWorkoutActivityType를 지정하고 정확한 시작 시간과 끝 시간을 기록하며 HKWorkoutRouteBuilder를 사용해 운동하는 동안 위치 데이터를 추가합니다 앱을 더 넓은 환경으로 확장한다고 했었는데요 WatchOS 26의 MapKit에서 쓸 수 있는 새 기능이 많습니다 식료품점 같은 근처의 관심 지점을 검색하여 자동차, 도보, 자전거 등 다양한 이동 수단에 따른 경로를 확인하고 SwiftUI로 지도 위에 경로를 오버레이하는데요 iOS에서 많이 사용해 익숙할 API를 사용합니다 주변 장소를 찾고 경로를 보여주는 독립형 Watch 앱에 사용하기 좋습니다 지금 보여드리는 건 제 단골 해변으로 가는 경로입니다 경로와 주변 검색에 대해 더 알아보려면 Jeff의 'SwiftUI용 MapKit 알아보기’ 세션에 참여하세요 맞춤형 제어 기능과 제어 센터 사이에서 시계 페이스의 운동 앱 제안과 새 MapKit 기능 등 watchOS 26은 당신의 경험을 시스템의 새로운 환경으로 확장할 다양한 방법을 소개하죠

    watchOS 26의 또 다른 기능인 스마트 스택에서 맥락에 맞고 관련된 경험을 생성하는 새로운 방법도 알려드립니다 사용자가 원하는 정보와 동작을 적시에 보여주고 정보를 최신으로 유지할 수 있죠 watchOS 26의 새로운 프레임워크인 RelevanceKit을 소개합니다 RelevanceKit은 사용자가 원할 때 콘텐츠를 표시합니다

    RelevanceKit에는 다양한 관련 맥락 유형이 있어 맥락 큐를 기반해 스마트 스택에 위젯을 제안하도록 해 줍니다 관련된 맥락은 날짜와 사용자가 지정한 수면 시간 피트니스 정보, 장소를 포함합니다 watchOS 26에서 위젯은 관심 지점 카테고리와 관련돼 위젯이 식료품점, 카페 심지어는 해변과 같은 다양한 유형의 장소와 관련되었는지 보여줍니다 나의 해변 앱을 이용해 실제로 해변에 갔을 때 현재 바다 정보가 스마트 스택 나타나게 할게요 MapKit 관심 지점 카테고리의 location RelevantContext를 만듭니다 카테고리가 지원되지 않으면 nil을 반환합니다 WidgetRelevance와 모든 관련된 맥락 유형의 속성에 대해 알아보세요 RelevanceKit 외에도 watchOS 26에는 스마트 스택에만 제공되는 새 위젯 구성이 있습니다 새 관련 위젯은 RelevanceKit으로 구동되며 당신의 위젯에 어떤 뷰가 나타나야 할 지 고릅니다 뷰는 관심 지점이나 시간대 등 특정 RelevantContext를 바탕으로 제안됩니다 관련 위젯은 스마트 스택에만 표시되며 동시에 다중 보기도 지원할 수 있습니다 관련 위젯은 watchOS 26에서 멋진 기능을 보여줍니다 겹치는 캘린더 이벤트를 보여주거나 마지막 수정 메모를 빠르게 실행하도록 위젯을 표시하거나 다음 휴가지의 일기 예보를 보여줄 수 있죠 나의 해변 이벤트 위젯은 당일에 해당 장소에서 예정된 활동을 보여줍니다 관련 위젯으로 더 발전시켜 볼게요 나의 해변 이벤트 위젯을 위한 샘플 캘린더입니다 이 중 몇 개의 이벤트는 동시에 진행됩니다 기존의 타임라인 위젯을 만들려면 항목의 단일 타임라인을 생성해야 하는데 지금 이벤트가 겹칩니다 그래서 다중 이벤트가 있는 항목이 타임라인에 포함돼 겹치는 시간을 표시합니다 제 이벤트 캘린더와 타임라인의 9시 30분 항목을 보면 괜찮습니다 모금 행사와 명상 두 가지를 하나의 보기에 두 줄로 표시했습니다 하지만 10시에는 이벤트가 세 개입니다 위젯에 세 가지 이벤트를 모두 넣으려고 하면 글자가 잘립니다 표시할 이벤트를 두 개만 골라야 하죠 관련 위젯이 이 문제를 해결합니다 예시의 10시처럼 관련된 이벤트가 여러 개일 때 시스템이 스마트 스택에서 각 이벤트에 대한 여러 개의 카드를 제안합니다 해변 이벤트용 관련 위젯을 만드는 법을 살펴보죠 먼저 위젯 구조를 빠르게 요약해 보겠습니다 위젯의 기본 구성 요소는 항목입니다 항목에는 위젯의 뷰를 렌더링할 때 필요한 모든 데이터가 포함되죠 항목은 항목 제공자에 의해 생성되며 WidgetKit에 위젯 디스플레이를 언제 업데이트해야 할 지 알려주죠 구성은 항목 제공자를 생성하고 항목과 다른 정보를 이용해 SwiftUI 뷰를 제공합니다 타임라인을 바탕으로 위젯을 생성할 때는 이 유형을 TimelineEntry AppIntentTimelineProvider AppIntentConfiguration이라 부르죠 관련 위젯을 만드는 것은 타임라인 위젯과 비슷합니다 관련 위젯의 기본 구성 요소는 RelevanceEntry입니다

    RelevanceEntriesProvider로 생성해 RelevanceConfiguration으로 공급합니다 관련 위젯을 빌드하는 방법을 차근차근 알아보죠 RelevanceEntry부터 시작합니다 저는 나의 해변 앱에서 RelevanceEntry를 생성할 겁니다 필요한 데이터가 전부 들어간 해변 이벤트를 포함하죠 위젯의 뷰를 이벤트 장소와 제목, 날짜로 채운 다음 RelevanceEntriesProvider를 적용합니다 관련성 메서드는 위젯이 관련된 시점에 시스템에 알려줍니다 WidgetRelevanceAttributes의 배열을 여기서 생성해서 해변 이벤트에 대한 WidgetConfigurationIntents를 정보가 중요해지는 시점에 대한 큐를 기반으로 RelevantContext와 연결합니다 이건 해변에서 일어나는 행사의 날짜입니다 이제 이 속성과의 관련성을 반환해보죠 위젯이 관련 있으면 시스템은 항목을 불러오고 WidgetConfigurationIntent를 앱에 제공해 디스플레이 크기나 위젯이 미리보기로 표시되는지 여부 등의 맥락 정보와 관련 있는지를 보여줍니다 미리보기는 위젯 제안 설정에 표시됩니다 스마트 스택 편집 시 사용하거나 설정 앱에서 사용 가능하죠 설정 보기를 채울 데이터가 포함된 미리보기 항목을 반환합니다 플라야린다 서핑 이벤트처럼 위젯을 미리볼 수 있습니다 아니면 나의 해변 이벤트같은 구성 정보를 사용해 위젯의 뷰를 채울 항목을 생성할 수 있죠 위젯이 로딩 중이라 아직 데이터가 채워지지 않았다면 시스템은 공급자에게 자리 표시자 항목을 요청합니다 예를 들어 새로운 데이터를 다운로드해 위젯을 채워야 한다면 입력 메서드가 즉시 반환되지 않을 수 있습니다 자리 표시자 항목을 반환해서 정보의 상태를 만료 혹은 로딩 중으로 표시하세요 저는 위젯에서 뷰에 로딩 표시기를 보여줄 항목을 반환할 겁니다 마지막으로 위젯을 만듭니다 위젯 본문에서 공급자와 클로저를 이용해 현재 RelevanceEntry를 기반으로 위젯의 뷰를 생성하여 RelevanceConfiguration을 반환합니다 이제 예정된 이벤트가 여럿일 때 스마트 스택이 해변 이벤트를 위한 다수의 카드를 제안합니다 제 앱에는 여전히 해변 이벤트를 보여주는 타임라인 위젯이 있고 SmartStack에 추가할 수 있죠 다른 사용자가 제 타임라인 위젯을 스마트 스택에 추가하면 시스템은 같은 이벤트에 대한 두 개의 카드를 표시합니다 하나는 사용자가 추가한 타임라인 위젯 카드고 다른 하나는 관련 위젯이 제안한 카드입니다 중복 생성을 막으려면 타임라인 위젯을 위해 RelevanceConfiguration과 WidgetConfiguration을 연결합니다 시스템은 타임라인 위젯을 제안되는 관련 위젯 카드로 대체하게 됩니다 그럼 각 이벤트에 대해 하나의 카드만 표시하게 되죠 위젯을 연결하려면 RelevanceConfiguration에 associatedKind 수정자를 추가하고 타임라인 위젯 종류를 전달하세요 지금까지 관련 위젯 구축 방법을 알아봤습니다 위젯을 멋지게 만들 또 다른 팁인 미리보기 사용법도 알아보죠 미리보기를 사용하면 관련 조건을 시뮬레이션 하지 않고도 관련 위젯이 스마트스택에 어떻게 표시될지 시각화할 수 있죠 다양한 사용 사례에서 위젯을 미리 볼 수 있는 세 가지 방법을 빠르게 안내해 드릴게요 위젯의 보기를 개발하는 동안 relevanceEntries를 포함한 미리보기로 빠르게 확인하고 위젯 뷰 디자인을 미세조정해 모든 디스플레이 크기에 맞추세요 두 개의 이벤트를 이용해서 텍스트 양이 다른 뷰의 레이아웃을 확인해보겠습니다 입력 메서드를 개발하는 동안 특정 WidgetConfigurationIntents를 포함한 미리보기를 사용해 빠르게 항목 생성을 확인하세요 여기서 몇 가지 샘플 구성의 연관성을 만들고 해당 항목과 보기가 올바르게 생성되었는지 확인하겠습니다

    RelevanceProvider 포함 미리보기로 관련 위젯을 최종 확인하죠 미리보기에 표시하기 위해 다섯 개의 이벤트와 함께 이벤트 스토어 미리보기를 제공해 각각의 이벤트가 화면 사이즈에 잘 맞게 표시되는지 확인합니다 중요한 정보를 적시에 보여준다는 건 정말 멋진 일이 아닐 수 없죠 물론 그 정보도 최신 상태여야 합니다 위젯 데이터를 최신 상태로 유지할 다른 도구도 소개하겠습니다 watchOS 26부터는 APNS로 위젯에 푸시 업데이트를 보낼 수 있습니다 모든 위젯이 위젯 푸시 업데이트를 지원합니다 WidgetKit을 지원하는 모든 Apple 플랫폼에요 위젯에 푸시 업데이트 지원을 추가하는 방법을 알아보려면 Tanner의 '위젯의 새로운 기능' 세션을 확인하세요 컴플리케이션 푸시 업데이트 때문에 ClockKit 컴플리케이션을 위젯으로 마이그레이션하지 않았다면 지금 해보세요 August와 함께 더 부드럽게 전환하는 팁을 알아보려면 'WidgetKit로 멋진 컴플리케이션 만들기'를 확인하세요 watchOS의 모든 새로운 기능을 전부 즐겨보세요 watchOS 26에서 앱을 빌드, 실행해 나머지 시스템과 조화를 이루고 arm64 아키텍처에서 완벽하게 실행되게 만드세요 특히 독립형 Watch 앱이 있다면 Apple Watch에서 iOS 제어 기능으로 Watch 앱에 제어 기능을 추가하세요 당신의 앱에 맞는 관련 위젯을 빌드하세요 그리고 푸시 알림을 사용해 위젯을 최신 상태로 유지하세요 매일매일 Apple Watch에서 당신의 앱을 사용하고 싶습니다 산책하거나 여행할 때 해변에 갈 때도요 당신의 앱과 함께 새로운 곳을 탐험할 수 있기를 기대합니다

    • 6:53 - Make a widget configurable

      // In the AppIntentTimelineProvider
      func recommendations() -> [AppIntentRecommendation<BeachConfigurationIntent>] {
        return []
      }
    • 7:06 - Support earlier versions of watchOS with a configurable widget

      // In the AppIntentTimelineProvider
      func recommendations() -> [AppIntentRecommendation<BeachConfigurationIntent>] {
        if #available(watchOS 26, *) {
          // Return an empty array to allow configuration of the widget in watchOS 12+
          return []
        } else {
          // Return array of recommendations for preconfigured widgets before watchOS 12
          return recommendedBeaches
        }
      }
    • 7:46 - Use AppIntentControlConfiguration to make a control configurable

      struct ConfigurableMeditationControl: ControlWidget {
        var body: some ControlWidgetConfiguration {
          AppIntentControlConfiguration(
            kind: WidgetKinds.configurableMeditationControl,
            provider: Provider()
          ) { value in
            // Provide the control's content
          }
          .displayName("Ocean Meditation")
          .description("Meditation with optional ocean sounds.")
          .promptsForUserConfiguration()
        }
      }
    • 7:56 - Use AppIntentControlValueProvider for a configurable control

      extension ConfigurableMeditationControl {
        struct Provider: AppIntentControlValueProvider {
          func previewValue(configuration: TimerConfiguration) -> Value {
            // Return the value to show in the add sheet
          }
      
          func currentValue(configuration: TimerConfiguration) async throws -> Value {
            // Return the control's value
          }
        }
      }
    • 10:53 - Relevance for a point-of-interest category

      func relevance() async -> WidgetRelevance<Void> {
        guard let context = RelevantContext.location(category: .beach) else {
          return WidgetRelevance<Void>([])
        }
        return WidgetRelevance([WidgetRelevanceAttribute(context: context)])
      }
    • 14:37 - Implement the relevance method in the RelevanceEntriesProvider

      struct BeachEventRelevanceProvider: RelevanceEntriesProvider {
        let store: BeachEventStore
      
        func relevance() async -> WidgetRelevance<BeachEventConfigurationIntent> {
          // Associate configuration intents with RelevantContexts
          let attributes = events.map { event in
            WidgetRelevanceAttribute(
              configuration: BeachEventConfigurationIntent(event: event),
              context: .date(interval: event.date, kind: .default)
            )
          }
      
          return WidgetRelevance(attributes)
        }
      }
    • 15:09 - Create a RelevanceEntry when the widget is relevant

      struct BeachEventRelevanceProvider: RelevanceEntriesProvider {
        func relevance() async -> WidgetRelevance<BeachEventConfigurationIntent> {
          // Return relevance information for the widget
        }
        
        func entry(
          configuration: BeachEventConfigurationIntent,
          context: Context
        ) async throws -> BeachEventRelevanceEntry {
          if context.isPreview {
            return .previewEntry
          }
          return BeachEventRelevanceEntry(
            event: configuration.event
          )
        }
      }
    • 15:55 - Create a placeholder entry to display when the widget is loading

      struct BeachEventRelevanceProvider: RelevanceEntriesProvider {
        func relevance() async -> WidgetRelevance<BeachEventConfigurationIntent> {
          // Return relevance information for the widget
        }
        
        func entry(
          configuration: BeachEventConfigurationIntent,
          context: Context
        ) async throws -> BeachEventRelevanceEntry {
          // Return the entry for the configuration
        }
        
        func placeholder(context: Context) -> BeachEventRelevanceEntry {
          BeachEventRelevanceEntry.placeholderEntry
        }
      }
    • 16:27 - Use a RelevanceConfiguration to create a relevant widget

      struct BeachEventWidget: Widget {
        private let model = BeachEventStore.shared
      
        var body: some WidgetConfiguration {
          RelevanceConfiguration
            kind: "BeachWidget
            provider: BeachEventRelevanceProvider(store: model)
          ) { entry in
            BeachWidgetView(entry: entry)
          }
          .configurationDisplayName("Beach Events")
          .description("Events at the beach")
        }
      }
    • 17:31 - Use associatedKind to relate the relevant widget to the timeline widget

      struct BeachEventWidget: Widget {
        private let model = BeachEventStore.shared
      
        var body: some WidgetConfiguration {
          RelevanceConfiguration
            kind: "BeachWidget
            provider: BeachEventRelevanceProvider(store: model)
          ) { entry in
            BeachWidgetView(entry: entry)
          }
          .configurationDisplayName("Beach Events")
          .description("Events at the beach")
          .associatedKind(WidgetKinds.beachEventsTimeline)
        }
      }
    • 18:06 - Create a Preview with relevanceEntries

      #Preview("Entries") {
        BeachEventWidget()
      } relevanceEntries: {
        BeachEventRelevanceEntry.previewShorebirds
        BeachEventRelevanceEntry.previewMeditation
      }
    • 18:26 - Create a Preview with relevance

      #Preview("Provider and Relevance") {
        BeachEventWidget()
      } relevanceProvider: {
        BeachEventRelevanceProvider(store: .preview)
      } relevance: {
        let configurations: [BeachEventConfigurationIntent] = [
          .previewSurfing,
          .previewMeditation,
          .previewWalk
        ]
        let attributes = configurations.map {
          WidgetRelevanceAttribute(
            configuration: $0,
            context: .date($0.event.startDate, kind: .default)
          )
        }
        return WidgetRelevance(attributes)
      }
    • 18:47 - Create a Preview with a relevanceProvider

      #Preview("Provider") {
        BeachEventWidget()
      } relevanceProvider: {
        BeachEventRelevanceProvider(store: .preview)
      }
    • 0:00 - Introduction
    • watchOS 26 has new features and platform considerations.

    • 0:56 - Update for watchOS 26
    • Explore the new design system on watchOS with updates to controls, app icons, and system spaces. Learn tips to support the arm64 architecture on watchOS 26.

    • 3:48 - Bring apps to new places
    • Extend the presence of your app across watchOS. Controls help people to perform quick actions and can be added to the Control Center, Smart Stack, and Action button on Apple Watch Ultra. Controls are automatically available from iOS apps or can be built directly on watchOS. Apps that record workouts with HealthKit can be automatically suggested in the Smart Stack based on people’s routine. MapKit APIs from iOS are also available on watchOS 26, like finding directions between two places, or displaying routes as overlays.

    • 9:44 - Be relevant and up-to-date
    • RelevanceKit powers a new way to show widgets in the Smart Stack when they’re the most relevant, based on criteria like date, sleep schedule, or location. Building a relevant widget has similar steps to building a timeline-based widget. Learn tips to build and test your relevant widget but using Previews.

Developer Footer

  • 비디오
  • WWDC25
  • watchOS 26의 새로운 기능
  • 메뉴 열기 메뉴 닫기
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    메뉴 열기 메뉴 닫기
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    메뉴 열기 메뉴 닫기
    • 손쉬운 사용
    • 액세서리
    • 앱 확장 프로그램
    • App Store
    • 오디오 및 비디오(영문)
    • 증강 현실
    • 디자인
    • 배포
    • 교육
    • 서체(영문)
    • 게임
    • 건강 및 피트니스
    • 앱 내 구입
    • 현지화
    • 지도 및 위치
    • 머신 러닝
    • 오픈 소스(영문)
    • 보안
    • Safari 및 웹(영문)
    메뉴 열기 메뉴 닫기
    • 문서(영문)
    • 튜토리얼
    • 다운로드(영문)
    • 포럼(영문)
    • 비디오
    메뉴 열기 메뉴 닫기
    • 지원 문서
    • 문의하기
    • 버그 보고
    • 시스템 상태(영문)
    메뉴 열기 메뉴 닫기
    • Apple Developer
    • App Store Connect
    • 인증서, 식별자 및 프로파일(영문)
    • 피드백 지원
    메뉴 열기 메뉴 닫기
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(영문)
    • News Partner Program(영문)
    • Video Partner Program(영문)
    • Security Bounty Program(영문)
    • Security Research Device Program(영문)
    메뉴 열기 메뉴 닫기
    • Apple과의 만남
    • Apple Developer Center
    • App Store 어워드(영문)
    • Apple 디자인 어워드
    • Apple Developer Academy(영문)
    • WWDC
    Apple Developer 앱 받기
    Copyright © 2025 Apple Inc. 모든 권리 보유.
    약관 개인정보 처리방침 계약 및 지침