이번에 연구를 진행하면서,
motion들에 관한 정보를 많이 얻어와야 해서 공부를 하고 있다.
CoreMotion은 ios 내 내장된 라이브러리인데,
apple 문서를 보면, iOS 4.0 이상부터 사용가능하니, 거의 모든 폰들은 다 사용가능하다고 볼 수 있다.
가속도, 자이로스코프 등 여러 iOS 장치의 하드웨어에서 동작 관련 데이터, 이벤트를 처리해주는 프레임워크
내가 사용하고 싶었던 값들은
걸음 수 계산과, 장치에 저장된 모션 데이터, 중력 기타 등등이다.
그래서 이것을 어떻게 사용하냐면, 먼저 모든 core motion에 해당하는 이벤트들을 불러오려면,
import CoreMotion
import를 일단 해주는 것을 잊지 않는다.
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분마다 아마 이벤트를 발생시킬 것이다~!
이처럼, 나머지 모션 값들도 비슷한 방법으로 얻어올 수 있다.
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 등등을 처리할 수 있다, 아주 다양하다.
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은 자신이 원하는 권한 문구를 써서 등록하면 된다.