fix(ios): resolve Swift compile errors for iOS 26 / Xcode 26

- Fix CloudKitSyncManager deinit concurrency violation
- Replace deprecated List(selection:) with VStack+ForEach sidebar
- Replace removed Animation.none with Animation.linear(duration: 0)
- Fix CountdownRing initializer parameter mismatch
- Unwrap optional timer.duration in ShareableTimerManager and DataExportManager
- Add missing .event case to exhaustive switch
- Change CascadeWarning.scheduledTime from let to var
- Fix CalendarSyncManager CMTimer init (add elapsedBeforePause, remove non-existent params)
- Add missing UserNotifications import in SleepManager
- Remove parameterized App Intents phrases (iOS 26 restriction)
- Temporarily remove watchOS target dependency for iOS build
This commit is contained in:
saravanakumardb1 2026-03-19 14:22:50 -07:00
parent 403d35e016
commit 424e804396
15 changed files with 1242 additions and 51 deletions

File diff suppressed because it is too large Load Diff

View File

@ -35,6 +35,20 @@
ReferencedContainer = "container:ChronoMind.xcodeproj"> ReferencedContainer = "container:ChronoMind.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildActionEntry> </BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "7028351BB1945332C6B77BA3"
BuildableName = "ChronoMindWidgets.appex"
BlueprintName = "ChronoMindWidgets"
ReferencedContainer = "container:ChronoMind.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction

View File

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1600"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
runPostActionsOnFailure = "NO">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C0E0F171B21355486B744330"
BuildableName = "ChronoMindMac.app"
BlueprintName = "ChronoMindMac"
ReferencedContainer = "container:ChronoMind.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
onlyGenerateCoverageForSpecifiedTargets = "NO">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C0E0F171B21355486B744330"
BuildableName = "ChronoMindMac.app"
BlueprintName = "ChronoMindMac"
ReferencedContainer = "container:ChronoMind.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C0E0F171B21355486B744330"
BuildableName = "ChronoMindMac.app"
BlueprintName = "ChronoMindMac"
ReferencedContainer = "container:ChronoMind.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
</CommandLineArguments>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C0E0F171B21355486B744330"
BuildableName = "ChronoMindMac.app"
BlueprintName = "ChronoMindMac"
ReferencedContainer = "container:ChronoMind.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
</CommandLineArguments>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1600"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
runPostActionsOnFailure = "NO">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E15B7150D85F1ED89481E2A0"
BuildableName = "ChronoMindWatch.app"
BlueprintName = "ChronoMindWatch"
ReferencedContainer = "container:ChronoMind.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8A2AE3A5C26A2CC7420F50C0"
BuildableName = "ChronoMindWatchComplications.appex"
BlueprintName = "ChronoMindWatchComplications"
ReferencedContainer = "container:ChronoMind.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
onlyGenerateCoverageForSpecifiedTargets = "NO">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E15B7150D85F1ED89481E2A0"
BuildableName = "ChronoMindWatch.app"
BlueprintName = "ChronoMindWatch"
ReferencedContainer = "container:ChronoMind.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E15B7150D85F1ED89481E2A0"
BuildableName = "ChronoMindWatch.app"
BlueprintName = "ChronoMindWatch"
ReferencedContainer = "container:ChronoMind.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
</CommandLineArguments>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E15B7150D85F1ED89481E2A0"
BuildableName = "ChronoMindWatch.app"
BlueprintName = "ChronoMindWatch"
ReferencedContainer = "container:ChronoMind.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
</CommandLineArguments>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -72,13 +72,23 @@ struct ContentView: View {
private var iPadLayout: some View { private var iPadLayout: some View {
NavigationSplitView { NavigationSplitView {
// Sidebar // Sidebar
List(Tab.allCases, selection: $selectedTab) { tab in VStack(spacing: 0) {
Label(tab.rawValue, systemImage: tab.icon) ForEach(Tab.allCases) { tab in
.tag(tab) Button {
selectedTab = tab
} label: {
Label(tab.rawValue, systemImage: tab.icon)
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal, 16)
.padding(.vertical, 10)
.background(selectedTab == tab ? CMColors.accent.opacity(0.15) : Color.clear)
.cornerRadius(8)
}
.buttonStyle(.plain)
}
} }
.padding(.horizontal, 8)
.navigationTitle("ChronoMind") .navigationTitle("ChronoMind")
.listStyle(.sidebar)
.scrollContentBackground(.hidden)
.background(CMColors.bg) .background(CMColors.bg)
} detail: { } detail: {
// Detail pane // Detail pane
@ -155,8 +165,14 @@ struct ContentView: View {
// Countdown // Countdown
CountdownRing( CountdownRing(
timer: timer, progress: {
now: timerStore.now, guard let duration = timer.duration, duration > 0 else { return 0 }
let remaining = max(0, timer.targetTime.timeIntervalSince(timerStore.now))
return 1.0 - (remaining / duration)
}(),
urgency: timer.urgency,
remainingSeconds: max(0, timer.targetTime.timeIntervalSince(timerStore.now)),
totalSeconds: timer.duration ?? 0,
size: 180 size: 180
) )
.frame(maxWidth: .infinity) .frame(maxWidth: .infinity)

View File

@ -80,7 +80,7 @@ struct ReduceMotionModifier: ViewModifier {
extension View { extension View {
/// Apply animation that respects Reduce Motion setting /// Apply animation that respects Reduce Motion setting
func motionSafe(_ animation: Animation, reduced: Animation = .none) -> some View { func motionSafe(_ animation: Animation, reduced: Animation = .linear(duration: 0)) -> some View {
modifier(ReduceMotionModifier(animation: animation, reducedAnimation: reduced)) modifier(ReduceMotionModifier(animation: animation, reducedAnimation: reduced))
} }
} }

View File

@ -142,16 +142,16 @@ final class CalendarSyncManager: ObservableObject {
var timer = CMTimer( var timer = CMTimer(
id: stableId, id: stableId,
type: .alarm,
label: event.title ?? "Calendar Event", label: event.title ?? "Calendar Event",
description: event.location, description: event.location,
type: .alarm,
state: .active,
urgency: urgency, urgency: urgency,
duration: event.endDate.timeIntervalSince(startDate), state: .active,
targetTime: startDate, targetTime: startDate,
duration: event.endDate.timeIntervalSince(startDate),
createdAt: Date(), createdAt: Date(),
startedAt: Date(), startedAt: Date(),
category: "calendar", elapsedBeforePause: 0,
cascade: CascadeConfig(preset: .standard, intervals: []), cascade: CascadeConfig(preset: .standard, intervals: []),
warnings: calculateCascadeWarnings( warnings: calculateCascadeWarnings(
targetTime: startDate, targetTime: startDate,
@ -159,9 +159,7 @@ final class CalendarSyncManager: ObservableObject {
now: Date() now: Date()
), ),
snoozeCount: 0, snoozeCount: 0,
isCalendarSync: true, category: "calendar"
calendarEventId: event.eventIdentifier,
calendarColor: event.calendar.cgColor
) )
return timer return timer

View File

@ -40,7 +40,9 @@ final class CloudKitSyncManager: ObservableObject {
} }
deinit { deinit {
stopSync() if let observer = observer {
NotificationCenter.default.removeObserver(observer)
}
} }
// MARK: - Sync Control // MARK: - Sync Control

View File

@ -187,7 +187,7 @@ struct TimerExport: Codable {
self.type = timer.type.rawValue self.type = timer.type.rawValue
self.state = timer.state.rawValue self.state = timer.state.rawValue
self.urgency = timer.urgency.rawValue self.urgency = timer.urgency.rawValue
self.duration = timer.duration self.duration = timer.duration ?? 0
self.targetTime = timer.targetTime self.targetTime = timer.targetTime
self.createdAt = timer.createdAt self.createdAt = timer.createdAt
self.completedAt = timer.completedAt self.completedAt = timer.completedAt

View File

@ -27,7 +27,7 @@ final class ShareableTimerManager: ObservableObject {
code: shareCode, code: shareCode,
label: timer.label, label: timer.label,
type: timer.type, type: timer.type,
durationSeconds: timer.duration, durationSeconds: timer.duration ?? 0,
urgency: timer.urgency, urgency: timer.urgency,
cascadePreset: timer.cascade.preset, cascadePreset: timer.cascade.preset,
category: timer.category, category: timer.category,
@ -99,6 +99,14 @@ final class ShareableTimerManager: ObservableObject {
rounds: 4 rounds: 4
) )
)) ))
case .event:
// Events need a target date set to duration from now
return createAlarm(CreateAlarmParams(
label: shared.label,
targetTime: Date().addingTimeInterval(shared.durationSeconds),
urgency: shared.urgency,
cascade: CascadeConfig(preset: shared.cascadePreset, intervals: [])
))
} }
} }

