Tech Log/iOS

[WidgetKit] Weather Widget 학습 정리: TimelineEntry부터 AppIntent 인터랙션까지

별똥별 ⭐️ 2026. 2. 26. 15:48
728x90

 

WidgetKit Weather 학습 정리

 

이번에는 HIGPractice 프로젝트에서

WidgetKit + Weather 예제를 기준으로 위젯 구조를 학습했다.

 

이번 학습의 핵심은

👉 “보이는 UI”보다 먼저, Timeline 기반 업데이트 구조를 정확히 이해하는 것이었다.

 


 

1. 이번에 정리한 핵심 개념

 

 

1️⃣ Entry는 

TimelineEntry + date

가 핵심

 

Widget의 Entry는 TimelineEntry를 채택하며,

반드시 date 프로퍼티를 가져야 한다.

 

시스템은 이 date를 기준으로

 

“어떤 시점의 위젯 상태를 언제 렌더링할지”
를 판단한다.

 

즉, Widget은 현재 상태를 직접 그리는 구조가 아니라

미래의 상태들을 미리 예약해두는 구조라는 점이 중요하다.

 


 

2️⃣ 

AppIntentTimelineProvider

의 3가지 메서드 역할

 

 

placeholder(in:)

 

  • 위젯 갤러리에서 보이는 미리보기
  • HIG 기준으로는 로딩 스피너보다
  • 실제 위젯 형태를 최대한 반영한 데이터를 보여주는 것이 좋다

 


 

snapshot(for:in:)

 

  • 위젯 추가 / 편집 시점에 표시되는 단일 스냅샷
  • 빠르게 의미 있는 상태를 보여주는 용도
  • 실제 네트워크 호출 없이도 대표 상태를 보여주기에 적합

 


 

timeline(for:in:)

 

  • 시스템에 Entry 배열과 갱신 정책을 전달
  • Timeline(entries:policy:)에서
  • .after(...), .atEnd 등을 통해 업데이트 시점 제어

 

👉 실제 데이터 흐름과 시스템 스케줄링이 만나는 핵심 지점

 


 

3️⃣ 비동기 데이터 처리 방식

 

Provider 구현 내부에서

async / await로 데이터를 비동기 fetch한 뒤 Entry를 생성할 수 있다.

 

이 구조의 장점은:

 

  • 데이터 로딩 흐름을 UI와 완전히 분리
  • Provider에서 상태 생성 책임을 집중 관리
  • Widget View는 순수 렌더링에만 집중 가능

 

👉 WidgetKit에서는 이 패턴이 가장 안정적이다.

 


 

2. Widget 크기별 레이아웃 전략

 

  • Small
    • 핵심 정보 요약
    • 한눈에 상태 파악 가능해야 함
  • Medium
    • 가로 확장을 활용
    • 핵심 요약 + 보조 정보 배치
  • Large
    • 더 많은 정보 표현 가능
    • 단, 정보 과밀은 금지

 

추가로 HIG 관점에서,

Small 위젯에 앱 아이콘을 굳이 표시할 필요는 없다.

 

시스템이 이미 위젯 하단에 앱 이름을 노출하기 때문

 


 

3. iOS 17+에서 유용했던 포인트

 

 

containerBackground(for: .widget)

 

  • 날씨 조건에 따라 배경 스타일을 다르게 적용
  • 예제에서는 condition 기반 그라디언트 사용
  • 배경과 콘텐츠의 대비를 통해 시인성 개선

 


 

Button(intent:)

 

  • 위젯에서 앱을 열지 않고도 액션 실행 가능
  • 예시 흐름:
    • 새로고침 버튼 탭
    • Intent 실행
    • WidgetCenter.shared.reloadAllTimelines() 호출
    • 위젯 즉시 반영

 

👉 iOS 17 이후 인터랙티브 위젯의 핵심 기능

 


 

4. 잠금화면 위젯에서 주의한 점

 

잠금화면 위젯은

색상 제어를 시스템이 크게 가져간다.

 

그래서:

 

  • 화려한 컬러보다는
  • 명도 대비
  • 텍스트 가독성
  • 형태 인지성

 

이 세 가지를 중심으로 설계하는 것이 맞다.

 


 

5. 이번 학습에서 얻은 결론

 

  1. WidgetKit은 결국
  2. Provider → Entry → View 구조 분리가 핵심이다.
  3. placeholder / snapshot / timeline의 역할을 섞지 않아야
  4. 유지보수가 쉬워진다.
  5. family별 정보 밀도 전략 +실전 품질을 좌우한다.
  6. iOS 17 인터랙션(Button(intent:)) 이해가

 


 

6. 다음 액션

 

  • timeline 갱신 주기(15분 / 30분)를
  • 데이터 특성 기반으로 더 정교화
  • 잠금화면 family별 대비 체크 강화
  • Mock 데이터 → 실제 WeatherKit 연동 실험

 


 

프로젝트 기록