iOS 2.7.3 - Removed Music Integration & Refactoring

This commit is contained in:
2026-02-02 00:00:03 -07:00
parent 25688b0615
commit aa3ddfc7cb
4 changed files with 106 additions and 103 deletions

View File

@@ -466,7 +466,7 @@
CODE_SIGN_ENTITLEMENTS = Ascently/Ascently.entitlements; CODE_SIGN_ENTITLEMENTS = Ascently/Ascently.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 49; CURRENT_PROJECT_VERSION = 50;
DEVELOPMENT_TEAM = 4BC9Y2LL4B; DEVELOPMENT_TEAM = 4BC9Y2LL4B;
DRIVERKIT_DEPLOYMENT_TARGET = 24.6; DRIVERKIT_DEPLOYMENT_TARGET = 24.6;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -491,7 +491,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 15.6; MACOSX_DEPLOYMENT_TARGET = 15.6;
MARKETING_VERSION = 2.7.2; MARKETING_VERSION = 2.7.3;
PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently; PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@@ -518,7 +518,7 @@
CODE_SIGN_ENTITLEMENTS = Ascently/Ascently.entitlements; CODE_SIGN_ENTITLEMENTS = Ascently/Ascently.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 49; CURRENT_PROJECT_VERSION = 50;
DEVELOPMENT_TEAM = 4BC9Y2LL4B; DEVELOPMENT_TEAM = 4BC9Y2LL4B;
DRIVERKIT_DEPLOYMENT_TARGET = 24.6; DRIVERKIT_DEPLOYMENT_TARGET = 24.6;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -543,7 +543,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 15.6; MACOSX_DEPLOYMENT_TARGET = 15.6;
MARKETING_VERSION = 2.7.2; MARKETING_VERSION = 2.7.3;
PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently; PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@@ -610,7 +610,7 @@
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements; CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 49; CURRENT_PROJECT_VERSION = 50;
DEVELOPMENT_TEAM = 4BC9Y2LL4B; DEVELOPMENT_TEAM = 4BC9Y2LL4B;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = SessionStatusLive/Info.plist; INFOPLIST_FILE = SessionStatusLive/Info.plist;
@@ -622,7 +622,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 2.7.2; MARKETING_VERSION = 2.7.3;
PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently.SessionStatusLive; PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently.SessionStatusLive;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
@@ -641,7 +641,7 @@
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements; CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 49; CURRENT_PROJECT_VERSION = 50;
DEVELOPMENT_TEAM = 4BC9Y2LL4B; DEVELOPMENT_TEAM = 4BC9Y2LL4B;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = SessionStatusLive/Info.plist; INFOPLIST_FILE = SessionStatusLive/Info.plist;
@@ -653,7 +653,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 2.7.2; MARKETING_VERSION = 2.7.3;
PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently.SessionStatusLive; PRODUCT_BUNDLE_IDENTIFIER = com.atridad.Ascently.SessionStatusLive;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;

View File

