๋ด๊ฐ ๊ฐ๋ณด์ง ์์ ๊ธธ์ ์ฐพ์๋ณด๊ณ ๋๋ง์ ์ฐ์ฑ ๋ก๋ฅผ ๊ณต์ ํด๋ณด์!
Leader | Member | Member | Member |
---|---|---|---|
์กฐ๋ฏผ์ | ๊น์ฌ์ | ์ด๊ฒฝํ | ๋ฐํธ๊ฑด |
SwiftUI
Mapkit
Combine
Core Location
Firebasefirestore
- ์ ํฌ ์ฑ์ ์ฌ์ฉ์๋ค์๊ฒ ํน๋ณํ ์ฐ์ฑ ๊ฒฝํ์ ์ ๊ณตํ๋ ์ฐ์ฑ ๊ด๋ จ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
- ๐ถโโ๏ธ ์ ํ์ MapKit์ ํ์ฉํ์ฌ ํ์ฌ ์์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ฉ์ธ ์ฐ์ฑ
์คํ์ ์ง๋์์ ์์ฝ๊ฒ ํ์ธํ๊ณ ,
ํด๋น ์คํ๊น์ง์ ์ถ์ฒ ๊ฒฝ๋ก๋ฅผ ์ ๊ณต ํฉ๋๋ค. - ์ฌ์ฉ์๋ ํ ๋ง๋ณ๋ก ์ฐ์ฑ ๋ก๋ฅผ ์ฐพ์๋ณด๊ณ , ๊ฑธ์ผ๋ฉด์ ๋ค์ํ ๊ฒฝํ์ ์ฆ๊ธธ ์ ์์ต๋๋ค.
- MapKit ์ ์ฉ: ์ฌ์ฉ์์๊ฒ ์ง๊ด์ ์ธ ์ง๋๋ฅผ ํตํด ํ์ฌ ์์น ๊ทผ์ฒ์ ์ฐ์ฑ ์คํ๊ณผ ์ถ์ฒ ๊ฒฝ๋ก๋ฅผ ์ ์ํฉ๋๋ค.
- ๋ค์ํ ํ ๋ง๋ณ ์ฐ์ฑ ๋ก: ๋ฎ, ๋ฐค, ๊ฐ์์ง์ ํจ๊ป, ์์ด์ ํจ๊ป ๋ฑ ๋ค์ํ ํ ๋ง๋ก ์ฐ์ฑ ๋ก๋ฅผ ๋ถ๋ฅํ์ฌ ์ ๊ณตํฉ๋๋ค.
- ๊ฑท๊ธฐ ๊ธฐ๋ก ๋ฐ ๋ง๋ณด๊ธฐ: Health Kit์ด๋ Core Motion์ ํ์ฉํ์ฌ ์ฌ์ฉ์์ ๊ฑธ์ ์๋ฅผ ๊ธฐ๋กํ๊ณ , ๊ฑด๊ฐํ ๋ผ์ดํ์คํ์ผ์ ๋์ธ
๋ง๋ณด๊ธฐ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. - ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฅ: ์ฌ์ฉ์๋ค์ ์ฐ์ฑ ๋ก์ ๋ํ ํ๊ธฐ์ ๊ฒฝํ์ ๋๋๋ฉฐ ์ํตํ ์ ์๋ ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฅ์ด ํ์ฌ๋์ด ์์ต๋๋ค.
- "DDUBUK : ๋๋ฒ " ์ฑ์ ํตํด ์ฌ์ฉ์๋ค์ ๊ฑด๊ฐ์ ์ฆ์งํ๊ณ , ๋ค์ํ ํ ๋ง์ ์ฐ์ฑ ๋ก๋ฅผ ํตํด ์ฌ์ ๋ก์ด ์๊ฐ์ ์ฆ๊ธธ ์ ์์ต๋๋ค.
- ๋๋ถ์ด ์ปค๋ฎค๋ํฐ๋ฅผ ํตํ ์ํต์ ๋ค์ํ ์ฐ์ฑ ๊ฒฝํ์ ๊ณต์ ํ๊ณ , ํจ๊ป ๊ฑธ์ด๊ฐ๋ ์ฆ๊ฑฐ์์ ์ฐพ์ ์ ์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๐ฃ๐ฟ
- ๋ฉ์ธํ๋ฉด ์์ด์ดํ๋ ์์ ์ง๋์ค ์ ๋ฃ/๋ฌด๋ฃ ํ์์ ๋ํ Benefit์ ์ด๋ป๊ฒ ์ค์ง ๋ ผ์
- ๊ฒ์์ด๋ผ๋ ๊ธฐ๋ฅ ๋ชจ๋ ์ ์ ๊ฐ ๋ค์ธ์ ์๋ ๋ถ๋ถ์ธ์ง.. ์๋๋ฉด ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ ์ ๋ฃ?
โ ์ํ๋ ์ฐ์ฑ ๊ฒฝ๋ก๋ฅผ ๋ค์ด๋ฐ์์ผ ํ๋ ๊ฒฝ์ฐ์ ์ผ๋ถ ๊ฒฝ๋ก๋ค๋ง ์คํํ๊ณ ๋๋จธ์ง ํ ๋ง๋ ์ ๊ธ๋ฐฉ์์ฑํํ๊ธฐ๋ก ๊ฒฐ์ ( ์ ๋ฃํ ๋ง์ ๊ณตํ๋ ์์ผ๋ก ๊ตฌ์ฑ์์ )
- ๋ค์ด๋ฒ ๋ฑ์ ์์ ๋๊ฐ ๋ฎ์ + ์๋๊ถ์ง์ญ์ ์ ๋ฐ์ดํธ๊ฐ ๋น ๋ฅด๋ ์ง๋ฐฉ์ด๋ ์ด๋ฐ ํ์ง์ญ์ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฆด ์ ์์ โ ํธ์งํ๊ธฐ์๋ MapKit์ด๋ MapBox
- ์ค์ตํ๋ ๊ฒ์ฒ๋ผ ๊ฐ๋จํ๊ฒ ํ ํฐ์๋ฐ์์ ๋์ด๋ณด๊ธฐ ๋ฅผ ํด๋ณด๋๊ฒ ๋์๊ฑฐ๊ฐ๋ค ๋ผ๋ ํผ๋๋ฐฑ ์์ฉ
๋น๊ต | MapKit | MapBox |
---|---|---|
์ฅ์ | ๋ฌธ์๊ฐ ์๋์์๋ค. ๊ด๋ จ ๋ด์ฉ๋ค์ด ๋ง์์ ์ฐพ๊ธฐ์ ํธํ๋ค | api๊ฐ์ ธ์ค๋๊ฒ ํธํ๋ค |
๋จ์ | ๊ธฐ๋ฅ ์์ฒด๋ฅผ ๊ตฌํํ๋๊ฒ ๋ฒ๊ฑฐ๋ก์ธ ์ ์๋ค | ๋ฌธ์๊ฐ ์ ์๋์ ์๋ค ( Exampleprotocol..) |
- ๊ฒฐ๋ก : ๋ฐฐ์ฐ๋ ์ ์ฅ์์ ๊น๋ํ ๋ฌธ์์ ๊ด๋ จ ๋ด์ฉ์ด ๋ง๊ณ , ๊ธฐ์ด์ ์ธ ์์ค๋ค์ ๋ค๋ค๋ณด๋ ๊ฒฝํ์ ๊ฐ์ง ์ ์๋ MapKit์ ์ฑํ
- ์ฐ๋ฆฌ ์ฑ์ ๊ฒฝ๋ก์ ๋ํ ๋ถ๋ถ์ ์ ์ฅํ๊ณ ์ปค๋ฎค๋ํฐ๋ฑ์ ๊ณต์ ๊ฐ ๋๋๊ฒ ์ฃผ๊ธฐ๋ฅ
- ์ฆ, ์์น๋ฅผ ์ฐ๋๊ฒ๋ณด๋จ ์๋ฒํต์ ์ ๋ฌ๋ฐ๋๊ฒ ์ ์ผ ์ค์ํ ๋ถ๋ถ์ด ๋จ
- ๊ทธ๋์ ์ขํ๊ฐ์ ๋ฐ์์ค๋ ๊ฒ๋ณด๋จ ์๋ฒ์์ ๋ฐ์์ ๊ทธ๋ฆฌ๋ ๊ฒ์ ์ฐ์ ์์๋ก ๋ณด๊ณ ์๋ฒ๊ตฌํ์ ์ฐ์ ์ ์ผ๋ก ์งํ์๋
- ํ์ 4๋ช ์ด RecordView 1๋ช , MapView1๋ช , Firebase2๋ช ๋ฐฐ์น
- ์๋ฒ๋ถ๋ถ์ db์ค๊ณ โ ํ์ด์ด์คํ ์ด๋ก ํ๊ณ โ ๋์ค์ ๋ฐ์ดํฐ์ค๊ณ ๊ณต๋ถํด์ ์๋ฒ์ฐ๋ํ ๊ฒ์ โ ํ์ฌ๋ ํ์ฌ๋์ฉ์ผ๋ก ๋ง๋ค๊ณ โ ์ดํ ๋ฐ์ ๋ฐฉํฅ: ์ฌ๋ฌ์ฌ๋ โ ์ปฌ๋ ์ ์ ์ด๋ค ํค๋ฅผ ๋ฃ์๊ฒ์ธ์ง์ ๋ํ ๋ฐฉ์ ํ๊ตฌ
๋ด ์ด๋๊ฒฝ๋ก ํ์, ์กํฐ๋ธ์ํ๋ก ์ด๋ | ๊ธฐ๋ก๋ฒํผ์ถ๊ฐ, ์ขํํ์ํ ์คํธ |
---|---|
๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ๋ก ์ด๋ | ๊ธฐ๋ก๊ด๋ จ ์ปดํฌ๋ํธ ์ถ๊ฐ |
---|---|
Markerํ ์คํธ | ๋ฒํผ ํ ์คํธ |
---|---|
(์ถํ ์ธ๋ค์ผ ๋ณ๊ฒฝ์์ ) | (์ถํ ์ธ๋ค์ผ ๋ณ๊ฒฝ์์ ) |
GPS ํน์ฑ์ ๋งค์ฐ ์ ํํ๊ฒ ์์ ์ ์์น๋ฅผ ๋ํ๋ด๋ ๊ฒ์ด ๊ธฐ์ ์.
์์ดํฐGPS๊ธฐ๋ฅ์ผ๋ก ํ์ฌ ์ด๋๊ฒฝ๋ก๋ฅผ ์ ์ผ๋ก ์ด์ด๋ถ์ด๋ ๊ฒ์ ๊ฐ๋ ๋ถ์ ํํ๊ฒ ์ด์ด์ง๋ ๊ฒ์ด ๋ฐ๊ฒฌ
ํ์ฌ๋ ์ ์ฅ๋ ์๋, ๊ฒฝ๋๋ฅผ ํตํด ์ด๋๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํด์ ์ฌ์ฉ์์๊ฒ ํ๊ธฐ
ํ์ง๋ง ์ด ์ด๋๊ฑฐ๋ฆฌ๋ ์ขํ๊ฐ ํ์ ์๋ ์๋, ๊ฒฝ๋๋ก ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ผ ์ ํํ ๊ฑฐ๋ฆฌ๋ผ ๋งํ๊ธฐ ์ ๋งค
์์) ๋ด๊ฐ ์ด๋๊ฒฝ๋ก ๊ธฐ๋กํ๋ค ์ ์ ๋ฉ์ณค์ ๊ฒฝ์ฐ ๋๋ฐ์ด์ค์์ ์ฐ์ฐ์ด ์์ง ๋ง๋ฌด๋ฆฌ ์๋ ๊ฒฝ์ฐ๋ ์์ด ๊ณ์ํด์ ์ฐ์ฐ์ด ์งํ๋์ด ์ด๋๊ฑฐ๋ฆฌ๊ฐ ๋์ด๋๋ ํ์์ ํ์ธ
์
๋ฐ์ดํธ ์ฃผ๊ธฐ ๋ณ๊ฒฝ ๋ฐ ์ขํ ์ ์ฅ ๋ฐฉ๋ฒ์ ๋ํ ๋ชจ์
Corelocation์ ์ง์ ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์์ฒญ์ ๊ฑฐ๋ฆฌ 10m์ผ๋ก ์ง์
๊ธฐ๊ธฐ๋ฅผ ๋ค๊ณ ์ด๋ํ ๊ฒฝ์ฐ ์์์ ์ฐจ์ ์๋ ๊ฒฝ๋๋ฅผ ์ ๋ฌ๋ฐ๊ฒ ๋.
์ด๋ฅผ ๋ชจ๋ ๋ค ์ ์ฅํ๋ ๊ฒ์ด ์๋ ์ต๊ทผ์ ๋ค์ด์๋ ์๋ ๊ฒฝ๋์ ์ ๋๊ฐ 10 ์ฐจ์ด๊ฐ ๋๋ ๊ฒ๋ง ์ ์ฅ
์ผ๋ฐ ๋๋ก์์ ์ด๋๊ฒฝ๋ก ํ๊ธฐ๊ฐ ์๋์ง๋ง.
์ํํธ ๋จ์ง ๋ด(์ง์, ์๋ ๋ฒ ์ดํฐ ๋ฑ) ์ํฉ์์๋ ๊ฐ๋งํ ์๋๋ผ๋ ์์ง์๋ค๊ณ ์ธ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
์ด๋๊ฒฝ๋ก์ ์ด๋๊ฑฐ๋ฆฌ๊ฐ ๊ณ์ฐ๋๋ ์ํฉ์ผ๋ก ์ด๋ฅผ ์ค์ผ ๋ฐฉ์์ด ํ์ํ๋ค ํ๋จ
๋ณด์์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์์ ์์น์ ๋ณด ์ ์ฅ
ํธ๋ํฐ์ ์ผ๋์์ฑ๋ก ์ฐ์ฑ
์ ํ์ง ์์ โ ๊ทธ๋์ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ชจ๋์ ์ถ๊ฐํด ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์์๋ ์คํ๋๋๋ก ์์
ํ์ฌ๊น์ง ํ
์คํธํ ๊ฒฐ๊ณผ(์์ด ์ ๊ธด ํ์ง๋ง) ๋ด ์์น ํ๊ธฐ๊ฐ ์ ๋๋ฉ์ด์
์ฒ๋ผ ์ด๋๋๋ ๊ฒ ์ ์ธํ๊ณ ์ขํ ํ์ด ๋ง์ด ์ํ
์ ํด์ง ์๊ฐ๋ง๋ค ๋ฐฐ์ด๋ก ์ ์๋๋ ์์น๋ค์ ์ ๋ณด๋ค์ ๊ทธ๋๋ง๋ค ์ ์กํ ๊ฑด์ง?
๋์ค์ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๊ณต์ ํ๋ค๊ณ ํ์๋ ์๋ฒ์ ํ๋ฒ์ ๋ณด๋ด๋๊ฒ ์ข์๊ฑฐ ๊ฐ์
๊ทธ๊ฑธ ์ค์๊ฐ์ผ๋ก ์์น ๊ฒฝ๋ ์ ๋ณด๋ฅผ ์ด๋จ์๋ ๋ถ๋จ์๋ก ๊ณ์ ์๋ฒ๋ ์ด๋ฐ๊ณณ์ ๋ณด๋ด๋ ค๋ฉด
๋คํธ์ํฌ ์ ์ง๊ฐ ๊ณ์ ๋์ด์ผํ๋๋ฐ ์ด๋ฌ๋ฉด ๋ฒ ํฐ๋ฆฌ์๋ชจ/ ์ต์ ํ์ ์ด๋ ค์๋ฑ์ด ์์
์ถ์ฒ) โ UserDefault, CoreData, SwiftData ์ค์ ์ฐ์ฑ ๊ธฐ๋ก์ ์ ์ฅํ๋ ๋ฐฉ์ ๋ ผ์
๊ฒฝ๋ก๋ฅผ ๊ทธ๋ฆด ์ ์๋ ๊ฒฝ๋ ๊ฐ์ polyline์ผ๋ก ์ด์ด ๊ทธ๋ฆฌ๊ฒ ๋์๋๋ฐ,
ํ๋์ ์์ฐ์ค๋ฌ์ด ์ ๋ณด๋ค ๊ฐ์ด ์ง๋ ๊ฒฝ๋ก๊ฐ ๋์ด ์ข ๋ ์์ฐ์ค๋ฝ๊ฒ ์ ์ ์ด์ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผ ์ค
MKdirection ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํด๋๊ฐ ์์ ์๋ฃ๋ ๋ ์์น๊ฐ์ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๋ ์์.
- ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ฉฐ, ๊ฒฝ๋ก ๊ณ์ฐ์ด ์๋ฃ๋๋ฉด ํด๋ก์ ๊ฐ ํธ์ถ๋๋๋ฐ,
์ด ํด๋ก์ ๋ด์์๋ ๊ฒฝ๋ก์ ์ด ๊ฑฐ๋ฆฌ, ์์ ์ด๋ ์๊ฐ, ๊ทธ๋ฆฌ๊ณ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ด๋ polyline์ ์ถ๋ ฅ
import MapKit
let sourceCoordinates = CLLocationCoordinate2D(latitude: 37.7749, longitude: -122.4194)
let destinationCoordinates = CLLocationCoordinate2D(latitude: 34.0522, longitude: -118.2437)
let sourcePlacemark = MKPlacemark(coordinate: sourceCoordinates)
let destinationPlacemark = MKPlacemark(coordinate: destinationCoordinates)
let sourceItem = MKMapItem(placemark: sourcePlacemark)
let destinationItem = MKMapItem(placemark: destinationPlacemark)
let directionRequest = MKDirections.Request()
directionRequest.source = sourceItem
directionRequest.destination = destinationItem
directionRequest.transportType = .automobile // or .walking, .transit
let directions = MKDirections(request: directionRequest)
directions.calculate { (response, error) in
guard let response = response else {
if let error = error {
print("Error: \(error)")
}
return
}
let route = response.routes[0]
print(route.distance)
print(route.expectedTravelTime)
print(route.polyline)
}
์๋ ๊ฒฝ๋ ์์น ์ ๋ณด๋ฅผ ์ฃผ์ ๊ฐ์ผ๋ก ๋ณํํ์ฌ ๋ทฐ์ ๋์ฐ๋ ค๋ ์์
๋ณํ์ ๋์ง๋ง ๋ง์ปค ํด๋ฆญ์ ์ฃผ์๊ฐ ๋จ์ง ์๋ ๋ฌธ์ ๋ก
๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊ฟ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋ ์ ์๋๋ก ํด๊ฒฐ์ค
reverseGeocodeLocation ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์์ผ๋ก ๋ฐฉ์๋ชจ์์ค
์๋๋ฉด MKMapViewDelegate์ mapView() ๋งค์๋๋ฅผ ๊ตฌํ, ๋ง์ปค๋ทฐ๋ฅผ ์ปค์คํ
์ค์ ํ ์ง ๋
ผ์์ค
import MapKit
let geocoder = CLGeocoder()
let location = CLLocation(latitude: latitude, longitude: longitude)
geocoder.reverseGeocodeLocation(location) { (placemarks, error) in
if let error = error {
print("Geocoding error: \(error)")
return
}
if let placemark = placemarks?.first {
let marker = MKPointAnnotation()
marker.title = placemark.name
marker.subtitle = placemark.locality
marker.coordinate = location.coordinate
mapView.addAnnotation(marker)
}
}
- ๊ฐ ๋ทฐ์ ๋ํด์ ๊ฐ์ ๋งก์ ๋ถ๋ถ๋ง ์งํํ๋ค๋ณด๋ ํตํฉํ๋ ์๊ฐ์ด ๋ถ์กฑ, ํตํฉํ ํ ์คํธ ๋ฐฐํฌ ์ค๋นํ ์์
- Mapkit์ ๋ํ ๋์ ์ดํด๋๋ฅผ ๋ฐํ์ผ๋ก ์ ํ๋ ๋์ ๊ธฐ๋ก์ฑ์ ๋ง๋ค ๊ฒ์
- Firebase๊ธฐ๋ฐ์ผ๋ก ํ๋ ์๋ฒ๋ฅผ ๊ตฌ์ถํด์ ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์์
- ์ฐ์ฑ ๋ก์ ๋ฐ๋ฅธ ์๋ฃ๋ ๊ฐ์ ๊ตฌ๋งค ์ง๋, ๊ทผ์ฒ ํธ์์ ์ฐพ๊ธฐ ๊ธฐ๋ฅ ์ถ๊ฐ ์์
- ์ฐ์ฑ ๋ก ๊ณต์ ๋ฅผ ํตํ ์น๊ตฌ์์ ๋ญํน ์์คํ ๊ตฌํ ์์
- ์ฐ์ฑ ๋ก์ ๋ฐ๋ฅธ ์์ ์๊ฐ, ๊ฑฐ๋ฆฌ ํ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ๋ ํธ๋ฆฌํ ์ด์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์์