Appearance
Video Workouts
Video workouts are launched with GoVideoController (or a subclass) using the same GraphQL + token flow as classic workouts.
1. Detect video session and launch
swift
if response.data?.publicWorkoutSession.asWorkoutVideoSession != nil {
let controller = try await MonVideoGoController(data: data, token: token)
controller.modalPresentationStyle = .fullScreen
present(controller, animated: true)
}2. Handle async save in a video controller subclass
swift
final class MonVideoGoController: GoVideoController {
private var savePublisher: AnyPublisher<Void, Never>?
override func saveSession(state: SaveWorkoutState) {
super.saveSession(state: state)
savePublisher = Future<Void, Never> { promise in
// Replace with your backend persistence.
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
promise(.success(()))
}
}.eraseToAnyPublisher()
}
}3. Add cast controls with a remote manager
swift
override func viewDidLoad() {
super.viewDidLoad()
let castButton = GCKUICastButton()
castButton.tintColor = .white
topLeftStack.addArrangedSubview(castButton)
let manager = GoogleCastManager(video: video, metadata: metadata)
remoteManager = manager
}When Cast support is enabled, the remote manager coordinates playback state between WorkoutKit and the cast session.
For complete production setup (Info.plist permissions, GCKCastContext bootstrap, session listeners, and RemoteManager implementation), see Google Cast for Video Workouts.
