Создайте простое навигационное приложение для iOS в Swift с помощью SDK навигации платформы Google Maps. Создайте простое навигационное приложение для iOS в Swift с помощью SDK навигации платформы Google Maps.

1. Прежде чем начать

В этой лаборатории кода вы научитесь создавать простое приложение для iOS, которое использует SDK навигации платформы Google Maps для навигации к предварительно настроенному пункту назначения.

Вот как будет выглядеть ваше приложение, когда вы закончите.

7e7c194a98d6dfa4.png

Предварительные условия

Что вы узнаете

  • Как создать простое приложение iOS Swift, которое использует Navigation SDK для навигации к месту назначения.
  • Как интегрировать Navigation SDK из удаленного репозитория Cocoapods.
  • Как управлять разрешениями на определение местоположения и пользовательским соглашением с условиями конечного пользователя Navigation SDK.
  • Как инициализировать SDK.
  • Как установить пункт назначения и запустить навигационное сопровождение.

Что вам понадобится

  • Последняя стабильная версия XCode.
  • Аккаунт Google и проект с включенной оплатой.
  • Устройство iOS или эмулируемое устройство, работающее в XCode Simulator. Какой бы вариант вы ни выбрали, он должен соответствовать минимальным требованиям для Navigation SDK .

2. Настройте

Если у вас еще нет учетной записи Google Cloud Platform и проекта с включенной оплатой, настройте свой проект Google Cloud, следуя инструкциям по началу работы с платформой Google Maps .

Выберите проект Google Cloud в консоли.

В Cloud Console щелкните раскрывающееся меню проекта и выберите проект, который вы хотите использовать для этой лаборатории кода.

Раскрывающееся меню выбора проекта в консоли Google Cloud.

Включите Navigation SDK в свой проект

Включите API и SDK платформы Google Maps, необходимые для этой лаборатории кода, в Google Cloud Marketplace .

Перейдите в раздел «API и сервисы» > «Библиотека» в Google Cloud Console и найдите «Navigation SDK».

Вы должны увидеть один результат поиска.

Экран библиотеки API в консоли Google Cloud, на котором показана страница Navigation SDK.

Нажмите Navigation SDK , чтобы открыть страницу сведений о продукте. Нажмите «Включить» , чтобы включить SDK в вашем проекте.

Повторите этот процесс для Google Maps SDK для iOS .

Создайте ключ API

Создайте ключ API на странице «Учетные данные» Cloud Console. Для всех запросов к платформе Google Maps требуется ключ API. На странице «Учетные данные» в консоли. Нажмите «+Создать учетные данные» вверху страницы и выберите «Ключ API» из вариантов.

Для производственного использования рекомендуется установить ограничение приложения для вашего ключа API, но для этой лаборатории кода это необязательно.

3. Получите примеры файлов проекта.

В этом разделе описывается, как настроить базовый пустой проект приложения XCode путем клонирования файлов из репозитория GitHub для этой лаборатории кода. Репозиторий Github содержит версии кода Codelab до и после. Лаборатория кода начнется с пустого шаблона проекта и будет доведена до законченного состояния. Вы можете использовать готовый проект в репозитории в качестве справочного материала, если что-то застрянет.

Клонируйте репозиторий или загрузите код

Перейдите в каталог, в котором вы хотите сохранить кодовую лабораторию.

Затем клонируйте репозиторий или загрузите код:

git clone https://github.com/googlemaps-samples/codelab-navigation-101-ios-swift

Если у вас не установлен git, нажмите эту кнопку, чтобы получить код:

Чтобы вы могли приступить к работе как можно быстрее, в папке Starter репозиторий содержит некоторый стартовый код, который поможет вам следовать этой лаборатории кода. Существует также готовый проект Solution на случай, если вы захотите в любой момент перейти к следующему этапу или проверить свой прогресс. Чтобы использовать проект решения, вам необходимо следовать приведенным ниже инструкциям «Установить с помощью Cocoapods», а затем запустить команду «pod update» из папки solution/Navigation SDK Codelab .

После локального клонирования репо используйте XCode, чтобы открыть папку Starter как существующий проект. Убедитесь, что проект собирается и запускается.

Подключите устройство или настройте симулятор XCode.

4. Добавьте навигационный SDK в свое приложение.

