Eu uso o CoreMotion CMMotionManager motion.heading
há algum tempo e parece que quando fecho meu aplicativo e o reabro depois de algum tempo, preciso recalibrar a bússola. Por exemplo, tenho uma tela com uma seta apontando para motion.heading. Inicialmente, aponto meu telefone para um local visível a 100 m de distância e ele aponta diretamente para ele. Em algum momento, consigo orientar o telefone exatamente da mesma maneira, mas a seta da bússola é diferente.
Então, na prática, recriei todas as variáveis que pude com a orientação do telefone, a localização do ponto de referência, eu segurando o telefone em relação ao ponto de referência, mas o título às vezes informa um valor diferente.
Atualmente, uso este código para obter informações de título:
import CoreMotion
import SwiftUI
class Compass: ObservableObject {
private var motionManager: CMMotionManager
@Published var heading: Double = 0.0
init() {
self.motionManager = CMMotionManager()
self.startUpdates()
}
private func startUpdates() {
if motionManager.isDeviceMotionAvailable {
motionManager.deviceMotionUpdateInterval = 0.1
motionManager.startDeviceMotionUpdates(to: .main) { [weak self] (motion, error) in
guard let motion = motion else { return }
self?.heading = heading.truncatingRemainder(dividingBy: 360) // normalize for 360 degrees of possible heading rotation
}
}
}
E a seta é exibida apenas em direção ao ponto de referência com uma fórmula de distância com direção envolvida. Mas o valor da direção muda. Existe uma maneira melhor ou mais consistente de obter a direção para a qual o telefone está apontando do que esta? Como usar o norte magnético ou algo estranho assim?
O aplicativo de bússola sempre exibe a mesma coisa em relação ao norte da bússola, então por que o motion.heading às vezes exibe um valor diferente quando o aplicativo de bússola ainda funciona bem?
tente esta abordagem usando um diferente
startDeviceMotionUpdates
, como: