Archived
The companion dropdown in Xcode's target template came up empty, which left
both bundle identifiers starting with a bare dot and
WKCompanionAppBundleIdentifier as an empty string. Both are set explicitly
here, along with the App Group entitlements and watchOS 26 as the floor.
The iOS app had no Embed Watch Content phase, so the watch app would have built
and never shipped. Added, with the matching target dependency: the product now
lands at Calendarr iOS.app/Watch/CalendarrWatch.app with the complications
inside it.
Folders follow what they contain: CalendarrWatch is the app,
CalendarrWatchComplications the extension. Xcode had them the other way round.
Package.resolved is now tracked. It pins AppAuth, whose version drift is what
produced the two compile errors fixed in 75a6a5b.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
55 lines
1.3 KiB
Swift
55 lines
1.3 KiB
Swift
//
|
|
// CalendarrWatchControl.swift
|
|
// CalendarrWatch
|
|
//
|
|
// Created by Guido Schmit on 11.09.2026.
|
|
//
|
|
|
|
import AppIntents
|
|
import SwiftUI
|
|
import WidgetKit
|
|
|
|
struct CalendarrWatchControl: ControlWidget {
|
|
var body: some ControlWidgetConfiguration {
|
|
StaticControlConfiguration(
|
|
kind: ".watchkitapp.CalendarrWatch",
|
|
provider: Provider()
|
|
) { value in
|
|
ControlWidgetToggle(
|
|
"Start Timer",
|
|
isOn: value,
|
|
action: StartTimerIntent()
|
|
) { isRunning in
|
|
Label(isRunning ? "On" : "Off", systemImage: "timer")
|
|
}
|
|
}
|
|
.displayName("Timer")
|
|
.description("A an example control that runs a timer.")
|
|
}
|
|
}
|
|
|
|
extension CalendarrWatchControl {
|
|
struct Provider: ControlValueProvider {
|
|
var previewValue: Bool {
|
|
false
|
|
}
|
|
|
|
func currentValue() async throws -> Bool {
|
|
let isRunning = true // Check if the timer is running
|
|
return isRunning
|
|
}
|
|
}
|
|
}
|
|
|
|
struct StartTimerIntent: SetValueIntent {
|
|
static let title: LocalizedStringResource = "Start a timer"
|
|
|
|
@Parameter(title: "Timer is running")
|
|
var value: Bool
|
|
|
|
func perform() async throws -> some IntentResult {
|
|
// Start / stop the timer based on `value`.
|
|
return .result()
|
|
}
|
|
}
|