df6a5325d8
The extension-side + App Intents surface for design/apple-live-activities-and- widgets.md. The iOS-framework code (WidgetKit/ActivityKit/AppIntents) can't be compiled by the macOS `swift build` CI target and needs the Xcode widget- extension target that only exists once created in the GUI — see the checklist in the memory note. What macOS DID verify: HostEntity (AppIntents is available on macOS), the shared attribute/notification plumbing, and that nothing regressed (142 tests green). Shared (PunktfunkShared): - PunktfunkSessionAttributes (ActivityAttributes) — the one type app + extension share; gated os(iOS) (ActivityKit imports on macOS but its types are unavailable, so canImport would wrongly admit it). - EndStreamIntent (LiveActivityIntent) — posts .punktfunkEndActiveSession. - HostEntity + HostEntityQuery (AppEntity over the shared store) — the intent / widget-config parameter type; canImport(AppIntents), so macOS type-checks it. - New notifications: end-active-session, open-deep-link. M1 widget extension sources (Sources/PunktfunkWidgets/, NOT a SwiftPM target — `swift build` ignores the dir): - PunktfunkWidgetBundle (@main): HostsWidget + PunktfunkSessionLiveActivity. - HostsWidget (kind "PunktfunkHosts"): reads the shared-suite store, sorts by recency, deep-links each host; small/medium/accessory families; empty state. - SessionLiveActivity: Lock-Screen banner + Dynamic Island (elapsed timer, mode line, background countdown, End button). M3 controller (app, iOS): SessionActivityController owns the Activity lifecycle (request/update/end + launch orphan-sweep + staleDate); ContentView drives it from the model's phase/isBackgrounded/backgroundDeadline (which SessionModel now publishes), keeping ActivityKit out of the cross-platform model. M4 (app, iOS): ConnectToHost/WakeHost intents + AppShortcutsProvider; Connect routes via .punktfunkOpenDeepLink into the same onOpenURL router (one set of guards); Wake reuses the WoL path; End surfaced to Shortcuts too. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
21 lines
836 B
Swift
21 lines
836 B
Swift
// The widget extension's entry point. ONE extension target (bundle id io.unom.punktfunk.widgets,
|
|
// iOS only) hosts both the launcher widgets and the Live Activity UI. It links PunktfunkShared and
|
|
// NOTHING else — never PunktfunkKit (Rust staticlib + presentation layer would blow the widget
|
|
// process's ~30 MB budget).
|
|
//
|
|
// These files are NOT part of the SwiftPM package (Package.swift doesn't declare a PunktfunkWidgets
|
|
// target, so `swift build` ignores the directory). They compile only in the Xcode widget-extension
|
|
// target you add pointing at this folder — see design/apple-live-activities-and-widgets.md §M1 and
|
|
// the GUI checklist.
|
|
|
|
import SwiftUI
|
|
import WidgetKit
|
|
|
|
@main
|
|
struct PunktfunkWidgetBundle: WidgetBundle {
|
|
var body: some Widget {
|
|
HostsWidget()
|
|
PunktfunkSessionLiveActivity()
|
|
}
|
|
}
|