Skip to content

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.

Source references