O framework Core Motion é um componente do sistema iOS que fornece acesso aos dados do acelerômetro, giroscópio, magnetômetro e pedômetro em dispositivos Apple. De acordo com a Apple Developer Documentation, 2025, o framework processa dados brutos dos sensores e os converte em métricas compreensíveis — aceleração, velocidade angular, orientação e número de passos. Uma única API para todos os sensores de movimento permite que desenvolvedores criem pedômetros, aplicativos de fitness e jogos com controle de inclinação do dispositivo.
Pontos principais
Core Motion é um framework de sistema da Apple, apresentado no iOS 4 para trabalhar com sensores de movimento do dispositivo. Ele fornece uma interface unificada para acessar o acelerômetro, giroscópio, magnetômetro e pedômetro, liberando o desenvolvedor da necessidade de trabalhar com drivers de hardware em baixo nível.
A principal vantagem do Core Motion é a filtragem por hardware de dados. O framework combina automaticamente as leituras do acelerômetro e do giroscópio para calcular a userAcceleration pura sem o componente gravitacional, e também fornece a orientação do dispositivo no espaço na forma de quatérnions e ângulos de Euler.
De acordo com a Apple WWDC 2023, o Core Motion é usado em mais de 80% dos aplicativos de fitness na App Store. O framework é otimizado para consumo de energia — a frequência de consulta dos sensores diminui automaticamente quando não há assinantes, prolongando a vida útil da bateria do dispositivo.
Uma característica arquitetural importante é o uso do coprocessador da série M (Motion coprocessor), que processa dados dos sensores de movimento independentemente do processador principal da série A. A partir do chip M7 (iPhone 5S), o coprocessador coleta continuamente dados do acelerômetro e giroscópio, permitindo que CMPedometer e CMAltimeter funcionem em segundo plano com a tela bloqueada consumindo menos de 1 mW. Isso foi possível graças ao isolamento de hardware: o coprocessador tem sua própria memória não volátil e barramento de dados independente do sistema principal.
A arquitetura do Core Motion é baseada em um modelo singleton através do CMMotionManager. O aplicativo obtém uma única instância do gerenciador e através dela configura a frequência de atualização, inicia ou interrompe a coleta de dados para cada tipo de sensor. Os dados chegam através de blocos de fechamento no intervalo especificado.
O framework usa dois modos de obtenção de dados: pull (consulta ativa via startAccelerometerUpdates) e push (recepção passiva via startAccelerometerUpdatesToQueue). O modo push é preferível para aplicativos de UI, pois os dados são entregues na fila especificada sem bloquear a thread principal.
import CoreMotion
let motionManager = CMMotionManager()
motionManager.accelerometerUpdateInterval = 0.1
guard motionManager
.isAccelerometerAvailable else { return }
motionManager.startAccelerometerUpdates(
to: OperationQueue.current()!
) { data, _ in
guard let accel = data?.acceleration else { return }
print("X: \(accel.x), Y: \(accel.y), Z: \(accel.z)")
}
Core Motion fornece acesso a quatro categorias de sensores: o acelerômetro mede a aceleração linear em três eixos, o giroscópio mede a velocidade angular de rotação e o magnetômetro mede a intensidade do campo magnético para a bússola. A quarta categoria são os dados combinados do CMDeviceMotion, que incluem leituras filtradas de todos os sensores.
CMDeviceMotion é a classe mais valiosa para o desenvolvimento. Ela fornece userAcceleration (aceleração sem gravidade), rotationRate (velocidade de rotação), magneticField (vetor do campo magnético) e attitude (orientação do dispositivo como um quatérnion ou ângulos de Euler). Para calcular a attitude, o Core Motion usa a fusão de sensores do giroscópio e acelerômetro usando um algoritmo semelhante a um filtro complementar.
O magnetômetro é usado para a correção de deriva do giroscópio. Um giroscópio puro acumula erros ao longo do tempo devido à deriva térmica e ruído — o magnetômetro e o acelerômetro corrigem esse erro, fornecendo precisão de orientação de 1 a 2 graus em posição estática.
guard motionManager
.isDeviceMotionAvailable else { return }
motionManager.deviceMotionUpdateInterval = 1.0 // 1 Hz
motionManager.startDeviceMotionUpdates(
using: .xArbitraryZVertical,
to: OperationQueue.current()!
) { motion, _ in
guard let attitude = motion?.attitude else { return }
print("Roll: \(attitude.roll)")
print("Pitch: \(attitude.pitch)")
print("Yaw: \(attitude.yaw)")
}
CMPedometer — classe para contar passos, distância percorrida e ritmo de movimento. Ela usa dados do acelerômetro com processamento por hardware no coprocessador de movimento da série M (M7/M8/M9/M10/M11). Isso permite que funcione em segundo plano com consumo mínimo de energia — cerca de 1% de bateria por 8 horas de rastreamento contínuo.
CMAltimeter — classe para determinar a altitude relativa com base no barômetro instalado no iPhone 6 e versões posteriores. Mostra a mudança de altitude em relação ao ponto inicial com precisão de cerca de 1 metro. É usado em aplicativos de fitness para contar andares e em aplicativos de navegação para determinar mudanças de elevação.
Os dados do CMPedometer estão disponíveis com um atraso de no máximo 5 segundos para leituras atuais. Para dados históricos, há uma consulta de até 7 dias através do queryPedometerData. O pedômetro reconhece automaticamente caminhada, corrida e ciclismo — esses tipos de atividade estão disponíveis através do queryPedometerData com filtragem por tipo.
A precisão do CMPedometer é de aproximadamente 95% durante a caminhada normal e diminui para 90% durante a corrida. A precisão é afetada por: posição do telefone no bolso ou mochila, tipo de calçado e superfície. A Apple recomenda usar o CMPedometer em combinação com o Core Location para determinação de distância ao ar livre — o GPS fornece distância mais precisa enquanto o Core Motion lida com a contagem de passos.
let pedometer = CMPedometer()
guard CMPedometer
.isStepCountingAvailable() else { return }
pedometer.startUpdates(from: Date()) { data, _ in
guard let pedData = pedometerData else { return }
print("Passos: \(pedData.numberOfSteps)")
print("Distância: \(pedData.distance)")
}
// Acesso ao altímetro
let altimeter = CMAltimeter()
altimeter.startRelativeAltitudeUpdates(
to: OperationQueue.current()!
) { data, _ in
print("Altitude: \(data?.relativeAltitude)")
}
A integração do Core Motion não requer permissões especiais ou entitlements — basta adicionar a importação do framework e criar uma instância do CMMotionManager. No entanto, para o CMPedometer a partir do iOS 11, é necessária autorização através do CMStepCounter ou usando o CMPedometer com um diálogo de permissão do sistema.
O processo de integração inclui: criar um CMMotionManager, verificar a disponibilidade do sensor através de isAccelerometerAvailable / isGyroAvailable / isDeviceMotionAvailable, configurar o intervalo de atualização e iniciar a coleta de dados. É importante parar as atualizações através de stopAccelerometerUpdates quando os dados não forem mais necessários — isso é crítico para o consumo de energia.
Para operação em segundo plano, CMPedometer e CMAltimeter não requerem configuração adicional — eles usam o coprocessador de movimento. Para CMMotionManager, a operação em segundo plano não está disponível — os dados são coletados apenas quando o aplicativo está ativo e em primeiro plano. A única condição para o CMPedometer é que o aplicativo deve ter sido iniciado pelo menos uma vez pelo usuário após a instalação para inicializar a assinatura de atualizações em segundo plano do iOS.
O Core Motion suporta frequência de consulta adaptativa: se o aplicativo não precisar de dados em tempo real, basta definir o intervalo para 1–5 Hz em vez de 100 Hz. Para aplicativos de fitness, a frequência ideal é de 10 Hz para CMMotionManager e 1 Hz para CMPedometer. A Apple recomenda reduzir a frequência ao mínimo necessário para o funcionamento correto.
Para jogos com controle de inclinação, é necessária uma frequência de 60–100 Hz para garantir uma resposta suave. Neste caso, é importante usar o startDeviceMotionUpdates com uma fila separada e processar os dados o mais rápido possível. Segundo a Apple, 60 Hz consome aproximadamente 2 vezes mais energia do que 30 Hz.
Ao trabalhar com Core Motion, é importante considerar a compatibilidade do dispositivo: o giroscópio está ausente no iPhone 3GS e iPad de 1ª geração, o magnetômetro está ausente em todos os iPads sem módulo celular. Os métodos estáticos isAccelerometerAvailable, isGyroAvailable e isDeviceMotionAvailable da classe CMMotionManager são usados para verificar a disponibilidade dos sensores. No simulador, o Core Motion retorna dados de teste — para depuração em um sensor real, um dispositivo Apple físico é sempre necessário.
// Configuração ideal para aplicativo de fitness
motionManager.deviceMotionUpdateInterval = 0.1 // 10 Hz
motionManager.startDeviceMotionUpdates(
to: .main
) { [weak self] motion, error in
guard let self = self,
let motion = motion else { return }
if motion.userAcceleration.magnitude() > 2.0 {
self.detectedSignificantMovement()
}
}
Perguntas frequentes
Sim, o Core Motion funciona em todos os dispositivos Apple com os sensores necessários. O acelerômetro está disponível em todos os iPhone, iPad e iPod touch. O giroscópio está em todos os iPhone 4 e posteriores, iPad 2 e posteriores. O magnetômetro está disponível apenas no iPhone, não no iPad. O barômetro está no iPhone 6 e posteriores.
O impacto na bateria depende da frequência de consulta. A 100 Hz, o Core Motion consome cerca de 5–7% de bateria por hora. A 10 Hz — cerca de 1–2% por hora. O CMPedometer no coprocessador de movimento consome menos de 1% em 8 horas de operação. A Apple recomenda sempre parar as atualizações quando os dados não forem necessários.
Sim, o CMPedometer fornece uma solução pronta para pedômetro sem a necessidade de processar dados brutos do acelerômetro. A classe reconhece automaticamente passos com cerca de 95% de precisão ao caminhar e 90% ao correr. Para um detector de passos personalizado, você pode usar o CMMotionManager com seu próprio algoritmo.
O Core Motion é integrado ao iOS no nível do sistema e usa o coprocessador da série M para processamento de baixa energia. O Android usa o SensorManager com acesso direto aos drivers de hardware, mas não possui um coprocessador especializado, o que aumenta o consumo de energia durante o rastreamento em segundo plano.
Para o CMPedometer no iOS 11 e versões posteriores, é necessária permissão do usuário. A solicitação é feita automaticamente ao criar um CMPedometer e exibe um diálogo do sistema. No Info.plist, é necessário adicionar a chave NSMotionUsageDescription com uma descrição de por que o aplicativo precisa de acesso aos dados de movimento.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também