Существует три способа интеграции Navigation SDK в проект XCode: в этой лаборатории кода используется CocoaPods . Подробные сведения о том, как интегрировать с помощью Swift Package Manager или установить вручную, загрузив SDK, см. в разделе Создание проекта Xcode и установка Navigation SDK в документации Navigation SDK.

Установить с помощью Cocoapods

Если у вас еще нет инструмента CocoaPods, установите его в macOS, выполнив следующую команду из терминала. Подробности см. в руководстве по началу работы с CocoaPods .

sudo gem install cocoapods

Создайте новый файл с именем Podfile в папке проекта внутри папки Codelab starter/Navigation SDK (в XCode выберите «Файл» > «Создать» > «Файл» > «Другое» > «Пусто», сохраните как «Podfile»).

Добавьте в свой Podfile следующий контент:

source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '15.0'

target 'Navigation SDK Codelab' do
  pod 'GoogleNavigation', '9.1.1'
end

Сохранить Podfile .

Откройте терминал и перейдите в папку, в которой вы сохранили свой подфайл (это должна быть папка «starter/Navigation SDK Codelab» в репозитории codelab).

cd "<path-to-starter-project-folder>/Navigation SDK Codelab"

Запустите команду pod install . При этом будут установлены API, указанные в Podfile , вместе со всеми зависимостями.

pod install

Закройте Xcode, а затем откройте файл .xcworkspace вашего проекта, чтобы запустить Xcode. С этого момента вы должны использовать файл .xcworkspace для открытия проекта.

Убедитесь, что в структуру проекта добавлен каталог Pods и что он содержит модули GoogleMaps и GoogleNavigation.

6e81772ee067d452.png

Добавьте свой ключ API

Добавьте свой ключ API в свой AppDelegate.swift следующим образом:

  1. Добавьте следующие операторы импорта:
import GoogleMaps
import GoogleNavigation
  1. Добавьте в свой application(_:didFinishLaunchingWithOptions:) следующее:
GMSServices.provideAPIKey("YOUR_API_KEY")

Замените «YOUR_API_KEY» ключом API, который вы создали на предыдущем шаге.

Создайте свой проект и исправьте все ошибки.

5. Настройте разрешения приложения.

Навигационный SDK зависит от сигналов GPS для определения местоположения на дороге и пошаговых указаний, поэтому вашему приложению потребуется попросить пользователя предоставить доступ к точным данным о местоположении.

Для этого вы добавите некоторые свойства в Info.plist вашего приложения в Xcode, добавите в приложение некоторый код для запроса разрешения у пользователя во время выполнения и обработаете любые ошибки, такие как отсутствие разрешения или недоступность местоположения.

Откройте Info.plist в Xcode. Это должно выглядеть примерно так.

6532a85bd9ac8fb4.png

Запросить разрешение на точное местоположение

Вы можете добавить новые значения, наведя указатель мыши на строку «Список информационных свойств», пока не появится значок «+». Нажмите «+», чтобы увидеть диалоговое окно с предлагаемыми именами свойств, но учтите, что вы также можете добавлять свойства вручную.

Добавьте в Info.plist следующие свойства и значения:

Свойство

Ценить

Конфиденциальность: местоположение всегда и при использовании. Описание использования.

«Этому приложению требуется местоположение вашего устройства, чтобы обеспечить пошаговую навигацию»

Конфиденциальность – местоположение при использовании. Описание использования.

«Этому приложению требуется местоположение вашего устройства, чтобы обеспечить пошаговую навигацию»

разрешенийBackgroundLocationUpdates

ДА

Запрос разрешения на фоновое местоположение

Добавьте в Info.plist следующие свойства и значения:

UIBackgroundModes > Добавить строку > Item 0: App registers for location updates (выберите это значение из раскрывающегося списка предложений).

Когда вы закончите, Info.plist должен выглядеть примерно так.

3b0c49018451d0ff.png

Запросить доступ к местоположению во время выполнения

Добавьте следующие инструкции импорта в ViewController.swift :

import GoogleNavigation

Добавьте следующее объявление в свой класс ViewController:

var locationManager: CLLocationManager!

Добавьте переопределение метода для loadView() и вызовите locationManager.requestAlwaysAuthorization() :