View File

@ -5,6 +5,7 @@
import Foundation import Foundation
import HealthKit import HealthKit
import Combine import Combine
import UserNotifications
@MainActor @MainActor
final class SleepManager: ObservableObject { final class SleepManager: ObservableObject {

View File

@ -47,7 +47,7 @@ struct CascadeWarning: Codable, Identifiable, Equatable {
let minutesBefore: Int let minutesBefore: Int
var fired: Bool var fired: Bool
var firedAt: Date? var firedAt: Date?
let scheduledTime: Date var scheduledTime: Date
static func == (lhs: CascadeWarning, rhs: CascadeWarning) -> Bool { static func == (lhs: CascadeWarning, rhs: CascadeWarning) -> Bool {
lhs.id == rhs.id lhs.id == rhs.id

View File

@ -135,8 +135,6 @@ struct ChronoMindShortcutsProvider: AppShortcutsProvider {
intent: SetTimerIntent(), intent: SetTimerIntent(),
phrases: [ phrases: [
"Set a timer in \(.applicationName)", "Set a timer in \(.applicationName)",
"Set a \(\.$minutes) minute timer in \(.applicationName)",
"Start a \(\.$minutes) minute timer called \(\.$label) in \(.applicationName)",
], ],
shortTitle: "Set Timer", shortTitle: "Set Timer",
systemImageName: "timer" systemImageName: "timer"
@ -147,7 +145,6 @@ struct ChronoMindShortcutsProvider: AppShortcutsProvider {
phrases: [ phrases: [
"Start Pomodoro in \(.applicationName)", "Start Pomodoro in \(.applicationName)",
"Start a focus session in \(.applicationName)", "Start a focus session in \(.applicationName)",
"Start a \(\.$workMinutes) minute Pomodoro in \(.applicationName)",
], ],
shortTitle: "Start Pomodoro", shortTitle: "Start Pomodoro",
systemImageName: "target" systemImageName: "target"

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.chronomind.shared</string>
</array>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>

View File

@ -48,7 +48,7 @@ targets:
INFOPLIST_KEY_NSSupportsLiveActivities: true INFOPLIST_KEY_NSSupportsLiveActivities: true
dependencies: dependencies:
- target: ChronoMindWidgets - target: ChronoMindWidgets
- target: ChronoMindWatch # - target: ChronoMindWatch # Temporarily removed — watchOS target can't build on iOS Simulator
- package: ByteLystPlatformSDK - package: ByteLystPlatformSDK
entitlements: entitlements:
path: ChronoMind/ChronoMind.entitlements path: ChronoMind/ChronoMind.entitlements