WidgetKit : 고급 개발-1 부

소개

제 동료 인 Roger작성한 훌륭한 기사에서 새로운 iOS 14 위젯을 개발하는 것이 얼마나 멋지고 간단한 지 보았습니다. 이 기사에서는 엔터프라이즈 개발에 더 적합 할 수있는 고급 기능을 구현하는 위젯을 빌드하는 방법을 자세히 보여주고 싶습니다. 다음 주제를 살펴 보겠습니다.

1 부:

  • 위젯 및 API 호출
  • 위젯 크기에 따라 디자인 변경
  • 위젯을 최신 상태로 유지
  • 정적 위젯 구성
  • 동적 위젯 구성
  • 위젯 사용자 상호 작용

출발점

점을 감안 로저가 표시 위젯 대상을 추가하는 방법과이 기사에 대한 당신이 위젯 확장을 추가하지만 이번에는, 당신이 그것을 추가 할 때이 있는지 확인하기 위해 자신의 가이드를 따를 수, 작동하는 방법을 구성 의도 포함 IS 체크 -이 위젯의 동적 구성을 구현할 수 있어야합니다. 다음 코드 스 니펫은 항상 구성 의도를 포함하는 위젯을 참조합니다.

이 기사의 이해를 돕기 위해 이벤트 목록이 표시된 화면과 세부 정보를 표시하는 화면이있는 작은 앱을 개발했다고 상상할 수 있습니다 (또는 원하는 경우 IDE에서 직접 코딩). 또한이 EventsWidget의 어플리케이션에 추가 대상.

이벤트는 다음과 같이 속성 중 하나에 대한 Category 개체가있는 간단한 개체입니다.

또한 다음과 같은 가상 API를 가져 오는 클래스를 고려해보십시오.

EventsLoader 는 API를 호출하고 필터링 할 수있는 이벤트 목록을 검색하는 데만 사용됩니다.

static func fetch(filter: Filter, completion: @escaping (Result<[Event], Error>) -> Void)

static func fetch(eventName: String, completion: @escaping (Result<Event, Error>) -> Void)

static func fetch(completion: @escaping (Result<[Category], Error>) -> Void)

대부분의 앱은 백엔드의 API에 의존하기 때문에 제가 해결하고 싶은 첫 번째 문제는 위젯에 표시 될 데이터를 얻기 위해 API 호출을 사용하는 것입니다. 그렇게하는 것은 매우 쉽습니다. getTimeline 함수의 위젯 Provider 구조체에서 반환 유형이없고 대신 완료 블록이 있음을 알 수 있습니다. 즉, 응답이 수신되면 여기서 API를 가져와 완료 블록을 호출 할 수 있습니다.

여기서 시스템에서 getTimeline 을 호출 할 때 API 호출을 수행 한 다음 로더 클래스에서 응답을 받으면 완료 블록을 호출하는 것을 볼 수 있습니다.

내 당신은 또한 볼 수 있듯이 EventEntry이 라는 속성이 eventsFetchResult을 , 그것의 유형은 분명하다 결과 <[이벤트], 오류> 가져 이벤트에 돌아왔다. fetch 호출의 결과를 직접 전달하는 이유는 무엇입니까? 이는 위젯에서 사용자에게 표시 할 내용을보다 쉽게 ​​관리 할 수 ​​있도록하기위한 것입니다.
기본적으로 항목이 위젯의 ​​swiftUI 뷰에 전달되면 코드의 해당 부분에서 결과가 실패인지 성공인지 확인할 수 있습니다.

물론 이것은 위젯의 다양한 상태를 처리하기 위해 따를 수있는 방법 중 하나 일뿐입니다. 이것은 위젯을 표시하는 가장 쉽고 간단한 방법이었습니다.

위젯 크기에 따라 디자인 변경

또 다른 흥미로운 주제는 다른 위젯 차원에 대한 위젯 디자인을 변경하는 방법입니다.
현재 iOS 위젯은 소형 , 중형 , 대형의 3 가지 차원을 가질 수 있습니다 .

이러한 치수는 표준이지만 각 치수의 프레임 크기는 위젯을 표시하는 장치에 따라 다를 수 있습니다. 차이점은 그리 크지는 않지만 이것을 아는 것이 좋습니다 . 이 링크 에있는 Apple 문서 의 Adapting to Different Screen Sizes 장 에서 이에 대한 자세한 정보를 찾을 수 있습니다 .