override func loadView() {
        locationManager = CLLocationManager()
        locationManager.requestAlwaysAuthorization()

Ваше приложение теперь будет запрашивать местоположение у пользователя и предоставлять его вашему приложению, если он предоставит разрешение.

Запросить разрешение на показ уведомлений

Добавьте следующий код в loadView(), чтобы запросить у пользователя разрешение на показ уведомлений, которые потребуются для отображения инструкций по навигационному маневру.

UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
        granted, error in
        // Handle denied authorization to display notifications.
          if !granted || error != nil {
              print("User rejected request to display notifications.")
          }
        }

Создайте и запустите приложение и убедитесь, что вам предлагается сообщить местоположение и включить уведомления.

ad5f665a21170c49.png

6. Добавьте пользовательский интерфейс навигации.

На этом этапе вы добавите карту и настроите ее для отображения местоположения. Затем вы покажете пользователю диалоговое окно с условиями использования Navigation SDK.

Добавьте вид карты в свое приложение

Добавьте эту строку, чтобы объявить переменную GMSMapView в вашем ViewController.

var mapView: GMSMapView!

Добавьте следующий код в loadView() в вашем Viewcontroller.swift чтобы инициализировать карту.

let camera = GMSCameraPosition.camera(withLatitude: 51.483174, longitude: -0.177369, zoom: 14)
let options = GMSMapViewOptions()
options.camera = camera
options.frame = .zero
        
mapView = GMSMapView(options: options)
view = mapView

Создайте и запустите свое приложение. Вы должны увидеть карту с центром на юго-западе Лондона.

1d46ce5c0851cae3.png

Показать диалоговое окно условий использования продукта Navigation SDK

Добавьте следующий код в ViewController.swift в том же методе loadView() что и предыдущий код. Это покажет условия использования Navigation SDK для конечного пользователя. Если не принять, навигация не будет включена.

// Show the terms and conditions.
let companyName = "Navigation SDK Codelab"
GMSNavigationServices.showTermsAndConditionsDialogIfNeeded(withCompanyName: companyName) { termsAccepted in
  if termsAccepted {
    // Enable navigation if the user accepts the terms.
    self.mapView.isNavigationEnabled = true
    // Request authorization for alert notifications which deliver guidance instructions
    // in the background.
  } else {
    // Handle the case when the user rejects the terms and conditions.
  }
}

Создайте и запустите приложение, чтобы увидеть диалоговое окно.

29f17ae5b4c07c9f.png

7. Добавьте прослушиватели ключевых событий навигации.

На этом шаге вы узнаете, как настроить прослушиватели ключевых событий, таких как прибытие в пункт назначения или изменение маршрута водителя.

Чтобы прослушивать эти события, ваш контроллер представления должен использовать протокол GMSNavigatorListener .

Добавьте этот протокол в определение класса в ViewController.swift .

