Skip to content

Classic Workouts

Classic workouts are launched with GoModeController (or a subclass) after fetching a block-session payload and a valid WorkoutKit token.

1. Fetch session payload and token

swift
let response = try await DemoCloudClient.shared.fetch(
    query: GetSessionContentQuery(id: item.id),
    cachePolicy: .networkOnly
)

guard let wk = response.extensions?["workoutkit"] as? [String: String],
      let token = wk["token"] else {
    return
}

guard let data = try? response.data?.publicWorkoutSession.asJSONData() else {
    return
}

This payload must resolve to a block session before you create the classic controller.

2. Create and present the classic controller

swift
if response.data?.publicWorkoutSession.asWorkoutBlockSession != nil {
    let controller = try await MonGoModeController(data: data, token: token)
    controller.modalPresentationStyle = .fullScreen
    present(controller, animated: true)
}

MonGoModeController in this example is your host-app subclass of GoModeController.

3. Customize session save behavior

swift
final class MonGoModeController: GoModeController {
    private var subscriptions = Set<AnyCancellable>()
    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()
    }

    override func displayPostWorkout() -> AnyPublisher<Void, Never> {
        guard let savePublisher else { return super.displayPostWorkout() }
        return savePublisher
    }
}

This pattern ensures that WorkoutKit waits for the asynchronous save process to finish before completing the workout.

Source references