fix: Dynamic Island, Live Activity errors, background audio stop, CFBundleVersion
Some checks failed
CI / Deploy (pull_request) Has been skipped
PR → Build → WiFi/USB Deploy → LGTM / Wait for LGTM comment (pull_request) Failing after 8m7s
CI / Detect Changes (pull_request) Successful in 3s
CI / Admin Web CI (pull_request) Has been skipped
CI / YouTube Worker (pull_request) Has been skipped
PR → Build → WiFi/USB Deploy → LGTM / Build & Deploy to iPhone (WiFi/USB) (pull_request) Successful in 2m58s

Phase 1 — Audio background resilience:
- Remove .mixWithOthers, app takes audio focus for coach cues
- Add AVAudioSession.interruptionNotification handler (re-activates after calls/Siri)
- Add AVAudioSession.routeChangeNotification handler (re-activates on headphone changes)

Phase 2 — Live Activity error surfacing:
- PlayerViewModel: @Published liveActivityError captures auth-denied + request errors
- PlayerView: translucent error banner with dismiss button (non-blocking)

Phase 3 — CFBundleVersion 1→2 in all 4 Info.plist files (match project.yml CURRENT_PROJECT_VERSION: 2)
This commit is contained in:
Millian Lamiaux
2026-07-04 17:54:09 +02:00
parent 560b056dc9
commit 40ffb04f31
7 changed files with 89 additions and 6 deletions

View File

@@ -66,6 +66,40 @@ struct PlayerView: View {
}
}
//
// Live Activity error banner (non-blocking)
//
if let error = vm.liveActivityError {
VStack {
HStack(spacing: 8) {
Image(systemName: "exclamationmark.triangle.fill")
.font(.caption)
.foregroundStyle(.yellow)
Text(error)
.font(.caption2.weight(.medium))
.foregroundStyle(.white.opacity(0.9))
Spacer()
Button {
vm.liveActivityError = nil
} label: {
Image(systemName: "xmark")
.font(.system(size: 10, weight: .bold))
.foregroundStyle(.white.opacity(0.6))
}
}
.padding(.horizontal, 16)
.padding(.vertical, 10)
.background(.ultraThinMaterial.opacity(0.9))
.clipShape(RoundedRectangle(cornerRadius: 12))
.padding(.horizontal, 16)
.padding(.top, 60)
Spacer()
}
.transition(.move(edge: .top).combined(with: .opacity))
.animation(.spring(duration: 0.3), value: vm.liveActivityError)
.zIndex(100)
}
//
// Layer 4 Compact timer ring (top-right corner)
//