class ViewController: UIViewController,
                      GMSNavigatorListener {

Теперь добавьте строку кода для настройки прослушивателя в loadView():

// Add a listener for GMSNavigator.
mapView.navigator?.add(self)

Наконец, добавьте в свой класс два метода для обработки возникающих событий.

// Listener to handle arrival events.
func navigator(_ navigator: GMSNavigator, didArriveAt waypoint: GMSNavigationWaypoint) {
  print("You have arrived at: \(waypoint.title)")
}

// Listener for route change events.
func navigatorDidChangeRoute(_ navigator: GMSNavigator) {
  print("The route has changed.")
}

8. Установите пункт назначения и начните навигацию.

В этом разделе вы узнаете, как установить пункт назначения и запустить навигационное сопровождение.

Создайте новую функцию для логики навигации.

Сначала добавьте новую функцию startNav() в свой ViewController . Он будет содержать логику для установки пункта назначения и начала навигации.

// Create a route and start guidance.
@objc func startNav() {
}

Создайте Waypoint для пункта назначения.

Затем создайте массив пунктов назначения с одной путевой точкой.

// Create a route and start guidance.
@objc func startNav() {
  var destinations = [GMSNavigationWaypoint]()
  destinations.append(
    GMSNavigationWaypoint.init(
      placeID: "ChIJH-tBOc4EdkgRJ8aJ8P1CUxo",
      title: "Trafalgar Square")!)
}

Вызовите setDestinations() и обработайте ответ.

Затем вызовите setDestinations и обработайте возвращаемый GMSRouteStatus .

Если GMSRouteStatus имеет значение «ОК», запустите навигацию, установив isGuidanceActive=true в объекте navigator mapView . В противном случае выведите оператор, показывающий, что произошла ошибка.

Если возвращенное значение GMSRouteStatus — «ОК», начните симулировать движение по маршруту, вызвав mapView.locationSimulator.simulateLocationsAlongExistingRoute() .

// Create a route and start guidance.
@objc func startNav() {
  var destinations = [GMSNavigationWaypoint]()
    destinations.append(
      GMSNavigationWaypoint.init(
        placeID: "ChIJH-tBOc4EdkgRJ8aJ8P1CUxo",
          title: "Trafalgar Square")!)
      
  mapView.navigator?.setDestinations(
    destinations
  ) { routeStatus in
    guard routeStatus == .OK else {
      print("Handle route statuses that are not OK.")
      return
    }
    //If routeStatus is OK, start guidance.
    self.mapView.navigator?.isGuidanceActive = true
    //start simulating driving along the route. self.mapView.locationSimulator?.simulateLocationsAlongExistingRoute()
    self.mapView.cameraMode = .following
  }
}

Обработка распространенных статусов ошибок

Полезно более явно обрабатывать ошибки GMSRouteStatus , особенно при отладке первоначальных проблем с вашим новым приложением. Например, вы можете обнаружить, что поначалу вы чаще получаете ошибки разрешения местоположения, ключа API или «маршрут не найден» из-за настроек отладки, поэтому может быть полезно обрабатывать эти состояния ошибок.

Добавьте код, который обрабатывает эти конкретные случаи и выводит оператор на консоль.

mapView.navigator?.setDestinations(
  destinations
) { routeStatus in
    guard routeStatus == .OK else {
      print("Handle route statuses that are not OK.")
      switch routeStatus {
       case .locationUnavailable:
        print("Location unavailable.") //check permissions
      case .noRouteFound:
        print("No route found.") //check start location and destination
      case .waypointError:
        print("Waypoint error") //check Place ID
      default:
        print("Not sure what happened")
      }
    return
  }

Добавьте кнопку для запуска навигации по навигации

Наконец, добавьте кнопку в пользовательский интерфейс и подключите ее к методу startNav. Создайте метод makeButton() со следующим кодом. Вызовите функцию makeButton() из loadView() .

// Add a button to the view.
func makeButton() {
  // A button to start navigation.
  let navButton = UIButton(frame: CGRect(x: 5, y: 150, width: 200, height: 35))
  navButton.backgroundColor = .blue
  navButton.alpha = 0.5
  navButton.setTitle("Start navigation", for: .normal)
  navButton.addTarget(self, action: #selector(startNav), for: .touchUpInside)
  self.mapView.addSubview(navButton)
}

Создайте и запустите свое приложение.

Примечание: запуск кода в

startNav()

позвонит в

setDestinations()

метод, при котором взимается плата после использования первых 1000 пунктов назначения. Дополнительную информацию см. в разделе «Использование и выставление счетов» .

9. Поздравляем!

Молодцы – вы прибыли в пункт назначения!

7a69dcb75c904d7.png

Вы создали простое приложение, которое дает пошаговые инструкции по навигации до пункта назначения с помощью SDK навигации платформы Google Maps.

Вы настроили разрешения приложения и диалоговое окно условий для конечного пользователя Navigation SDK, а также указали пункт назначения, используя идентификатор места. В вашем приложении вы обработали различные состояния успеха и ошибки.

10. Продолжаем

Если вы хотите продолжить разработку своего приложения, ознакомьтесь со следующими темами для вдохновения.

  • Слушайте дополнительные события навигации . Добавьте код для отображения сообщения, если оставшееся время или расстояние превышает пороговое значение.
  • Настройте интерфейс навигации .
  • Если вам нужна более сложная задача, попробуйте добавить средство выбора места API Places, чтобы пользователь мог указать пункт назначения. Подсказка: демонстрационные приложения Navigation SDK имеют пример реализации. Запустите модуль pod try GoogleNavigation в папке вашего проекта, чтобы увидеть код.