[iOS] CoreMotion, MotionActivityManager 알아보기

hiju·2021년 2월 26일
2

iOS

목록 보기
5/8

이번에 연구를 진행하면서,
motion들에 관한 정보를 많이 얻어와야 해서 공부를 하고 있다.
CoreMotion은 ios 내 내장된 라이브러리인데,
apple 문서를 보면, iOS 4.0 이상부터 사용가능하니, 거의 모든 폰들은 다 사용가능하다고 볼 수 있다.

Core Motion이란?

가속도, 자이로스코프 등 여러 iOS 장치의 하드웨어에서 동작 관련 데이터, 이벤트를 처리해주는 프레임워크

내가 사용하고 싶었던 값들은
걸음 수 계산과, 장치에 저장된 모션 데이터, 중력 기타 등등이다.

그래서 이것을 어떻게 사용하냐면, 먼저 모든 core motion에 해당하는 이벤트들을 불러오려면,

import CoreMotion

import를 일단 해주는 것을 잊지 않는다.

Gravity

var motionManager = CMMotionManager()

먼저 프로퍼티 하나를 생성해준다.
MotionManager은 말그대로, 모션에 대한 이벤트들을 처리할 수 있게 도와주는 오픈 클래스이다.
내가 들고 있는 나의 폰의 중력을 계속해서 체크하고 싶다면 이 클래스를 이용해야한다.

그렇다면 여기서, 어떻게 중력값을 실시간으로 받아올 수 있을까?

motionManager.startDeviceMotionUpdates(
            to: OperationQueue.current!,
            withHandler: {(
                deviceMotion: CMDeviceMotion!,
                error: Error!
            ) -> Void in
                print(deviceMotion.gravity)
            }
        )

짠.!..! 바로 모션 값이 바뀔 때마다 클로저 핸들링을 해줄 startDeviceMotionUpdates 함수를 사용한다.
이렇게되면, 중력값을 읽을 수 있고, 값이 바뀔때마다 핸들러를 실행시킨다.
지금 현재 위 코드에서는 device의 motion을 체크하는데,
print로 gravity값만 한 번 출력되게 만들었다.

물론, deviceMotion는 attitude, rotationRate, userAcceleration 등이 있다.
자신이 원하는 값을 넣으면 될 것 같다 :)

아그리고, 일정 시간마다 반복해서 체크할 순 없을까???
하는 의문이 생길 수 있는데, 당연히 애플은 있다!
내가 모션 이벤트를 interval 주고 싶다면, 옵션을 정하면된다.

motionManager.deviceMotionUpdateInterval = 60 //시간은 맘대로 정하기

startDeviceMotionUpdates()함수를 구현하기 전에, 써넣으면 위 코드는 1분마다 아마 이벤트를 발생시킬 것이다~!

이처럼, 나머지 모션 값들도 비슷한 방법으로 얻어올 수 있다.

ActivityMotion

var motionActivity = CMMotionActivityManager()
motionActivity.startActivityUpdates(
            to: OperationQueue.current!,
            withHandler: {(
                deviceActivity: CMMotionActivity!
            ) -> Void in
            if deviceActivity.stationary {
                    //action...
                }
            else if deviceActivity.walking {
                    //action...
                }
           }
      )

이렇게 말이다.
비슷하게, 코드를 쓸 수 있고, 핸들러에서는 장치를 가지고 걷는지, 가만히 있는지, 어떤 탈 것을 탔는지에 대한 이벤트들을 알 수 있다.
위 코드처럼, deviceActivity. 하고 뒤에 여러가지 원하는 상태들을 불러올 수 있다.
walking, running, automotive 등등을 처리할 수 있다, 아주 다양하다.

Step

var pedoMeter = CMPedometer()
pedoMeter.startUpdates(from: Date()) {
	(data, error) in
    if error == nil {
    	if let response = data {
        	print(response.numberOfSteps)
        }
    }
}

step도 비슷하게, Pedometer() 객체를 사용해서 update해주기.
현재 시간을 기준으로 업데이트한다.
data로, 걸음수 측정이 가능하니 알아두기~!
더 상세한 정보를 얻으려면 healthkit을 이용한 방법도 있다 :D
간단하게만 쓸거면 Pedometer를 이용하는 법도 추천.

아, 그리고 다 start가 있으면 stop도 당연히 있겠지요.
이벤트 발생을 그만두고 싶을땐, 그냥 모든 객체의 뒤에 .붙이고 관련함수 쓰면된다.

motionManager.stopDeviceMotionUpdates()
motionActivity.stopActivityUpdates()
pedoMeter.stopUpdates()

엄청 간단하쥬????

+) iOS 10.0 이상
앱은 사용 설명 키를 파일에 포함해야한다!
안그러면 앱이 중단될터이니..

Info.plist 파일에,

<key>NSMotionUsageDescription</key>
<string>Allow my app to access motion usage.</string>

넣어주는 것 잊지말기!!!! string은 자신이 원하는 권한 문구를 써서 등록하면 된다.

profile
IOS 개발자

0개의 댓글