I managed to solve this myself. It turns out initializing the CMAltimeter in the onAppear function caused the reference to not stick around, which for unclear reasons meant that relative altitude updates would never be delivered even though absolute updates were. Moving
let altimeter = CMAltimeter()
to the top level of the file made things work perfectly.