: 애플의 여러디바이스들을 통해 위치정보를 활용할수 있는 Framework
Wi-fi, GPS, Bluetooth, 자기장 센서, 기압계, 셀룰러를 이용하여 위치데이터를 수집한다.
우리는 CLLocationManager class를 통해 많은 데이터를 가져올수 있다
- 표준적이고 중요한 위치 업데이트
- 표준 위치? 주기적으로 유저의 위치를 업데이트 하여 GPS기반 데이터 활용. 정확도 조절이 가능하고 이동경로나 위치의 정확한 정보를 필요할때 사용하면 된다. → 더 많은 에너지 소모
- 중요 위치? 사용자의 위치가 크게 바뀔때만 업데이트한다. 정확도가 떨어지지만 에너지는 절약
- startMonitoringSignificantLocationChanges() 500m이상 이동할때만 이벤트를 처리해줄수 있다. 물론 백그라운드에서 이렇게 해주면 더 배터리도 아끼고 효율적이겠지만
- 위치 모니터링
- 위치를 지정하고 벗어나거나 들어갈때 이벤트를 할수 있다 → CLVisit 를 통해 우리가 지정해놓은 위치에 갔을때 어떠한 이벤트를 처리해줄수 있다. ex) 도서관에 갔을때 무음모드로 바뀌게 해줄수 있다!!
CLLocationManger의 Property
- desiredAccuracy: 위치 업데이트를 할때 원하는 정확도
- KCLLocationAccuarcyBest: 가능한 최고 수준의 정확도
- KCLLocationAccuarcyKilometer: 킬로미터 기준의 정확
- KCLLocationAccuracyThreeKilometers : 3킬로미터 기준의 정확도
- distanceFilter: 위치 업데이트를 받기 위해 이동해야 하는 최소 거리. 설정된 거리 이상을 이동해야만 위치 업데이트가 발생한다.
- 내가 지정한 거리만큼 이동해야 그때야 위치업데이트를 받는다.
요렇게 프로퍼티를 세팅을 해주었다면 CLLocationManagerDelegate를 통해 우리가 원하는 이벤트들을 처리해줄수 있다.
extension CoreLocationService: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
guard .authorizedWhenInUse == manager.authorizationStatus else { return }
locationManager.requestLocation()
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: any Error) {
print(error)
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print(locations)
guard let newLocation = locations.last else {return}
guard let oldLocation = locations.first else {
self.oldLocatio = newLocation
return
}
locationdraw.append(newLocation.coordinate)
locations.last.map {
region in
self.locations.append(region)
}
self.oldLocatio = newLocation
}
}
맨아래의 didUpdateLocations 메서드를 통해서 우리는 위치가 바뀔때마다 이벤트처리를 해줄 수 있다. 그 텀은 앞에서 정한 기준이 된다.
여기서는 새로운 위치를 배열에 계속 추가하여 저장해주고 있다.
제일 신경을 써야할것은 결국 배터리를 최적화하며 우리가 원하는 경로들을 잘 그려주는 정도를 찾는 것이다. 그에 관해서는 다음페이지에서 정리할 계획이다.
자! 이제 우리가 찍은 좌표들을 지도로 표현하고 싶다! 그러면 어떻게 해야하지? kakao API? naver API?등 사용할수 있다. 하지만 애플에서는 mapkit이라는 프레임워크를 제공해준다!!(요즘 플러터하고 있는데 다시 한번 iOS에게 빠져드는중..)
사용법은 진짜 쉽다.
import MapKit한후 Map 구조체를 사용하면 된다.
그리고 그 MapContentBuilder안에 Mapcontent(ex, Annotation, UserAnnotation, Marker, MapCircle, MapPolygon 등)를 넣으면 된다.
https://developer.apple.com/documentation/mapkit/map
여기서 필요한거 쓰시면 됩니다.
자 저는 예시로 이전 corelocation으로 한것이 내 위치가 바뀔때마다 배열속에 추가를 해주었는데 실시간으로 추가되는 위도 경도 데이터들을 선으로 이어 내가 가는 길을 보여주도록 해보겠습니다.
Map(initialPosition: .userLocation(fallback: .automatic)) {
Marker("Starting",systemImage: "flag.fill", coordinate: coreLocationService.locationdraw.first ?? CLLocationCoordinate2D(latitude: 37.5665, longitude: 126.9780))
MapPolyline(coordinates: coreLocationService.locationdraw)
.stroke(.blue, lineWidth: 2.0)
}
그냥 이거면 내 시작점에 마크찍을수도 있고! MapPolyline을 통해 선을 그어줍니다.
아주아주 간단한 예시였고 https://developer.apple.com/videos/play/wwdc2023/10043/?time=109
요기 들어가면 내가 간 경로들을 원으로 표시도 가능하고 네비게이션 등 다양한 기능이 된다는 것을 알 수 있습니다. 실제 프로젝트에 녹일 수 있을껏 같네요 우선 제가 하려는건 경로들을 저장해서 서버에 보내고 서버로 부터 받은 위도경도 데이터들을 지도에 표시해주는 것으로 corelocation의 위치 업데이트 주기를 손봐야 할거 같아요 너무 빈번해도 너무뜸해도 데이터가 정확하지 않더라고요... 이거에 대한 글은 다음글에!!
Comming sooon
'iOS' 카테고리의 다른 글
Image(Pixel, asset, memory....)등등을 포함한 & HIG (1) | 2024.11.24 |
---|---|
CoreLocation과 Battery의 관계 (1) | 2024.04.21 |
Uniform type Identifiers (1) | 2024.04.18 |
Coremotion2편- 걷기데이터 & HealthKit (0) | 2024.04.17 |
KeyChain (1) | 2023.10.08 |