@@ -244,7 +244,7 @@ struct AddEditProblemView: View {
let tempImagePaths = imagePaths.filter { !$0.isEmpty && !imagePaths.contains($0) } let tempImagePaths = imagePaths.filter { !$0.isEmpty && !imagePaths.contains($0) }
for imagePath in tempImagePaths { for imagePath in tempImagePaths {
ImageManager.shared.deleteImage(atPath: imagePath) _ = ImageManager.shared.deleteImage(atPath: imagePath)
} }
let newImagePaths = imagePaths.filter { !$0.isEmpty } let newImagePaths = imagePaths.filter { !$0.isEmpty }

View File

@@ -682,8 +682,8 @@ struct ExportDataView: View {
private func cleanupTempFile() { private func cleanupTempFile() {
if let fileURL = tempFileURL { if let fileURL = tempFileURL {
let logTag = Self.logTag // Capture before entering async closure let logTag = Self.logTag
// Clean up after a delay to ensure sharing is complete
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) { DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
try? FileManager.default.removeItem(at: fileURL) try? FileManager.default.removeItem(at: fileURL)
AppLogger.debug( AppLogger.debug(
@@ -752,80 +752,84 @@ struct SyncSection: View {
} }
.foregroundColor(.primary) .foregroundColor(.primary)
if syncService.isConfigured { // Sync Now - show with proper opacity when not available
Button(action: {
// Sync Now - only show if connected
if syncService.isConnected { if syncService.isConnected {
Button(action: { performSync()
performSync()
}) {
HStack {
if syncService.isSyncing {
ProgressView()
.scaleEffect(0.8)
Text("Syncing...")
.foregroundColor(.secondary)
} else {
Image(systemName: "arrow.triangle.2.circlepath")
.foregroundColor(.green)
Text("Sync Now")
Spacer()
if let lastSync = syncService.lastSyncTime {
Text(
RelativeDateTimeFormatter().localizedString(
for: lastSync, relativeTo: Date())
)
.font(.caption)
.foregroundColor(.secondary)
}
}
}
}
.disabled(syncService.isSyncing)
.foregroundColor(.primary)
} }
}) {
// Auto-sync configuration - always visible for testing
HStack { HStack {
VStack(alignment: .leading) { if syncService.isSyncing {
Text("Auto-sync") ProgressView()
Text("Sync automatically on app launch and data changes") .scaleEffect(0.8)
Text("Syncing...")
.foregroundColor(.secondary)
} else {
Image(systemName: "arrow.triangle.2.circlepath")
.foregroundColor(syncService.isConnected ? .green : .secondary)
Text("Sync Now")
.foregroundColor(syncService.isConnected ? .primary : .secondary)
Spacer()
if let lastSync = syncService.lastSyncTime {
Text(
RelativeDateTimeFormatter().localizedString(
for: lastSync, relativeTo: Date())
)
.font(.caption) .font(.caption)
.foregroundColor(.secondary) .foregroundColor(.secondary)
}
Spacer()
Toggle(
"",
isOn: Binding(
get: { syncService.isAutoSyncEnabled },
set: { syncService.isAutoSyncEnabled = $0 }
)
)
.disabled(!syncService.isConnected)
}
.foregroundColor(.primary)
// Disconnect option - only show if connected
if syncService.isConnected {
Button(action: {
showingDisconnectAlert = true
}) {
HStack {
Image(systemName: "power")
.foregroundColor(.orange)
Text("Disconnect")
Spacer()
} }
} }
.foregroundColor(.primary)
} }
}
.disabled(!syncService.isConnected || syncService.isSyncing)
.opacity(syncService.isConfigured ? 1.0 : 0.6)
if let error = syncService.syncError { // Auto-sync configuration
HStack {
VStack(alignment: .leading) {
Text("Auto-sync")
Text("Sync automatically on app launch and data changes")
.font(.caption)
.foregroundColor(.secondary)
}
Spacer()
Toggle(
"",
isOn: Binding(
get: { syncService.isAutoSyncEnabled },
set: { syncService.isAutoSyncEnabled = $0 }
)
)
.disabled(!syncService.isConnected)
}
.opacity(syncService.isConfigured ? 1.0 : 0.6)
// Disconnect option
Button(action: {
if syncService.isConnected {
showingDisconnectAlert = true
}
}) {
HStack {
Image(systemName: "power")
.foregroundColor(syncService.isConnected ? .orange : .secondary)
Text("Disconnect")
.foregroundColor(syncService.isConnected ? .primary : .secondary)
Spacer()
}
}
.disabled(!syncService.isConnected)
.opacity(syncService.isConfigured ? 1.0 : 0.6)
// Error message
if let error = syncService.syncError {
HStack {
Text(error) Text(error)
.font(.caption) .font(.caption)
.foregroundColor(.red) .foregroundColor(.red)
.padding(.leading, 24) Spacer()
} }
.padding(.leading, 24)
} }
} }
.alert("Disconnect from Server", isPresented: $showingDisconnectAlert) { .alert("Disconnect from Server", isPresented: $showingDisconnectAlert) {
@@ -1215,34 +1219,32 @@ struct HealthKitSection: View {
.foregroundColor(.secondary) .foregroundColor(.secondary)
} }
} else { } else {
Toggle( Toggle(isOn: Binding(
isOn: Binding( get: { healthKitService.isEnabled },
get: { healthKitService.isEnabled }, set: { newValue in
set: { newValue in if newValue && !healthKitService.isAuthorized {
if newValue && !healthKitService.isAuthorized { isRequestingAuthorization = true
isRequestingAuthorization = true Task {
Task { do {
do { try await healthKitService.requestAuthorization()
try await healthKitService.requestAuthorization() await MainActor.run {
await MainActor.run { healthKitService.setEnabled(true)
healthKitService.setEnabled(true) isRequestingAuthorization = false
isRequestingAuthorization = false }
} } catch {
} catch { await MainActor.run {
await MainActor.run { showingAuthorizationError = true
showingAuthorizationError = true isRequestingAuthorization = false
isRequestingAuthorization = false
}
} }
} }
} else if newValue {
healthKitService.setEnabled(true)
} else {
healthKitService.setEnabled(false)
} }
} else if newValue {
healthKitService.setEnabled(true)
} else {
healthKitService.setEnabled(false)
} }
) }
) { )) {
HStack { HStack {
Image(systemName: "heart.fill") Image(systemName: "heart.fill")
.foregroundColor(.red) .foregroundColor(.red)
@@ -1250,14 +1252,15 @@ struct HealthKitSection: View {
} }
} }
.disabled(isRequestingAuthorization) .disabled(isRequestingAuthorization)
if healthKitService.isEnabled { if healthKitService.isEnabled {
VStack(alignment: .leading, spacing: 4) { HStack {
Text( VStack(alignment: .leading, spacing: 4) {
"Climbing sessions will be recorded as workouts in Apple Health" Text("Climbing sessions will be recorded as workouts in Apple Health")
) .font(.caption)
.font(.caption) .foregroundColor(.secondary)
.foregroundColor(.secondary) }
Spacer()
} }
} }
} }