그러나 위젯 크기에 따라 디자인을 어떻게 변경합니까? 그렇게하려면 위젯 swiftUI보기에서 widgetFamily 매개 변수를 사용하여보기 환경에서 검색하면됩니다.

@Environment(\.widgetFamily) private var widgetFamily

보시다시피 widgetFamily 매개 변수의 향후 알 수없는 값에 대한 경고를 피하기 위해 알 수없는 기본 케이스도 추가했습니다.

더 큰 위젯에 대해 더 많은 정보 (여러 API 호출을 통해)를 검색하거나 다른 위젯 차원에 대해 다른 API 호출을 사용하려는 경우도 발생할 수 있습니다. 예를 들어, 대형 위젯에 필요한 정보를 얻기 위해 두 번의 호출이 필요할 수 있고, 소형 및 중형 위젯에 대해 하나만 필요할 수 있습니다.이 경우 메소드에서 수신 한 컨텍스트 입력을 통해 getTimeline 함수 에서이 로직을 간단히 구현할 수 있습니다. :

이를 수행하는 것은 매우 간단합니다. 각 논리 흐름의 끝에서 완료를 호출하는 것을 잊지 마십시오!

위젯을 최신 상태로 유지

이제 우리는 위젯 디자인과이를 수행하는 데 사용되는 데이터를 잘 제어 할 수 있습니다.하지만 위젯은 어떻게 최신 상태로 유지됩니까? 우선, 위젯이 자체적으로 새로 고침하는 두 가지 방법이 있음을 분명히해야합니다. 하나는 앱 내에서 위젯 새로 고침 이고 다른 하나는 시간 기반 입니다.

앱 내에서 위젯 새로 고침

앱 기반 새로 고침의 경우 위젯을 소유 한 앱이 위젯에 자체 업데이트를 요청할 수 있음을 의미합니다.이 작업은 간단한 코드 줄을 통해 수행됩니다.

WidgetCenter.shared.reloadTimelines(ofKind: "EventsWidget")

동일한 앱에 대해 여러 위젯이 있고 모든 위젯 종류의 다시로드를 트리거하려는 경우 대신이 메서드를 사용할 수 있습니다.

WidgetCenter.shared.reloadAllTimelines()

시간 기반 위젯 새로 고침

이것은 좀 더 복잡합니다. getTimeline 함수 에서 보았 듯이 TimelineEntry 객체에는 Date 속성 이 있고 (만료일이라고 부를 수 있음) Timeline 객체는 TimelineEntryTimelineReloadPolicy 의 배열로 인스턴스화됩니다 .

이러한 모든 속성은 위젯이 자체 업데이트되어야하는시기를 정의합니다. 타임 라인
정책 은 다음 값 중 하나를 가정 할 수 있습니다.

  • .atEnd 는 항목 배열의 마지막 항목 날짜에 도달하면 위젯이 자동으로 업데이트 됨을 의미합니다.
  • .never 는 위젯이 시스템에서 자동으로 업데이트되지 않음을 의미하므로 앱 내에서 위젯 새로 고침을 호출해야합니다.
  • .after (Date) 는 항목 배열에 관계없이이 정책 유형 의 Date 매개 변수 로 전달 된 날짜 직후 위젯이 업데이트됨을 의미합니다.

이벤트와 함께 실제적인 예를 만들어 봅시다. 다음 3 개의 이벤트를 표시하는 위젯이 있으며 다음 6 시간 동안 6 개의 이벤트가 있습니다. 타임 라인을 제공 할 때 위젯이 시간이 지남에 따라 어떻게 변경되어야하는지 쉽게 파악할 수 있습니다.

  • 수신 된 처음 3 개 이벤트 표시 시작
  • 1 차 이벤트 통과시 2 차, 3 차, 4 차 수신 된 이벤트 표시
  • 2 차 이벤트 통과시 3 차, 4 차, 5 차 수신 이벤트 표시
  • 기타..

이 코드 케이스에서 events [3] .date 에 도달하면 (따라서 마지막 항목의 마지막 날짜 인 fourEntry 라는 이름 ) 시스템은 마지막 항목 이후에 더 이상 항목이 제공되지 않음을 확인하므로 이제 호출 할 시간입니다. getTimeline의 기능과 우리의 위젯에 대한 새 항목을 얻을.

