From 9173cca0124959beb53645046498c4cc8844c301 Mon Sep 17 00:00:00 2001 From: samoht9277 Date: Wed, 22 Apr 2026 00:07:08 -0300 Subject: [PATCH 1/6] fix: compiler warnings for concurrency, preconcurrency, and unreachable nil coalescing --- .../WalkableKit/Services/HealthService.swift | 26 +++++++++++++++---- .../WalkableKit/Services/SyncService.swift | 2 +- .../ViewModels/WatchWalkViewModel.swift | 2 +- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/WalkableKit/Sources/WalkableKit/Services/HealthService.swift b/WalkableKit/Sources/WalkableKit/Services/HealthService.swift index a4924f3..6b008d1 100644 --- a/WalkableKit/Sources/WalkableKit/Services/HealthService.swift +++ b/WalkableKit/Sources/WalkableKit/Services/HealthService.swift @@ -189,12 +189,12 @@ public final class HealthService: NSObject, ObservableObject { guard let route = routes.first else { return [] } + let locationsBox = LocationsBox() return try await withCheckedThrowingContinuation { continuation in - var locations = [CLLocation]() let routeQuery = HKWorkoutRouteQuery(route: route) { _, batch, done, error in if let error { continuation.resume(throwing: error); return } - if let batch { locations.append(contentsOf: batch) } - if done { continuation.resume(returning: locations) } + if let batch { locationsBox.append(batch) } + if done { continuation.resume(returning: locationsBox.all) } } store.execute(routeQuery) } @@ -301,13 +301,13 @@ public final class HealthService: NSObject, ObservableObject { } #if os(watchOS) -extension HealthService: @preconcurrency HKWorkoutSessionDelegate { +extension HealthService: HKWorkoutSessionDelegate { public nonisolated func workoutSession(_ workoutSession: HKWorkoutSession, didChangeTo toState: HKWorkoutSessionState, from fromState: HKWorkoutSessionState, date: Date) {} public nonisolated func workoutSession(_ workoutSession: HKWorkoutSession, didFailWithError error: Error) {} } -extension HealthService: @preconcurrency HKLiveWorkoutBuilderDelegate { +extension HealthService: HKLiveWorkoutBuilderDelegate { public nonisolated func workoutBuilderDidCollectEvent(_ workoutBuilder: HKLiveWorkoutBuilder) {} public nonisolated func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set) { @@ -337,3 +337,19 @@ extension HealthService: @preconcurrency HKLiveWorkoutBuilderDelegate { } } #endif + +/// Thread-safe accumulator for concurrent HKWorkoutRouteQuery callbacks. +private final class LocationsBox: @unchecked Sendable { + private let lock = NSLock() + private var storage = [CLLocation]() + + func append(_ batch: [CLLocation]) { + lock.lock(); defer { lock.unlock() } + storage.append(contentsOf: batch) + } + + var all: [CLLocation] { + lock.lock(); defer { lock.unlock() } + return storage + } +} diff --git a/WalkableKit/Sources/WalkableKit/Services/SyncService.swift b/WalkableKit/Sources/WalkableKit/Services/SyncService.swift index 8986fd6..d69e1ac 100644 --- a/WalkableKit/Sources/WalkableKit/Services/SyncService.swift +++ b/WalkableKit/Sources/WalkableKit/Services/SyncService.swift @@ -321,7 +321,7 @@ public enum WalkHandoffStatus: String, Codable, Sendable { case started, ended } -extension SyncService: @preconcurrency WCSessionDelegate { +extension SyncService: WCSessionDelegate { public nonisolated func session(_ session: WCSession, activationDidCompleteWith state: WCSessionActivationState, error: Error?) { Task { @MainActor in self.activationState = state diff --git a/WalkableWatch/ViewModels/WatchWalkViewModel.swift b/WalkableWatch/ViewModels/WatchWalkViewModel.swift index f58a9f9..cda1844 100644 --- a/WalkableWatch/ViewModels/WatchWalkViewModel.swift +++ b/WalkableWatch/ViewModels/WatchWalkViewModel.swift @@ -104,7 +104,7 @@ final class WatchWalkViewModel { .sink { [weak self] location in guard let self else { return } self.currentLocation = location.coordinate - self.distanceWalked = self.healthService.distanceWalked ?? 0 + self.distanceWalked = self.healthService.distanceWalked // Auto-re-center map if user hasn't swiped in 10 seconds if self.hasZoomedIn && Date().timeIntervalSince(self.lastManualMapInteraction) > 10 { From bf1d55ebf6b88e665e47e7af207b39554bdf3789 Mon Sep 17 00:00:00 2001 From: samoht9277 Date: Wed, 22 Apr 2026 00:09:27 -0300 Subject: [PATCH 2/6] fix: deprecated HKWorkout.totalEnergyBurned/totalDistance, use statistics API --- WalkableApp/ContentView.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/WalkableApp/ContentView.swift b/WalkableApp/ContentView.swift index dd2db88..73950e6 100644 --- a/WalkableApp/ContentView.swift +++ b/WalkableApp/ContentView.swift @@ -1,5 +1,6 @@ import SwiftUI import SwiftData +import HealthKit import WalkableKit struct ContentView: View { @@ -162,7 +163,8 @@ struct ContentView: View { guard !alreadyExists else { continue } // Find the closest matching route by distance - let workoutDistance = workout.totalDistance?.doubleValue(for: .meter()) ?? 0 + let distanceType = HKQuantityType(.distanceWalkingRunning) + let workoutDistance = workout.statistics(for: distanceType)?.sumQuantity()?.doubleValue(for: .meter()) ?? 0 guard let matchingRoute = allRoutes.min(by: { a, b in abs(a.distance - workoutDistance) < abs(b.distance - workoutDistance) }) else { continue } @@ -172,7 +174,8 @@ struct ContentView: View { session.completedAt = workout.endDate session.totalDistance = workoutDistance session.totalDuration = workout.duration - session.calories = workout.totalEnergyBurned?.doubleValue(for: .kilocalorie()) ?? 0 + let energyType = HKQuantityType(.activeEnergyBurned) + session.calories = workout.statistics(for: energyType)?.sumQuantity()?.doubleValue(for: .kilocalorie()) ?? 0 session.source = "healthkit" // Try to fetch the GPS route From ddf2272d4a2e24d1e631ecddaa0e48492eb7eefc Mon Sep 17 00:00:00 2001 From: samoht9277 Date: Wed, 22 Apr 2026 00:27:55 -0300 Subject: [PATCH 3/6] feat: manual sync button in Library, restore @preconcurrency on WCSessionDelegate --- Walkable.xcodeproj/project.pbxproj | 20 ++++++++++++++----- .../xcschemes/WalkableApp.xcscheme | 15 +++++--------- .../xcschemes/WalkableWatch.xcscheme | 2 +- WalkableApp/Views/Library/LibraryView.swift | 8 ++++++++ .../WalkableKit/Services/SyncService.swift | 2 +- 5 files changed, 30 insertions(+), 17 deletions(-) diff --git a/Walkable.xcodeproj/project.pbxproj b/Walkable.xcodeproj/project.pbxproj index 476abbd..5a30401 100644 --- a/Walkable.xcodeproj/project.pbxproj +++ b/Walkable.xcodeproj/project.pbxproj @@ -154,8 +154,8 @@ 44DBE628CD2816AF0CC6C0E3 /* RouteListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteListView.swift; sourceTree = ""; }; 4555554BF8D7071BD426467B /* SaveRouteSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveRouteSheet.swift; sourceTree = ""; }; 4A200AD9B414882AC6C7C572 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 51D80C129C05029BAD7DE958 /* WalkableApp.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = WalkableApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5515782EF765667BB5836D12 /* WalkableWidgets.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = WalkableWidgets.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 51D80C129C05029BAD7DE958 /* WalkableApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WalkableApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5515782EF765667BB5836D12 /* WalkableWidgets.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = WalkableWidgets.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 57B9A25E290E6711909B627B /* WalkableKit */ = {isa = PBXFileReference; lastKnownFileType = folder; path = WalkableKit; sourceTree = SOURCE_ROOT; }; 57F061AAADC8839C2E49EE10 /* WalkTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalkTabView.swift; sourceTree = ""; }; 59A20463D956D4332A76E146 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; @@ -170,7 +170,7 @@ 81BC1E519A2654DE467F8FDE /* WatchRouteDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchRouteDetailView.swift; sourceTree = ""; }; 856C3414EF05FE64556D6E09 /* WalkableApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalkableApp.swift; sourceTree = ""; }; 8855CF19B5A514FC074BB5F7 /* WalkableWatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WalkableWatch.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 91B4EB17D013CF933CC786A8 /* WalkableUITests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = WalkableUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 91B4EB17D013CF933CC786A8 /* WalkableUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WalkableUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 95EBB6A4E8D743C84A1A3EE4 /* LibraryUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryUITests.swift; sourceTree = ""; }; 97764333F6CF336841ABCC15 /* WalkableWatch.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WalkableWatch.entitlements; sourceTree = ""; }; 9A2DD36DF427DED9A72E1EB5 /* WatchWalkViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchWalkViewModel.swift; sourceTree = ""; }; @@ -192,7 +192,7 @@ DCF6B8E22583E08984B290DD /* WatchSummaryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchSummaryView.swift; sourceTree = ""; }; DD25E2B689A23CD64502A618 /* RouteDetailSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteDetailSheet.swift; sourceTree = ""; }; DE469E7A9616DEF652575683 /* WalkControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalkControlsView.swift; sourceTree = ""; }; - E3F1F1C1001288B7384FF7C0 /* WalkableTests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = WalkableTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + E3F1F1C1001288B7384FF7C0 /* WalkableTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WalkableTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; E8EDD0A140E15FF36623E578 /* NowPlayingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NowPlayingView.swift; sourceTree = ""; }; E901C4614536C17E35B73CB1 /* CreateRouteViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateRouteViewModel.swift; sourceTree = ""; }; E9D00E57C3DC5BC436ED09A3 /* WatchMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchMapView.swift; sourceTree = ""; }; @@ -560,7 +560,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1600; + LastUpgradeCheck = 2630; TargetAttributes = { 4C67977720271797BA338E2D = { ProvisioningStyle = Automatic; @@ -765,6 +765,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = HYM2LV4SPQ; INFOPLIST_FILE = WalkableWidgets/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Walkable; LD_RUNPATH_SEARCH_PATHS = ( @@ -820,6 +821,7 @@ CODE_SIGN_ENTITLEMENTS = WalkableApp/WalkableApp.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = HYM2LV4SPQ; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = WalkableApp/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Walkable; @@ -847,6 +849,7 @@ CODE_SIGN_ENTITLEMENTS = WalkableApp/WalkableApp.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = HYM2LV4SPQ; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = WalkableApp/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Walkable; @@ -870,6 +873,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = HYM2LV4SPQ; INFOPLIST_FILE = WalkableWidgets/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Walkable; LD_RUNPATH_SEARCH_PATHS = ( @@ -917,9 +921,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -932,6 +938,7 @@ MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; @@ -1028,9 +1035,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1050,6 +1059,7 @@ MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; diff --git a/Walkable.xcodeproj/xcshareddata/xcschemes/WalkableApp.xcscheme b/Walkable.xcodeproj/xcshareddata/xcschemes/WalkableApp.xcscheme index 8c85c0b..790f0e5 100644 --- a/Walkable.xcodeproj/xcshareddata/xcschemes/WalkableApp.xcscheme +++ b/Walkable.xcodeproj/xcshareddata/xcschemes/WalkableApp.xcscheme @@ -1,11 +1,10 @@ + LastUpgradeVersion = "2630" + version = "1.3"> + buildImplicitDependencies = "YES"> + shouldUseLaunchSchemeArgsEnv = "YES"> + skipped = "NO"> - - Date: Wed, 22 Apr 2026 00:32:10 -0300 Subject: [PATCH 4/6] feat: sync button shows WCSession status (paired, reachable, activation state) --- WalkableApp/Views/Library/LibraryView.swift | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/WalkableApp/Views/Library/LibraryView.swift b/WalkableApp/Views/Library/LibraryView.swift index 3829355..ba6c8cc 100644 --- a/WalkableApp/Views/Library/LibraryView.swift +++ b/WalkableApp/Views/Library/LibraryView.swift @@ -2,6 +2,7 @@ import SwiftUI import SwiftData import UniformTypeIdentifiers import CoreLocation +import WatchConnectivity import WalkableKit struct LibraryView: View { @@ -10,6 +11,8 @@ struct LibraryView: View { @State private var viewModel = LibraryViewModel() @ObservedObject private var locationService = LocationService.shared @State private var showImportPicker = false + @State private var showSyncAlert = false + @State private var syncStatus = "" @State private var importError: String? @State private var showImportError = false @@ -103,7 +106,17 @@ struct LibraryView: View { } ToolbarItem(placement: .primaryAction) { Button { + let session = WCSession.default + let status = """ + Paired: \(session.isPaired) + Watch App Installed: \(session.isWatchAppInstalled) + Reachable: \(session.isReachable) + Activation: \(session.activationState.rawValue) + Routes: \(routes.count) + """ + syncStatus = status SyncService.shared.syncAllRoutes(routes) + showSyncAlert = true Haptics.success() } label: { Image(systemName: "arrow.triangle.2.circlepath") @@ -121,6 +134,11 @@ struct LibraryView: View { } message: { Text(importError ?? "Could not read GPX file.") } + .alert("Sync Status", isPresented: $showSyncAlert) { + Button("OK", role: .cancel) {} + } message: { + Text(syncStatus) + } .sheet(item: $viewModel.selectedRoute) { route in RouteDetailSheet(route: route) { onStartWalk?(route) From 2a1755a5143f8174f5f0c8c4f8f7dcf9abf65639 Mon Sep 17 00:00:00 2001 From: samoht9277 Date: Wed, 22 Apr 2026 23:21:53 -0300 Subject: [PATCH 5/6] fix: set CFBundleVersion + CFBundleShortVersionString on all targets so Watch app installs --- Walkable.xcodeproj/project.pbxproj | 28 ++++++++++------------------ project.yml | 5 +++++ 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/Walkable.xcodeproj/project.pbxproj b/Walkable.xcodeproj/project.pbxproj index 5a30401..63a5bc2 100644 --- a/Walkable.xcodeproj/project.pbxproj +++ b/Walkable.xcodeproj/project.pbxproj @@ -154,9 +154,9 @@ 44DBE628CD2816AF0CC6C0E3 /* RouteListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteListView.swift; sourceTree = ""; }; 4555554BF8D7071BD426467B /* SaveRouteSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveRouteSheet.swift; sourceTree = ""; }; 4A200AD9B414882AC6C7C572 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 51D80C129C05029BAD7DE958 /* WalkableApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WalkableApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5515782EF765667BB5836D12 /* WalkableWidgets.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = WalkableWidgets.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 57B9A25E290E6711909B627B /* WalkableKit */ = {isa = PBXFileReference; lastKnownFileType = folder; path = WalkableKit; sourceTree = SOURCE_ROOT; }; + 51D80C129C05029BAD7DE958 /* WalkableApp.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = WalkableApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5515782EF765667BB5836D12 /* WalkableWidgets.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = WalkableWidgets.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 57B9A25E290E6711909B627B /* WalkableKit */ = {isa = PBXFileReference; lastKnownFileType = folder; name = WalkableKit; path = WalkableKit; sourceTree = SOURCE_ROOT; }; 57F061AAADC8839C2E49EE10 /* WalkTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalkTabView.swift; sourceTree = ""; }; 59A20463D956D4332A76E146 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 5DB7618EACDEED770EA1628E /* WalkableLiveActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalkableLiveActivity.swift; sourceTree = ""; }; @@ -170,7 +170,7 @@ 81BC1E519A2654DE467F8FDE /* WatchRouteDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchRouteDetailView.swift; sourceTree = ""; }; 856C3414EF05FE64556D6E09 /* WalkableApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalkableApp.swift; sourceTree = ""; }; 8855CF19B5A514FC074BB5F7 /* WalkableWatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WalkableWatch.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 91B4EB17D013CF933CC786A8 /* WalkableUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WalkableUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 91B4EB17D013CF933CC786A8 /* WalkableUITests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = WalkableUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 95EBB6A4E8D743C84A1A3EE4 /* LibraryUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryUITests.swift; sourceTree = ""; }; 97764333F6CF336841ABCC15 /* WalkableWatch.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WalkableWatch.entitlements; sourceTree = ""; }; 9A2DD36DF427DED9A72E1EB5 /* WatchWalkViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchWalkViewModel.swift; sourceTree = ""; }; @@ -192,7 +192,7 @@ DCF6B8E22583E08984B290DD /* WatchSummaryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchSummaryView.swift; sourceTree = ""; }; DD25E2B689A23CD64502A618 /* RouteDetailSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteDetailSheet.swift; sourceTree = ""; }; DE469E7A9616DEF652575683 /* WalkControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalkControlsView.swift; sourceTree = ""; }; - E3F1F1C1001288B7384FF7C0 /* WalkableTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WalkableTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + E3F1F1C1001288B7384FF7C0 /* WalkableTests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = WalkableTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; E8EDD0A140E15FF36623E578 /* NowPlayingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NowPlayingView.swift; sourceTree = ""; }; E901C4614536C17E35B73CB1 /* CreateRouteViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateRouteViewModel.swift; sourceTree = ""; }; E9D00E57C3DC5BC436ED09A3 /* WatchMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchMapView.swift; sourceTree = ""; }; @@ -560,7 +560,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 2630; + LastUpgradeCheck = 1600; TargetAttributes = { 4C67977720271797BA338E2D = { ProvisioningStyle = Automatic; @@ -746,7 +746,6 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = WalkableWatch/WalkableWatch.entitlements; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = HYM2LV4SPQ; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_CFBundleDisplayName = Walkable; INFOPLIST_KEY_NSHealthShareUsageDescription = "Walkable reads health data during walks."; @@ -765,7 +764,6 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = HYM2LV4SPQ; INFOPLIST_FILE = WalkableWidgets/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Walkable; LD_RUNPATH_SEARCH_PATHS = ( @@ -821,7 +819,6 @@ CODE_SIGN_ENTITLEMENTS = WalkableApp/WalkableApp.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = HYM2LV4SPQ; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = WalkableApp/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Walkable; @@ -849,7 +846,6 @@ CODE_SIGN_ENTITLEMENTS = WalkableApp/WalkableApp.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = HYM2LV4SPQ; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = WalkableApp/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Walkable; @@ -873,7 +869,6 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = HYM2LV4SPQ; INFOPLIST_FILE = WalkableWidgets/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Walkable; LD_RUNPATH_SEARCH_PATHS = ( @@ -921,11 +916,10 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = YES; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -935,10 +929,10 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 26.0; + MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; - STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; @@ -952,7 +946,6 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = WalkableWatch/WalkableWatch.entitlements; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = HYM2LV4SPQ; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_CFBundleDisplayName = Walkable; INFOPLIST_KEY_NSHealthShareUsageDescription = "Walkable reads health data during walks."; @@ -1035,11 +1028,10 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = YES; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1055,11 +1047,11 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 26.0; + MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; - STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; diff --git a/project.yml b/project.yml index 5bcf98c..3eb7e3b 100644 --- a/project.yml +++ b/project.yml @@ -7,6 +7,11 @@ options: xcodeVersion: "16.0" createIntermediateGroups: true +settings: + base: + CURRENT_PROJECT_VERSION: "1" + MARKETING_VERSION: "1.0" + packages: WalkableKit: path: WalkableKit From fdda3224508c7f7522a2677b0d53d1792402b7fc Mon Sep 17 00:00:00 2001 From: samoht9277 Date: Wed, 22 Apr 2026 23:39:31 -0300 Subject: [PATCH 6/6] fix: re-add CURRENT_PROJECT_VERSION/MARKETING_VERSION (was lost when reverted) --- .../xcshareddata/xcschemes/WalkableApp.xcscheme | 15 ++++++++++----- .../xcshareddata/xcschemes/WalkableWatch.xcscheme | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Walkable.xcodeproj/xcshareddata/xcschemes/WalkableApp.xcscheme b/Walkable.xcodeproj/xcshareddata/xcschemes/WalkableApp.xcscheme index 790f0e5..8c85c0b 100644 --- a/Walkable.xcodeproj/xcshareddata/xcschemes/WalkableApp.xcscheme +++ b/Walkable.xcodeproj/xcshareddata/xcschemes/WalkableApp.xcscheme @@ -1,10 +1,11 @@ + LastUpgradeVersion = "1600" + version = "1.7"> + buildImplicitDependencies = "YES" + runPostActionsOnFailure = "NO"> + shouldUseLaunchSchemeArgsEnv = "YES" + onlyGenerateCoverageForSpecifiedTargets = "NO"> + skipped = "NO" + parallelizable = "NO"> + +