Skip to content

DenDmitriev/MyTrack

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MyTrack

Приложение iOS для трекинга прогулок.

Shot

Начало

Я хотел научится работать с картой, получать координаты и обрабатывать их. Попытаться реализовать большинство возможных функций Google Maps SDK:

  • рисование и окрашивание сплайна;
  • установка маркера на картк;
  • перемещение камеры на карте;
  • обрабатывает получаемые данные и показывать их в понятном виде.

Содержание

Возможности

Главный экран реализован с использованием Google Maps SDK. Приложение по кнопке СТАРТ начинает создавать трек пользователя по координатам. Отображается путь полилинией, которая окрашивается в цвет исходя из скорости перемещения пользователя с устройством. Для понимания логики окрашивания, есть выбор настройки типа прогулки внизу экрана. При прогулке есть скорость, путь и время, эти данные приложение показывает в удобном отформатированном варианте. При завершении трекинга, по кнопке ФИНИШ, приложение сохраняет трек. Прогулки можно увидеть по кнопке список. В ячейках трека приводится сводная информация и название района прогулки.

Реализация

Библиотеки

UIKit

Интерфейс приложения реализован классическим способом. За координацию контроллеров отвечает Coordinator. У каждого flow есть свой storyboard. Передаются данные между контроллерами через замыкание.

private func showTrackModule(with track: Track? = nil) {
guard let controller = UIStoryboard(name: "Track", bundle: nil).instantiateViewController(withIdentifier: "TrackViewController") as? TrackViewController else { return }
controller.onUser = { [weak self] in
self?.showUserModule()
}
controller.onTracks = { [weak self] in
self?.showTracksModule()
}
if let track = track {
controller.trackManager = TrackManager(track: track)
}
let rootController = UINavigationController(rootViewController: controller)
setAsRoot(rootController)
self.rootController = rootController
}

Google Maps SDK

Показ карты на экране и навигацию по нему осуществляет Google Maps SDK. Код начальной настройки.

private func configureMap() {
mapView.isMyLocationEnabled = true
let camera = GMSCameraPosition.camera(withTarget: mapView.myLocation?.coordinate ?? CLLocationCoordinate2D(latitude: -180, longitude: -180), zoom: zoom)
mapView.camera = camera
mapView.padding = UIEdgeInsets(top: 64, left: 32, bottom: (uiView.frame.height + 32), right: 32)
mapView.delegate = self
mapView.settings.compassButton = true
mapView.settings.myLocationButton = true
}

Создание сплайна осуществляется следующей функцией

private func createRoute(for locations: [CLLocation]? = nil) {
route = GMSPolyline()
let spans: [GMSStyleSpan] = []
route?.spans = spans
routePath = GMSMutablePath()
route?.strokeWidth = strokeWidth
route?.map = mapView
locations?.forEach { location in
routePath?.add(location.coordinate)
let span = GMSStyleSpan.getColor(by: location.speed)
route?.spans?.append(span)
}
route?.path = routePath
}

Установка маркера на карту

private func marker(on coordinate: CLLocationCoordinate2D) -> GMSMarker {
let marker = GMSMarker(position: coordinate)
marker.appearAnimation = .pop
marker.map = mapView
return marker
}

RealmSwift

Хранения треков пользователя и точек локаций в нем

class Track: Object {
@Persisted var startTime: Date = Date.now
@Persisted var finishTime: Date = Date.now + 1
@Persisted var distance: Double = 0.0
@Persisted var locations: List<Location>
}

RxSwift

  • Подписки для обновления данных трека
  • Подписки для заполнение полей логина и пароля

Auth

TODO

  • Добавить FireBase для сохранения профиля пользователя и его координат
  • Добавить на окно профиля возможность загрузки фотографии пользователя и свойства