하지만 .after (Date) 를 정책으로 전달하면 어떻게 될까요? 이 경우 흐름은 .after 정책에 전달 된 날짜 가 마지막 항목 만료 날짜 이전 인 경우 시스템이 해당 날짜에 도달 하면 getTimeline 함수 를 호출 한다는 점을 제외하면 설명 된 것과 동일 합니다 . 배열의 일부 미래 항목. 항목 목록을 정리하고 getTimeline 함수 에서 새 항목을 가져옵니다 .

참고 1 : 위젯은 마지막 getTimeline 호출 에서 최소 5 분이 경과 할 때까지 getTimeline을 업데이트하고 호출하지 않습니다. 이는 Apple이 위젯을 라이브 프런트 엔드로 사용할 수 없도록하기를 원하기 때문입니다. 물론 이것은 메서드 내의 새로 고침 에는 적용되지 않습니다 .

참고 2 : 앱이 AppStore를 통해 업데이트를 받거나 Part 2 에서 볼 수있는 것처럼 위젯 구성을 변경 하거나 홈 화면에서 동일한 위젯을 제거했다가 다시 추가하는 경우 위젯이 자동으로 새로 고쳐 집니다.

무엇 향후 계획

2 부에서는 위젯의 정적동적 구성 을 구현하고 위젯 사용자 상호 작용 을 구현하는 방법을 살펴 봅니다.

Suggested posts

KARATE를 사용한 KAFKA 자동화

KARATE를 사용한 KAFKA 자동화

자동화 요구 : CI (지속적 통합)에서 개발 팀은 작은 변경 사항을 구현하고 코드를 버전 제어 저장소에 자주 체크인합니다. CD (지속적 배포)는 선택한 인프라 환경에 대한 배포를 자동화합니다.

적응 제어 (2 부) —X-15의 적응 형 비행 제어 시스템 모델링

적응 제어 (2 부) —X-15의 적응 형 비행 제어 시스템 모델링

X-15의 적응 형 비행 제어 시스템 인 유명한 MH-96의 Simulink 모델을 처음부터 만드는 방법 적응 형 제어에 대한이 시리즈의 두 번째 장에 오신 것을 환영합니다. 이전 기사에서 우리는 과거,보다 구체적으로 60 년대 초, 최초의 적응 형 비행 제어 시스템 시대, 북미 X-15로 초음속 유인 비행의 시작으로 편도 여행을했습니다.

Related posts

Swift— 프로토콜은 어떻게 작동합니까?

프로토콜과 위임은 Swift의 기본 개념입니다. 작동 방식과 사용 방법에 대해 알아 보려면이 빠른 가이드를 읽어보세요.

Swift— 프로토콜은 어떻게 작동합니까?

프로토콜은 Swift에서 매우 간단하지만 기본적인 개념입니다. 프로토콜은 코드 계약과 같습니다.

Mac App Store에없는 Mac에서 iOS / iPadOS 앱을 실행하는 방법

Mac App Store에없는 Mac에서 iOS / iPadOS 앱을 실행하는 방법

M1 칩을 실행하는 Mac이있는 경우 Mac App Store에 나열된 iOS / iPadOS 앱만 실행할 수 있습니다. 하지만 Mac App Store에 나열되지 않은 iOS / iPadOS 앱은 어떻습니까? 공식적으로는 할 수 없습니다.

더 접근하기 쉬운 오디오 플레이어

실명 및 시각 장애가있는 사람들을위한 공감력으로 구축하는 법 배우기

더 접근하기 쉬운 오디오 플레이어

작성자 : Francis Mariano, iOS 엔지니어 Headspace의 대담한 사명 선언문 인 세상의 건강과 행복을 개선합니다. 우리가 그곳에 사는 사람들의 다양한 경험을 인식하게 만드는 것.

SwiftUI를 사용하여 원 안에 텍스트를 표시하는 방법

SwiftUI를 사용하여 원 안에 텍스트를 표시하는 방법

이번에는 SwiftUI를 사용하여 원 안에 텍스트 레이블을 표시하는 몇 가지 방법을 살펴 보겠습니다. ZStack보기를 사용하여 세 가지 다른 방법을 자세히 살펴 보겠습니다.