Режимы переднего плана и фона

Одним из основных недостатков использования 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% программно