티스토리 뷰

이번에는 사용자가 하루에 얼마나 걸었는지를 알아내야하는 일이 필요해서 만들었던 함수입니다. 

기본적으로 ios 는 CoreMotion 을 활용하시면 원하시는 기간 동안 사용자의 걸음 데이터를 가져올 수 있습니다. 

저는 걸음수, 거리, 실제 운동(걸음) 시간 이렇게 3가지가 필요한 상황입니다. 

 

사실 이부분이 올릴 내용이 많은데 그건 나중에 시간 될때 천천히 올려보기로 하고

오늘은 최대한 간단하게만 알아보도록 합시다.  

 

하기전 사전 작업  (권한 추가)

운동데이터는 가져오려면 사용자 권한이 필요합니다.

Info.plist 에서 해당 항목을 반드시 추가해주세요!

Info.plist에서 Privacy - Motion Usage Description 추가
잘 추가하시면 이렇게 뜹니다.

권한은 필요할 때 권한 요청을 스스로 해줍니다. 

(필요에 따라서 코드를 통해 그 전에 권한을 요청할 수 도 있습니다. 이건 다음 기회에)

 

그 후 코드는 생각보다 간단합니다. 

import Foundation
import CoreMotion // 이거 반드시 해주셔야합니다.
//static let HEALTH_WALK = CMPedometer() // GlobalDefine에 있습니다.
class HealthWalk{ 
    // 오늘 밤 12:00 부터 현재시간 까지의 걸음수
    static func getTodayWalk(completionHandler: @escaping (_ walk: Int,_ distance : Float,_ time : Float) -> ()){
        if CMPedometer.isDistanceAvailable() && CMPedometer.isStepCountingAvailable(){
            GlobalDefine.HEALTH_WALK.queryPedometerData(from: setFirstUPDateTime(), to: Date()){(data,error) in
                let distance = Double( (data?.distance)! )
                let time : Float = data?.value(forKeyPath: "fActiveTime") as? Float ?? 0
                completionHandler(data?.numberOfSteps.intValue ?? 0, data?.distance?.floatValue ?? 0, time)
            }
            /* 이거는 실시간 걸음수가 바뀌면 작동하는 부분입니다.
            GlobalDefine.HEALTH_WALK.startUpdates(from: setFirstUPDateTime()){(data,error) in
                completionHandler(data?.numberOfSteps.intValue ?? 0, data?.distance?.floatValue ?? 0)
            }
            */
        }
        
    }
    static func setFirstUPDateTime() -> Date {// 정각 시간 만드는 함수
        let nowDate = Date()
        let date = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: nowDate)
        return date!
    }

}

참고로 여기 결과 값으로 나오는 거리와 시간은 단위가 미터 (meter)와 초(second) 입니다. 

 

사용법

HealthUtil.getTodayWalk(){walk,distance,time in
        DispatchQueue.main.async { //만약 UI에 바로 적용하실거면
            self.label.text = "\(walk) : \(distance) : \(time)"
        }
        print("\(walk) : \(distance) : \(time)")// 데이터만 필요하신거면
}

만약 UI ( ex. UILabel이나 UITextview 등)에 바로 적용하실 생각이시면 DispatchQueue 안에 작성해주세요.

 

추가 정보

사실 이외에도 여러가지 데이터를 가져올수있는데

뭔가 엄청 많습니다

아래 식에서 "fActiveTime" 을 위에서 원하는 데이터 값과 형태로 바꿔주면 쉽게 가져올 수 있습니다. 

data?.value(forKeyPath: "fActiveTime") as? Float ?? 0

fActiveTime : 사용자가 실제로 움직인 시간 

 

저 안에 있는 데이터는 전부 이런식으로 꺼내 사용할 수 있습니다.(타입만 주의 하시면 됩니다.)

 

개인적으로 만들때 재미있었던 부분이여서 한번 올려봅니다.

누군가에게 도움이 되었으면 좋겠네요. 

오늘도 파이팅입니다!

댓글