📲 WidgetKit development kit with Live Activities and dynamic widgets
-English · Türkçe · 简体中文 · 日本語 · 한국어 · Español · Deutsch · Français · Português (Brasil) · Русский
+ + + + + + +> Dies ist eine Übersetzung der englischen README. Bei Abweichungen gilt die englische Fassung. + + + +WidgetDevelopmentKit ist ein Swift-Paket für alle, die Widgets für ihre iOS-Apps bauen. Es +enthält fertige SwiftUI-Views für Widgets auf dem Home-Bildschirm, dem Sperrbildschirm und in +StandBy, Diagramm-Views in Widget-Größe, Hilfstypen für Timelines und für die Daten, die die +App mit ihrem Widget teilt, App Intents für Widget-Buttons sowie ActivityKit-Attribute und +-Views für Live Activities. Die Widget-Extension schreibst du weiterhin selbst; das Paket nimmt +dir die Views und die Datums-, Speicher- und Wiederholungslogik ab, die jedes Widget braucht. + +## Highlights + +- **20 Vorlagen für den Home-Bildschirm** – Wetter, Statistiken, Finanzen, Kalender, + Countdown, Uhr, Notizen, Zitate, Musik, Podcast, Nachrichten, Fitnessringe, + Gewohnheitstracker, To-dos, Wasser, Batterie und mehr. +- **Sperrbildschirm und StandBy** – 15 Accessory-Views (kreisförmig, rechteckig, inline) und 7 + StandBy-Views. +- **Timeline-Hilfen** – Eintragsdaten, Reload-Richtlinien und ein Snapshot-Speicher mit + Ablaufzeit, damit das Widget liest, was die App über eine App Group gespeichert hat. +- **Interaktive Widgets** – 5 App Intents und 8 Views mit Buttons, die sie ausführen. +- **Live Activities** – 10 `ActivityAttributes`-Typen mit Views für den Sperrbildschirm und + die kompakte Dynamic Island sowie ein Zustandsautomat, der Updates in falscher Reihenfolge + ablehnt. +- **Getestete Logik** – der Code für Datumswerte, Zahlen und Wiederholungen ist mit Swift + Testing getestet, auch für Grenzfälle wie `NaN`, Ziele von null und Tage mit + Zeitumstellung. + +## Schnellstart + +**1. Paket hinzufügen** + +Deine App braucht eine Widget-Extension. Falls es noch keine gibt, wähle in Xcode **File › +New › Target…** und dann **Widget Extension**. Wähle anschließend **File › Add Package +Dependencies…**, füge diese URL oben rechts in das Suchfeld ein und klicke auf **Add +Package**: + +```text +https://github.com/muhittincamdali/iOS-Widget-Development-Kit.git +``` + +Stelle im nächsten Dialog in der Spalte **Add to Target** für `WidgetDevelopmentKit` deine +Widget-Extension ein und klicke auf **Add Package**. + +**2. Modul importieren** + +Am Anfang einer Swift-Datei der Widget-Extension: + +```swift +import WidgetDevelopmentKit +``` + +**3. Verwenden** + +Füge dieses Widget zur Extension hinzu. Es zählt mit der `CountdownWidget`-View des Pakets +bis zu einem Datum herunter. Trage danach `LaunchCountdownWidget()` im `WidgetBundle` der +Extension ein, also im Typ, der mit `@main` markiert ist. + +```swift +struct LaunchEntry: TimelineEntry { + let date: Date +} + +struct LaunchProvider: TimelineProvider { + func placeholder(in context: Context) -> LaunchEntry { + LaunchEntry(date: .now) + } + + func getSnapshot(in context: Context, completion: @escaping (LaunchEntry) -> Void) { + completion(LaunchEntry(date: .now)) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline
+
+
+English · Türkçe · 简体中文 · 日本語 · 한국어 · Español · Deutsch · Français · Português (Brasil) · Русский
+ + + + + + +> Esta es una traducción del README en inglés. Si hay diferencias, la versión en inglés es la vigente. + + + +WidgetDevelopmentKit es un paquete Swift para quienes crean widgets para sus apps de iOS. +Incluye vistas SwiftUI listas para usar en widgets de la pantalla de inicio, la pantalla +bloqueada y StandBy, vistas de gráficos adaptadas al tamaño de un widget, utilidades para las +líneas de tiempo y para los datos que la app comparte con su widget, App Intents para los +botones de los widgets, y atributos y vistas de ActivityKit para Live Activities. La extensión +de widgets la sigues escribiendo tú; el paquete te ahorra las vistas y la lógica de fechas, +almacenamiento y reintentos que necesita cualquier widget. + +## Lo más destacado + +- **20 plantillas para la pantalla de inicio**: tiempo, estadísticas, finanzas, calendario, + cuenta atrás, reloj, notas, citas, música, pódcast, noticias, anillos de actividad física, + seguimiento de hábitos, tareas, agua, batería y más. +- **Pantalla bloqueada y StandBy**: 15 vistas accesorias (circular, rectangular, en línea) y 7 + vistas de StandBy. +- **Utilidades de línea de tiempo**: fechas de las entradas, políticas de recarga y un almacén + de instantáneas con caducidad, para que el widget lea lo que la app guardó a través de un + App Group. +- **Widgets interactivos**: 5 App Intents y 8 vistas con botones que los ejecutan. +- **Live Activities**: 10 tipos de `ActivityAttributes` con vistas para la pantalla bloqueada y + la Dynamic Island compacta, y una máquina de estados que rechaza las actualizaciones que + llegan desordenadas. +- **Lógica con pruebas**: el código de fechas, números y reintentos está cubierto por pruebas + de Swift Testing, incluidos casos límite como `NaN`, objetivos de cero y los días de cambio + de horario. + +## Inicio rápido + +**1. Añade el paquete** + +Tu app necesita una extensión de widgets. Si todavía no tiene una, elige **File › New › +Target…** en Xcode y selecciona **Widget Extension**. Después elige **File › Add Package +Dependencies…**, pega esta URL en el campo de búsqueda de la esquina superior derecha y pulsa +**Add Package**: + +```text +https://github.com/muhittincamdali/iOS-Widget-Development-Kit.git +``` + +En el siguiente cuadro de diálogo, en la columna **Add to Target** de `WidgetDevelopmentKit` +elige tu extensión de widgets y pulsa **Add Package**. + +**2. Importa el módulo** + +Al principio de un archivo Swift de la extensión de widgets: + +```swift +import WidgetDevelopmentKit +``` + +**3. Úsalo** + +Añade este widget a la extensión. Muestra una cuenta atrás hasta una fecha con la vista +`CountdownWidget` del paquete. Después incluye `LaunchCountdownWidget()` en el `WidgetBundle` +de la extensión, el tipo marcado con `@main`. + +```swift +struct LaunchEntry: TimelineEntry { + let date: Date +} + +struct LaunchProvider: TimelineProvider { + func placeholder(in context: Context) -> LaunchEntry { + LaunchEntry(date: .now) + } + + func getSnapshot(in context: Context, completion: @escaping (LaunchEntry) -> Void) { + completion(LaunchEntry(date: .now)) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline
+
+
+English · Türkçe · 简体中文 · 日本語 · 한국어 · Español · Deutsch · Français · Português (Brasil) · Русский
+ + + + + + +> Ceci est une traduction du README anglais. En cas de différence, la version anglaise fait foi. + + + +WidgetDevelopmentKit est un paquet Swift destiné aux développeurs qui créent des widgets pour +leurs apps iOS. Il contient des vues SwiftUI prêtes à l’emploi pour les widgets de l’écran +d’accueil, de l’écran verrouillé et de StandBy, des vues de graphiques adaptées à la taille +d’un widget, des utilitaires pour les timelines et pour les données que l’app partage avec son +widget, des App Intents pour les boutons des widgets, ainsi que des attributs et des vues +ActivityKit pour les Live Activities. Vous écrivez toujours l’extension de widget vous-même ; +le paquet vous épargne les vues et la logique de dates, de stockage et de nouvelles tentatives +dont tout widget a besoin. + +## Points forts + +- **20 modèles pour l’écran d’accueil** — météo, statistiques, finances, calendrier, compte à + rebours, horloge, notes, citation, musique, podcast, actualités, anneaux d’activité, suivi + d’habitudes, tâches, eau, batterie, etc. +- **Écran verrouillé et StandBy** — 15 vues accessoires (circulaire, rectangulaire, en ligne) + et 7 vues StandBy. +- **Utilitaires de timeline** — dates des entrées, politiques de rechargement et un stockage + d’instantanés avec expiration, pour que le widget lise ce que l’app a enregistré via un App + Group. +- **Widgets interactifs** — 5 App Intents et 8 vues dont les boutons les exécutent. +- **Live Activities** — 10 types `ActivityAttributes` avec des vues pour l’écran verrouillé et + la Dynamic Island compacte, et une machine à états qui rejette les mises à jour arrivées dans + le désordre. +- **Logique testée** — le code des dates, des nombres et des nouvelles tentatives est couvert + par des tests Swift Testing, y compris des cas limites comme `NaN`, un objectif nul et les + jours de changement d’heure. + +## Démarrage rapide + +**1. Ajouter le paquet** + +Votre app a besoin d’une extension de widget. Si elle n’en a pas encore, choisissez **File › +New › Target…** dans Xcode, puis **Widget Extension**. Choisissez ensuite **File › Add Package +Dependencies…**, collez cette URL dans le champ de recherche en haut à droite et cliquez sur +**Add Package** : + +```text +https://github.com/muhittincamdali/iOS-Widget-Development-Kit.git +``` + +Dans la fenêtre suivante, réglez **Add to Target** de `WidgetDevelopmentKit` sur votre +extension de widget, puis cliquez sur **Add Package**. + +**2. Importer le module** + +En haut d’un fichier Swift de l’extension de widget : + +```swift +import WidgetDevelopmentKit +``` + +**3. L’utiliser** + +Ajoutez ce widget à l’extension. Il affiche un compte à rebours jusqu’à une date avec la vue +`CountdownWidget` du paquet. Ajoutez ensuite `LaunchCountdownWidget()` au `WidgetBundle` de +l’extension, le type marqué `@main`. + +```swift +struct LaunchEntry: TimelineEntry { + let date: Date +} + +struct LaunchProvider: TimelineProvider { + func placeholder(in context: Context) -> LaunchEntry { + LaunchEntry(date: .now) + } + + func getSnapshot(in context: Context, completion: @escaping (LaunchEntry) -> Void) { + completion(LaunchEntry(date: .now)) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline
+
+
+English · Türkçe · 简体中文 · 日本語 · 한국어 · Español · Deutsch · Français · Português (Brasil) · Русский
+ + + + + + +> このドキュメントは英語版 README の翻訳です。内容が異なる場合は英語版が最新です。 + + + +WidgetDevelopmentKit は、iOS アプリのウィジェットを開発する人のための Swift パッケージです。ホーム画面、ロック画面、StandBy のウィジェット向けの SwiftUI ビュー、ウィジェットのサイズに合わせたチャートビュー、タイムラインとアプリがウィジェットと共有するデータのためのヘルパー、ウィジェットのボタン用の App Intents、Live Activities 用の ActivityKit 属性とビューが含まれています。ウィジェット拡張そのものは自分で書きますが、ビューと、どのウィジェットにも必要な日付・ストレージ・リトライの処理はこのパッケージに任せられます。 + +## 主な特長 + +- **20 種類のホーム画面テンプレート** — 天気、統計、家計、カレンダー、カウントダウン、時計、メモ、名言、音楽、ポッドキャスト、ニュース、フィットネスリング、習慣トラッカー、ToDo、水分、バッテリーなど。 +- **ロック画面と StandBy** — 15 種類のアクセサリビュー(円形、長方形、インライン)と 7 種類の StandBy ビュー。 +- **タイムラインのヘルパー** — エントリの日時、再読み込みポリシー、有効期限付きのスナップショットストア。アプリが App Group 経由で保存したデータをウィジェットが読み取れます。 +- **インタラクティブウィジェット** — 5 つの App Intent と、それを実行するボタンを持つ 8 つのビュー。 +- **Live Activities** — ロック画面とコンパクトな Dynamic Island のビューを備えた 10 種類の `ActivityAttributes` 型と、順序が入れ替わった更新を拒否するステートマシン。 +- **テスト済みのロジック** — 日付・数値・リトライのコードは Swift Testing のテストでカバーされており、`NaN`、目標値ゼロ、夏時間の切り替え日などのエッジケースも含みます。 + +## クイックスタート + +**1. パッケージを追加する** + +アプリにはウィジェット拡張が必要です。まだない場合は、Xcode で **File › New › Target…** を選び、**Widget Extension** を選択します。次に **File › Add Package Dependencies…** を選び、右上の検索フィールドに次の URL を貼り付けて **Add Package** をクリックします。 + +```text +https://github.com/muhittincamdali/iOS-Widget-Development-Kit.git +``` + +次のダイアログで、`WidgetDevelopmentKit` の **Add to Target** をウィジェット拡張に設定し、**Add Package** をクリックします。 + +**2. モジュールをインポートする** + +ウィジェット拡張の Swift ファイルの先頭に追加します。 + +```swift +import WidgetDevelopmentKit +``` + +**3. 使ってみる** + +このウィジェットを拡張に追加します。パッケージの `CountdownWidget` ビューで、ある日付までのカウントダウンを表示します。続いて、拡張の `WidgetBundle`(`@main` が付いた型)に `LaunchCountdownWidget()` を追加します。 + +```swift +struct LaunchEntry: TimelineEntry { + let date: Date +} + +struct LaunchProvider: TimelineProvider { + func placeholder(in context: Context) -> LaunchEntry { + LaunchEntry(date: .now) + } + + func getSnapshot(in context: Context, completion: @escaping (LaunchEntry) -> Void) { + completion(LaunchEntry(date: .now)) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline
+
+
+English · Türkçe · 简体中文 · 日本語 · 한국어 · Español · Deutsch · Français · Português (Brasil) · Русский
+ + + + + + +> 이 문서는 영어 README의 번역본입니다. 내용이 다를 경우 영어 버전이 최신입니다. + + + +WidgetDevelopmentKit은 iOS 앱용 위젯을 만드는 개발자를 위한 Swift 패키지입니다. 홈 화면, 잠금 화면, StandBy 위젯을 위한 SwiftUI 뷰, 위젯 크기에 맞춘 차트 뷰, 타임라인과 앱이 위젯과 공유하는 데이터를 위한 헬퍼, 위젯 버튼용 App Intents, Live Activities용 ActivityKit 속성과 뷰가 들어 있습니다. 위젯 익스텐션은 직접 작성해야 하지만, 뷰와 모든 위젯에 필요한 날짜·저장·재시도 로직은 이 패키지가 대신합니다. + +## 주요 기능 + +- **홈 화면 템플릿 20개** — 날씨, 통계, 금융, 캘린더, 카운트다운, 시계, 메모, 명언, 음악, 팟캐스트, 뉴스, 피트니스 링, 습관 추적, 할 일, 물 섭취, 배터리 등. +- **잠금 화면과 StandBy** — 액세서리 뷰 15개(원형, 직사각형, 인라인)와 StandBy 뷰 7개. +- **타임라인 헬퍼** — 항목 날짜, 다시 로드 정책, 만료 시간이 있는 스냅숏 저장소. 위젯은 앱이 App Group을 통해 저장한 데이터를 읽습니다. +- **인터랙티브 위젯** — App Intent 5개와, 이를 실행하는 버튼이 있는 뷰 8개. +- **Live Activities** — 잠금 화면 뷰와 컴팩트 Dynamic Island 뷰를 갖춘 `ActivityAttributes` 타입 10개, 그리고 순서가 뒤바뀐 업데이트를 거부하는 상태 머신. +- **테스트된 로직** — 날짜, 숫자, 재시도 코드는 Swift Testing 테스트로 검증하며, `NaN`, 목표값 0, 일광 절약 시간 전환일 같은 경계 사례도 포함합니다. + +## 빠른 시작 + +**1. 패키지 추가** + +앱에 위젯 익스텐션이 있어야 합니다. 아직 없다면 Xcode에서 **File › New › Target…**을 선택하고 **Widget Extension**을 고르세요. 그런 다음 **File › Add Package Dependencies…**를 선택하고, 오른쪽 위 검색 필드에 이 URL을 붙여 넣은 뒤 **Add Package**를 클릭하세요. + +```text +https://github.com/muhittincamdali/iOS-Widget-Development-Kit.git +``` + +다음 대화 상자에서 `WidgetDevelopmentKit`의 **Add to Target**을 위젯 익스텐션으로 지정하고 **Add Package**를 클릭하세요. + +**2. 모듈 가져오기** + +위젯 익스텐션에 있는 Swift 파일 맨 위에 추가하세요. + +```swift +import WidgetDevelopmentKit +``` + +**3. 사용하기** + +이 위젯을 익스텐션에 추가하세요. 패키지의 `CountdownWidget` 뷰로 특정 날짜까지 남은 시간을 보여 줍니다. 그다음 익스텐션의 `WidgetBundle`(`@main`이 붙은 타입)에 `LaunchCountdownWidget()`을 추가하세요. + +```swift +struct LaunchEntry: TimelineEntry { + let date: Date +} + +struct LaunchProvider: TimelineProvider { + func placeholder(in context: Context) -> LaunchEntry { + LaunchEntry(date: .now) + } + + func getSnapshot(in context: Context, completion: @escaping (LaunchEntry) -> Void) { + completion(LaunchEntry(date: .now)) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline
+
+
+
-
-
-
-
English · Türkçe · 简体中文 · 日本語 · 한국어 · Español · Deutsch · Français · Português (Brasil) · Русский
+ -```swift -import SwiftUI -import WidgetKit -import iOSWidgetKit + -struct MyWidgetView: View { - var entry: SimpleEntry - - var body: some View { - WeatherWidget( - temperature: 72, - condition: .sunny, - location: "San Francisco", - high: 78, - low: 65 - ) - } -} -``` + ---- + -## ⚡ Live Activities +WidgetDevelopmentKit is a Swift package for developers who build widgets for their iOS apps. +It contains ready-made SwiftUI views for Home Screen, Lock Screen and StandBy widgets, chart +views sized for widgets, helpers for timelines and for the data the app shares with its +widget, App Intents for widget buttons, and ActivityKit attributes and views for Live +Activities. You still write the widget extension; the package saves you the views and the +date, storage and retry logic that every widget needs. -### 10 Live Activity Templates +## Highlights -| Template | Use Case | -|----------|----------| -| `DeliveryActivity` | Food/package delivery | -| `RideActivity` | Uber/Lyft style rides | -| `SportsScoreActivity` | Live sports scores | -| `TimerActivity` | Countdown timer | -| `WorkoutActivity` | Fitness tracking | -| `NowPlayingActivity` | Music player | -| `FlightActivity` | Flight tracking | -| `ParkingActivity` | Parking meter | -| `OrderActivity` | Order status | -| `MeetingActivity` | Calendar meetings | +- **20 Home Screen templates** — weather, stats, finance, calendar, countdown, clock, notes, + quote, music, podcast, news, fitness rings, habit tracker, to-do, water, battery and more. +- **Lock Screen and StandBy** — 15 accessory views (circular, rectangular, inline) and 7 + StandBy views. +- **Timeline helpers** — entry dates, reload policies and a snapshot store with expiry, so + the widget reads what the app saved through an App Group. +- **Interactive widgets** — 5 App Intents and 8 views with buttons that run them. +- **Live Activities** — 10 `ActivityAttributes` types with Lock Screen and compact Dynamic + Island views, and a state machine that rejects out-of-order updates. +- **Tested logic** — the date, number and retry code is covered by Swift Testing tests, + including edge cases such as `NaN`, zero goals and daylight-saving days. -### Create a Live Activity +## Quick start -```swift -import ActivityKit -import iOSWidgetKit - -// Define your activity -let attributes = DeliveryAttributes( - orderNumber: "12345", - restaurantName: "Pizza Place" -) - -let state = DeliveryAttributes.ContentState( - status: .onTheWay, - estimatedArrival: Date().addingTimeInterval(1800), - driverName: "John", - currentStep: 2 -) - -// Start the activity -let activity = try LiveActivityManager.shared.startActivity( - attributes: attributes, - contentState: state -) - -// Update -await LiveActivityManager.shared.updateActivity( - activity, - with: DeliveryAttributes.ContentState( - status: .arriving, - estimatedArrival: Date().addingTimeInterval(300), - driverName: "John", - currentStep: 3 - ) -) - -// End -await LiveActivityManager.shared.endActivity(activity) -``` +**1. Add the package** -### Dynamic Island Views +Your app needs a widget extension. If it has none yet, choose **File › New › Target…** in +Xcode and pick **Widget Extension**. Then choose **File › Add Package Dependencies…**, paste +this URL into the search field at the top right and choose **Add Package**: -```swift -struct DeliveryActivityConfiguration: Widget { - var body: some WidgetConfiguration { - ActivityConfiguration(for: DeliveryAttributes.self) { context in - // Lock screen view - DeliveryActivityView(context: context) - } dynamicIsland: { context in - DynamicIsland { - // Expanded view - DynamicIslandExpandedRegion(.leading) { - Image(systemName: context.state.status.icon) - } - DynamicIslandExpandedRegion(.trailing) { - Text(context.state.estimatedArrival, style: .timer) - } - DynamicIslandExpandedRegion(.bottom) { - ProgressView(value: Double(context.state.currentStep), total: 4) - } - } compactLeading: { - Image(systemName: context.state.status.icon) - } compactTrailing: { - Text(context.state.estimatedArrival, style: .timer) - } minimal: { - Image(systemName: context.state.status.icon) - } - } - } -} +```text +https://github.com/muhittincamdali/iOS-Widget-Development-Kit.git ``` ---- +In the next dialog, set **Add to Target** for `WidgetDevelopmentKit` to your widget +extension and choose **Add Package**. -## 🖱️ Interactive Widgets +**2. Import the module** -**iOS 17+ Only** — Add buttons, toggles, and interactive elements. +At the top of a Swift file in the widget extension: -### Available Interactive Templates +```swift +import WidgetDevelopmentKit +``` -- `InteractiveToggleWidget` — Toggle switches -- `InteractiveCounterWidget` — Increment/decrement counters -- `InteractiveTaskListWidget` — Task completion toggles -- `InteractiveQuickActionsWidget` — Action buttons grid -- `InteractiveTimerWidget` — Timer controls -- `InteractiveHabitWidget` — Habit checkmarks -- `InteractiveRatingWidget` — Star ratings -- `InteractiveWaterWidget` — Water intake buttons +**3. Use it** -### Example +Add this widget to the extension. It counts down to a date with the package's +`CountdownWidget` view. Then list `LaunchCountdownWidget()` in the extension's +`WidgetBundle`, the type marked `@main`. ```swift -import AppIntents -import iOSWidgetKit - -// Interactive counter widget -struct MyInteractiveWidget: View { - let counterId = "daily_counter" - @AppStorage("counter_daily_counter", store: UserDefaults(suiteName: "group.widget")) - var count = 0 - - var body: some View { - InteractiveCounterWidget( - title: "Daily Count", - counterId: counterId, - currentValue: count, - accentColor: .blue - ) - } +struct LaunchEntry: TimelineEntry { + let date: Date } -// Task list with toggles -struct TaskWidget: View { - var body: some View { - InteractiveTaskListWidget( - tasks: [ - .init(id: "1", title: "Morning workout", isCompleted: true, priority: .high), - .init(id: "2", title: "Read 30 minutes", isCompleted: false, priority: .medium), - .init(id: "3", title: "Call mom", isCompleted: false, priority: .low) - ], - listTitle: "Today's Tasks" - ) +struct LaunchProvider: TimelineProvider { + func placeholder(in context: Context) -> LaunchEntry { + LaunchEntry(date: .now) } -} -``` - ---- - -## 📺 StandBy Mode - -**iOS 17+ Only** — Full-screen widgets for StandBy mode on iPhone. - -### StandBy Templates - -| Template | Description | -|----------|-------------| -| `StandByClockWidget` | Digital/Analog clocks | -| `StandByPhotoWidget` | Photo frames | -| `StandByWeatherWidget` | Weather display | -| `StandByCalendarWidget` | Calendar view | -| `StandByFitnessWidget` | Activity rings | -| `StandByMusicWidget` | Now playing | -| `StandByCountdownWidget` | Event countdown | -### Example - -```swift -import iOSWidgetKit + func getSnapshot(in context: Context, completion: @escaping (LaunchEntry) -> Void) { + completion(LaunchEntry(date: .now)) + } -struct MyStandByWidget: View { - var body: some View { - StandByClockWidget( - date: Date(), - style: .flipClock, - showDate: true, - accentColor: .white - ) + func getTimeline(in context: Context, completion: @escaping (Timeline
+
+
+English · Türkçe · 简体中文 · 日本語 · 한국어 · Español · Deutsch · Français · Português (Brasil) · Русский
+ + + + + + +> Esta é uma tradução do README em inglês. Se houver diferença, vale a versão em inglês. + + + +WidgetDevelopmentKit é um pacote Swift para quem cria widgets para apps iOS. Ele traz views +SwiftUI prontas para widgets da Tela de Início, da Tela Bloqueada e do StandBy, views de +gráficos no tamanho de um widget, utilitários para timelines e para os dados que o app +compartilha com o widget, App Intents para os botões dos widgets, além de atributos e views do +ActivityKit para Live Activities. Você continua escrevendo a extensão de widget; o pacote +poupa o trabalho das views e da lógica de datas, armazenamento e novas tentativas de que todo +widget precisa. + +## Destaques + +- **20 modelos para a Tela de Início** — clima, estatísticas, finanças, calendário, contagem + regressiva, relógio, notas, citação, música, podcast, notícias, anéis de atividade, + acompanhamento de hábitos, tarefas, água, bateria e mais. +- **Tela Bloqueada e StandBy** — 15 views de acessório (circular, retangular, em linha) e 7 + views de StandBy. +- **Utilitários de timeline** — datas das entradas, políticas de recarga e um armazenamento de + snapshots com validade, para que o widget leia o que o app salvou por meio de um App Group. +- **Widgets interativos** — 5 App Intents e 8 views com botões que os executam. +- **Live Activities** — 10 tipos de `ActivityAttributes` com views para a Tela Bloqueada e a + Dynamic Island compacta, e uma máquina de estados que rejeita atualizações fora de ordem. +- **Lógica testada** — o código de datas, números e novas tentativas é coberto por testes do + Swift Testing, incluindo casos extremos como `NaN`, metas iguais a zero e dias de mudança de + horário de verão. + +## Início rápido + +**1. Adicione o pacote** + +Seu app precisa de uma extensão de widget. Se ainda não tiver uma, escolha **File › New › +Target…** no Xcode e selecione **Widget Extension**. Depois escolha **File › Add Package +Dependencies…**, cole esta URL no campo de busca no canto superior direito e clique em **Add +Package**: + +```text +https://github.com/muhittincamdali/iOS-Widget-Development-Kit.git +``` + +Na janela seguinte, defina **Add to Target** de `WidgetDevelopmentKit` como sua extensão de +widget e clique em **Add Package**. + +**2. Importe o módulo** + +No início de um arquivo Swift da extensão de widget: + +```swift +import WidgetDevelopmentKit +``` + +**3. Use** + +Adicione este widget à extensão. Ele faz uma contagem regressiva até uma data com a view +`CountdownWidget` do pacote. Em seguida, inclua `LaunchCountdownWidget()` no `WidgetBundle` da +extensão, o tipo marcado com `@main`. + +```swift +struct LaunchEntry: TimelineEntry { + let date: Date +} + +struct LaunchProvider: TimelineProvider { + func placeholder(in context: Context) -> LaunchEntry { + LaunchEntry(date: .now) + } + + func getSnapshot(in context: Context, completion: @escaping (LaunchEntry) -> Void) { + completion(LaunchEntry(date: .now)) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline
+
+
+English · Türkçe · 简体中文 · 日本語 · 한국어 · Español · Deutsch · Français · Português (Brasil) · Русский
+ + + + + + +> Это перевод README на английском языке. Если они расходятся, актуальна английская версия. + + + +WidgetDevelopmentKit — это Swift-пакет для разработчиков, которые создают виджеты для своих +iOS-приложений. В нём есть готовые SwiftUI-представления для виджетов экрана «Домой», экрана +блокировки и StandBy, представления графиков под размер виджета, вспомогательные типы для +таймлайнов и для данных, которые приложение передаёт виджету, App Intents для кнопок в +виджетах, а также атрибуты и представления ActivityKit для Live Activities. Расширение с +виджетами вы по-прежнему пишете сами; пакет избавляет от работы над представлениями и над +логикой дат, хранения и повторных попыток, которая нужна любому виджету. + +## Основные возможности + +- **20 шаблонов для экрана «Домой»** — погода, статистика, финансы, календарь, обратный + отсчёт, часы, заметки, цитата, музыка, подкаст, новости, кольца активности, трекер + привычек, список дел, вода, батарея и другие. +- **Экран блокировки и StandBy** — 15 представлений для аксессуарных семейств (круглые, + прямоугольные, строчные) и 7 представлений для StandBy. +- **Помощники для таймлайнов** — даты записей, политики перезагрузки и хранилище снимков со + сроком действия, чтобы виджет читал то, что приложение сохранило через App Group. +- **Интерактивные виджеты** — 5 App Intents и 8 представлений с кнопками, которые их + запускают. +- **Live Activities** — 10 типов `ActivityAttributes` с представлениями для экрана блокировки + и компактного Dynamic Island, а также конечный автомат, который отклоняет обновления, + пришедшие не по порядку. +- **Протестированная логика** — код для дат, чисел и повторных попыток покрыт тестами Swift + Testing, включая граничные случаи вроде `NaN`, нулевой цели и дней перехода на летнее время. + +## Быстрый старт + +**1. Добавьте пакет** + +Приложению нужно расширение с виджетами. Если его ещё нет, выберите в Xcode **File › New › +Target…** и затем **Widget Extension**. После этого выберите **File › Add Package +Dependencies…**, вставьте этот адрес в поле поиска в правом верхнем углу и нажмите **Add +Package**: + +```text +https://github.com/muhittincamdali/iOS-Widget-Development-Kit.git +``` + +В следующем окне в столбце **Add to Target** для `WidgetDevelopmentKit` выберите расширение +с виджетами и нажмите **Add Package**. + +**2. Импортируйте модуль** + +В начале Swift-файла в расширении с виджетами: + +```swift +import WidgetDevelopmentKit +``` + +**3. Используйте** + +Добавьте этот виджет в расширение. Он показывает обратный отсчёт до даты с помощью +представления `CountdownWidget` из пакета. Затем добавьте `LaunchCountdownWidget()` в +`WidgetBundle` расширения — тип, помеченный `@main`. + +```swift +struct LaunchEntry: TimelineEntry { + let date: Date +} + +struct LaunchProvider: TimelineProvider { + func placeholder(in context: Context) -> LaunchEntry { + LaunchEntry(date: .now) + } + + func getSnapshot(in context: Context, completion: @escaping (LaunchEntry) -> Void) { + completion(LaunchEntry(date: .now)) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline
+
+
+English · Türkçe · 简体中文 · 日本語 · 한국어 · Español · Deutsch · Français · Português (Brasil) · Русский
+ + + + + + +> Bu belge İngilizce README'nin çevirisidir. İkisi arasında fark varsa güncel olan İngilizce sürümdür. + + + +WidgetDevelopmentKit, iOS uygulamalarına widget geliştirenler için bir Swift paketidir. Ana +Ekran, Kilitli Ekran ve StandBy widget'ları için hazır SwiftUI görünümleri, widget boyutuna +uygun grafik görünümleri, zaman çizelgeleri ve uygulamanın widget'la paylaştığı veriler için +yardımcılar, widget düğmeleri için App Intents ve Live Activities için ActivityKit +öznitelikleri ile görünümleri içerir. Widget uzantısını yine siz yazarsınız; paket sizi +görünümlerle ve her widget'ın ihtiyaç duyduğu tarih, depolama ve yeniden deneme mantığıyla +uğraşmaktan kurtarır. + +## Öne çıkanlar + +- **20 Ana Ekran şablonu** — hava durumu, istatistik, finans, takvim, geri sayım, saat, not, + alıntı, müzik, podcast, haber, fitness halkaları, alışkanlık takibi, yapılacaklar, su, pil + ve daha fazlası. +- **Kilitli Ekran ve StandBy** — 15 aksesuar görünümü (dairesel, dikdörtgen, satır içi) ve 7 + StandBy görünümü. +- **Zaman çizelgesi yardımcıları** — giriş tarihleri, yeniden yükleme politikaları ve süresi + dolan değerleri bilen bir anlık görüntü deposu; widget, uygulamanın App Group üzerinden + kaydettiği veriyi okur. +- **Etkileşimli widget'lar** — 5 App Intent ve bunları çalıştıran düğmelere sahip 8 görünüm. +- **Live Activities** — Kilitli Ekran ve kompakt Dynamic Island görünümleriyle 10 + `ActivityAttributes` türü ve sırası karışmış güncellemeleri reddeden bir durum makinesi. +- **Test edilmiş mantık** — tarih, sayı ve yeniden deneme kodu Swift Testing testleriyle + kapsanır; `NaN`, sıfır hedef ve yaz saati geçiş günleri gibi uç durumlar da dahil. + +## Hızlı başlangıç + +**1. Paketi ekleyin** + +Uygulamanızın bir widget uzantısı olmalı. Henüz yoksa Xcode'da **File › New › Target…** +menüsünü seçin ve **Widget Extension**'ı seçin. Ardından **File › Add Package +Dependencies…** menüsünü seçin, bu adresi sağ üstteki arama alanına yapıştırın ve **Add +Package**'a tıklayın: + +```text +https://github.com/muhittincamdali/iOS-Widget-Development-Kit.git +``` + +Sonraki pencerede `WidgetDevelopmentKit` için **Add to Target** sütununu widget uzantınız +olarak ayarlayın ve **Add Package**'a tıklayın. + +**2. Modülü içe aktarın** + +Widget uzantısındaki bir Swift dosyasının en üstüne ekleyin: + +```swift +import WidgetDevelopmentKit +``` + +**3. Kullanın** + +Bu widget'ı uzantıya ekleyin. Paketin `CountdownWidget` görünümüyle bir tarihe geri sayım +yapar. Ardından `LaunchCountdownWidget()` satırını uzantının `WidgetBundle`'ına, yani +`@main` ile işaretli türe ekleyin. + +```swift +struct LaunchEntry: TimelineEntry { + let date: Date +} + +struct LaunchProvider: TimelineProvider { + func placeholder(in context: Context) -> LaunchEntry { + LaunchEntry(date: .now) + } + + func getSnapshot(in context: Context, completion: @escaping (LaunchEntry) -> Void) { + completion(LaunchEntry(date: .now)) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline
+
+
+English · Türkçe · 简体中文 · 日本語 · 한국어 · Español · Deutsch · Français · Português (Brasil) · Русский
+ + + + + + +> 本文是英文 README 的译文。如两者内容不一致,以英文版为准。 + + + +WidgetDevelopmentKit 是一个 Swift 软件包,面向为 iOS 应用开发小组件的开发者。它包含用于主屏幕、锁定屏幕和 StandBy 小组件的现成 SwiftUI 视图,适合小组件尺寸的图表视图,用于时间线以及应用与小组件共享数据的辅助工具,用于小组件按钮的 App Intents,以及用于 Live Activities 的 ActivityKit 属性和视图。小组件扩展仍需你自己编写;这个软件包为你省去视图,以及每个小组件都需要的日期、存储和重试逻辑。 + +## 亮点 + +- **20 个主屏幕模板** —— 天气、统计、财务、日历、倒计时、时钟、备忘、名言、音乐、播客、新闻、健身圆环、习惯追踪、待办、饮水、电池等。 +- **锁定屏幕和 StandBy** —— 15 个配件视图(圆形、矩形、行内)和 7 个 StandBy 视图。 +- **时间线辅助工具** —— 条目日期、重新加载策略,以及带有效期的快照存储,让小组件读取应用通过 App Group 保存的数据。 +- **交互式小组件** —— 5 个 App Intent,以及 8 个带有调用这些 Intent 的按钮的视图。 +- **Live Activities** —— 10 个 `ActivityAttributes` 类型,带有锁定屏幕视图和紧凑型 Dynamic Island 视图,以及一个拒绝乱序更新的状态机。 +- **经过测试的逻辑** —— 日期、数值和重试代码都有 Swift Testing 测试覆盖,包括 `NaN`、目标为零、夏令时切换日等边界情况。 + +## 快速开始 + +**1. 添加软件包** + +你的应用需要一个小组件扩展。如果还没有,请在 Xcode 中选择 **File › New › Target…**,然后选择 **Widget Extension**。接着选择 **File › Add Package Dependencies…**,把下面的 URL 粘贴到右上角的搜索框中,然后点击 **Add Package**: + +```text +https://github.com/muhittincamdali/iOS-Widget-Development-Kit.git +``` + +在下一个对话框中,把 `WidgetDevelopmentKit` 的 **Add to Target** 设为你的小组件扩展,然后点击 **Add Package**。 + +**2. 导入模块** + +在小组件扩展中某个 Swift 文件的顶部加入: + +```swift +import WidgetDevelopmentKit +``` + +**3. 开始使用** + +把这个小组件添加到扩展中。它使用软件包中的 `CountdownWidget` 视图倒数到某个日期。然后在扩展的 `WidgetBundle`(即标有 `@main` 的类型)中列出 `LaunchCountdownWidget()`。 + +```swift +struct LaunchEntry: TimelineEntry { + let date: Date +} + +struct LaunchProvider: TimelineProvider { + func placeholder(in context: Context) -> LaunchEntry { + LaunchEntry(date: .now) + } + + func getSnapshot(in context: Context, completion: @escaping (LaunchEntry) -> Void) { + completion(LaunchEntry(date: .now)) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline
+
+
+