Appearance
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.
