Vitesse en km/h sur la montre et dans la Live Activity
Suite de la demande : voir des km/h en courant, ce que l'app Exercice d'Apple ne permet pas (vitesse réservée au vélo, allure min/km imposée en course, aucun réglage). La vitesse instantanée vient de HealthKit lui-même : HKLiveWorkoutDataSource collecte .runningSpeed d'office en course extérieure (Series 6+) et .cyclingSpeed à vélo (watchOS 11+). Elle est lue en mostRecentQuantity — c'est la vitesse à l'instant t qu'on veut afficher, pas la moyenne de la séance. Sur un appareil qui ne la produit pas, repli sur distance/temps. Affichée sur les trois surfaces : écran de séance de la montre, Live Activity (bannière + île dépliée) et vue native /live. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,10 @@ struct CoachLiveActivityAttributes: ActivityAttributes {
|
||||
var heartRate: Double
|
||||
var activeEnergyKcal: Double
|
||||
var distanceMeters: Double
|
||||
/// Vitesse instantanée en km/h (mesurée par la montre, sinon moyenne
|
||||
/// dérivée). Apple n'affiche jamais de km/h en course : c'est le
|
||||
/// principal apport de cette Live Activity face à l'app Exercice.
|
||||
var speedKmh: Double = 0
|
||||
var elapsedSec: TimeInterval
|
||||
var isLive: Bool // true = direct ; false = perdu/en pause
|
||||
/// Séance mise en pause sur la montre. Pilote le libellé du bouton
|
||||
|
||||
@@ -48,6 +48,11 @@ struct CoachLiveActivityWidget: Widget {
|
||||
unit: "km",
|
||||
color: .orange)
|
||||
Divider().frame(height: 28)
|
||||
metricInline(label: "Vitesse",
|
||||
value: speedText(context.state),
|
||||
unit: "km/h",
|
||||
color: .cyan)
|
||||
Divider().frame(height: 28)
|
||||
metricInline(label: "Durée",
|
||||
value: elapsedText(context.state.elapsedSec),
|
||||
unit: "",
|
||||
@@ -102,6 +107,7 @@ struct CoachLiveActivityWidget: Widget {
|
||||
metricBlock(value: hrText(context.state), unit: "bpm", color: .red)
|
||||
metricBlock(value: kcalText(context.state), unit: "kcal", color: .green)
|
||||
metricBlock(value: distKmText(context.state), unit: "km", color: .orange)
|
||||
metricBlock(value: speedText(context.state), unit: "km/h", color: .cyan)
|
||||
metricBlock(value: elapsedText(context.state.elapsedSec), unit: "", color: .white)
|
||||
}
|
||||
controls(state: context.state)
|
||||
@@ -186,6 +192,9 @@ struct CoachLiveActivityWidget: Widget {
|
||||
private func distKmText(_ s: CoachLiveActivityAttributes.ContentState) -> String {
|
||||
s.distanceMeters > 0 ? String(format: "%.2f", s.distanceMeters / 1000) : "—"
|
||||
}
|
||||
private func speedText(_ s: CoachLiveActivityAttributes.ContentState) -> String {
|
||||
s.speedKmh > 0 ? String(format: "%.1f", s.speedKmh) : "—"
|
||||
}
|
||||
private func elapsedText(_ sec: TimeInterval) -> String {
|
||||
let total = Int(sec)
|
||||
let h = total / 3600
|
||||
|
||||
Reference in New Issue
Block a user