Режимы переднего плана и фона
Одним из основных недостатков использования HTML5 Geolocation API является невозможность отслеживать местоположение пользователя, когда браузер переходит в фоновый режим, поскольку JavaScript является однопоточным.
Это делает неизбежным создание приложения для iOS, если у вас есть такой бизнес, как я, которому необходимо отслеживать ваших сотрудников в режиме реального времени с разрешения, конечно, когда они работают.
В этой статье вы узнаете, как получить местоположение пользователя в режиме реального времени с помощью CoreLocation, включая получение обновлений, когда приложение переходит в фоновый режим.
Я предполагаю, что у вас уже установлен Xcode и вы знаете, как создать проект в Xcode.
ШАГ № 1: Настройте LatLngLabel
Давайте создадим UILabel с именем latLngLabel, который отображает значения широты и долготы текущего местоположения.
import UIKit class ViewController: UIViewController{ private let latLngLabel: UILabel = { let label = UILabel() label.backgroundColor = .systemFill label.numberOfLines = 0 label.textAlignment = .center label.font = .systemFont(ofSize: 26) return label }() override func viewDidLoad() { super.viewDidLoad() latLngLabel.frame = CGRect(x: 20, y: view.bounds.height / 2 - 50, width: view.bounds.width - 40, height: 100) view.addSubview(latLngLabel) } }
LatLngUILabel инициализируется некоторыми свойствами и назначается местоположение (x, y) и размеры (ширина, высота) с помощью frame внутри viewDidLoad()
Я мог бы использовать Auto Layout, но я использовал фиксированные значения, чтобы расположить его в поле зрения для простоты.
Наконец, добавьте их в объект view с помощью метода addSubView(), и представление приложения будет выглядеть следующим образом.
Добавить свойства конфиденциальности в Info.plist
Перейдите в навигатор проекта → info.plist, нажмите знак + в правом верхнем углу в ключевом столбце и выберите:
- Конфиденциальность — местоположение всегда и описание использования при использовании и
- Конфиденциальность – местоположение при использовании Описание использования
Значение этих свойств будет фактически видно пользователю в представлении предупреждения о разрешении.
Например: «Ваше местоположение доступно администратору для эффективных целей».
Основное местоположение
Как видите, я импортировал CoreLocation вверху и объявил locationManager, который является необязательным с типом CLLocationManager внутри определения класса.
import UIKit import CoreLocation class ViewController: UIViewController{ private var locationManager:CLLocationManager? ... override func viewDidLoad() { super.viewDidLoad() ... getUserLocation() } func getUserLocation() { locationManager = CLLocationManager() locationManager?.requestAlwaysAuthorization() locationManager?.startUpdatingLocation() } }
Затем создайте экземпляр CLLocationManager внутри функции getUserLocation().
Метод requestAlwaysAuthorization() фактически показывает на экране представление предупреждения о разрешении.
Когда пользователь дает разрешение, выбирая Разрешить один раз, метод startUpdatingLocation() фактически получает данные о местоположении от GPS устройства.
И вы можете видеть, что значок местоположения в строке состояния имеет заполненный цвет.
CLLocationManagerDelegate()
Чтобы получить доступ к фактическим данным о местоположении пользователя, нам нужно использовать метод didUpdateLocations(), который является частью CLLocationManagerDelegate.
Поэтому добавьте CLLocationManagerDelegate
в определение класса.
class ViewController: UIViewController, CLLocationManagerDelegate{ ... }
Затем установите для свойства делегировать locationManager значение self.
func getUserLocation() { ... locationManager?.delegate = self ... }
Наконец, определите метод didUpdateLocations(), который будет вызываться каждый раз при обновлении нового местоположения.
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { if let location = locations.last { latLngLabel.text = "Lat : \(location.coordinate.latitude) \nLng : \(location.coordinate.longitude)" } }
Параметр местоположения представляет собой массив из CLLocation
объектов, и последние данные о местоположении будут доступны в последнем элементе.
Как только объект местоположения развернут, установите значения широты и долготы в latLngLabel
.
Запустите приложение, и оно фактически получит местоположение пользователя только один раз.
Чтобы часто получать обновления местоположения, перейдите в строку меню симулятора iOS вверху и выберите Отладка → Местоположение → Автострада.
Теперь приложение должно часто получать обновления местоположения.
Обновление местоположения в фоновом режиме
Как только приложение переходит в фоновый режим, значок местоположения в строке состояния исчезает через несколько секунд, указывая на то, что обновления местоположения перестают работать.
Есть два шага, чтобы включить эту функцию.
Первым шагом является включение обновления местоположения в фоновом режиме.
- Перейдите к кнопке Цель приложения → Войти и возможности → Возможности слева → Выберите Фоновые режимы.
- Затем включите обновление местоположения.
Второй шаг – сообщить об этом диспетчеру местоположения, установив для установки фоновых обновлений местоположения значение true.
func getUserLocation() { ... locationManager?.allowsBackgroundLocationUpdates = true ... }
Запустите приложение, и теперь местоположение пользователя будет обновляться и в фоновом режиме.
Кроме того, вы можете видеть, что значок местоположения в строке состояния мигает в фоновом режиме, указывая на то, что он все еще получает обновления местоположений.
Вот оно!
Вам также может понравиться:
Программно установить контроллер корневого представления в Swift 5
iOS UITableView 100% программно в Swift
Прекратите добавлять аутентификацию в ваше приложение iOS сложным способом
Добавьте вход через Facebook в свой Приложение для iOS за считанные минуты
Хватит использовать раскадровку, начните создавать пользовательский интерфейс на 100% программно