В навигации apple carplay используются карты на картридже

Время на прочтение

Яндекс.Карты и Навигатор добавили поддержку Apple CarPlay и Android Auto. Это позволит водителям строить маршруты и искать места на экранах в автомобилях. Опция будет доступна с подпиской Яндекс Плюс.

Яндекс предлагает оформлять подписку в мобильном приложении Карт или Навигатора. Это дает три месяца бесплатного использования.

В Apple Carplay и Android Auto для автомобилистов будут доступны основные функции Карт и Навигатора: поиск адресов и организаций, выбор оптимального маршрута с учетом пробок, предупреждения про скоростные ограничения и камеры в пути даже без выстроенного маршрута. Также пользователям предложат быстрый доступ к местам в закладках, а на карте будут отображаться пробки и дорожные события. 

При этом встроенные в приложения сервисы, в том числе Заправки, Алиса и Музыка, не будут доступны с экрана автомобиля из-за правил CarPlay и Android Auto. Однако там появится кнопка «Продолжить в телефоне». Она позволит переключиться с экрана автомобиля на смартфон и обратно. 

Сервис Яндекс.Заправки интегрирован в Навигатор. Его пользователи могут расплачиваться за топливо для автомобилей, не выходя из машины — для этого необходимо заправляться на АЗС тех сетей, которые подписали соглашение с Яндексом. Оплата за топливо производится через банковскую карту, которую водитель привязывает к сервису. При этом комиссию Яндекс.Заправки берет со владельцев АЗС — около 2 % от суммы покупки.

Привет! Меня зовут Ваня, я пишу мобильное приложение 2ГИС под iOS. Сегодня будет история о том, как наш навигатор появился в CarPlay. Расскажу, как с такой себе документацией и недоделанными инструментами мы создали рабочий продукт и разместили его в AppStore.

Содержание
  1. Пара слов о CarPlay
  2. Первая палка в колёса
  3. Ответ от Apple
  4. Разработка беты
  5. Проблема одной карты
  6. Контролы на карте
  7. Построение и отображение маршрутов на карте
  8. Режим навигации
  9. It just works!
  10. Provision Profiles
  11. Debugging
  12. The best framework we ever made
  13. Проблемы с вьюпортом
  14. Построение проезда не только между двумя точками
  15. Тестирование и баги
  16. История двух реджектов
  17. То, о чём нельзя говорить
  18. Перемещение карты жестами
  19. Неодинаковость UI на разных магнитолах
  20. Контрол ограничения скорости
  21. Голосовой поиск
  22. Праворульные автомобили.
  23. Кратко о CarPlay
  24. Первый способ – стандартное добавление с помощью CarPlay
  25. Второй способ – использование сторонних сервисов
  26. Исправление ошибок в работе Яндекс. Навигатора
  27. Какие приложения работают через CarPlay
  28. Как добавить приложения в CarPlay
  29. Какие приложения работают с Android Auto
  30. Какие навигаторы работают с Apple CarPlay
  31. Как подключить CarPlay или Android Auto через Bluetooth
  32. Полезные советы и выводы
  33. Как в CarPlay добавить приложения
  34. Можно ли смотреть ютуб через CarPlay
  35. Какие приложения совместимы с Android Auto
  36. Какие приложения установить в машину

Пара слов о CarPlay

Сначала немного матчасти для понимания некоторых аспектов работы CarPlay и причин, по которым мы приняли те или иные решения.

CarPlay — это не ОС внутри другой ОС, как об этом пишут в очень многих статьях. Если грубо, то CarPlay — это протокол для работы с внешним дисплеем экрана головного устройства; звуком из динамиков автомобиля; тач-скринами, тач-панелями, шайбами и другими устройствами ввода.

То есть весь исполняемый код находится непосредственно в основном приложении (даже не в отдельном extension’е!) Это очень круто: чтобы получить новые фичи, не нужно обновлять магнитолу или даже машину, нужно просто обновить iOS.

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

Пока мы ждали ответа от Apple, вышла лекция, в которой на примере sample-приложения CountryRoads рассказывали о работе с CarPlay.framework. В лекции не рассказали о подводных камнях и тонкостях при работе с CarPlay, но упомянули, что после подключения к CarPlay-магнитоле приложение будет работать в режиме background.

Первая палка в колёса

Работа приложения в background’е нас разочаровала. На это было две причины:

  1. Мы не работаем в background’е. Когда-то оставили это ограничение по техническим причинам и ради энергосбережения.
  2. Наша карта написана на OpenGL (да, deprecated, да, не Metal, мы всё это знаем), а OpenGL в background state’е не работает. В лучшем случае вы получите чёрную вьюху, а в худшем — краш.

С работой в background’е ещё можно было справиться, но с картой определённо нужно было что-то решать. Тогда-то и пришла идея сделать её через стандартную MKMapView. Пока вы не начали закидывать нас камнями за идею использовать стандартные карты Apple, объясню: мы собирались использовать MKMapView, но не карты Apple.

Дело в том, что MKMapView умеет в загрузку сторонних тайлов. Тайлы — это специальные прямоугольные контейнеры для текстур. У нас как раз оказался сервачок, который умеет отдавать тайлы. На GitHub есть код с реализацией.

Ответ от Apple

Нам пришёл ответ от Apple, в котором, кроме разрешения на разработку, мы получили ещё и документацию «для избранных», код sample-приложения CountryRoads (его показывали на лекции WWDC) и, самое важное, приватный capability-ключ com.apple.developer.carplay-maps. Этот ключ прописывают в entitlements-файле со значением YES, чтобы система поняла, что вы можете обработать события от CarPlay при запуске вашего приложения.

Не дождавшись спринта с выделенными под разработку сториками, я полез качать Xcode Beta. Первая попытка собрать 2ГИС была провальной. Зато проект sample-приложения CoutryRoads удалось собрать под симулятор.

Перед каждым открытием окна симулятора CarPlay, последний должен был кастомизироваться через такое вот окно:

Для этого нужно было прописать в терминале строчку: defaults write com.apple.iphonesimulator CarPlayExtraOptions -bool YES

По какой-то причине это не сработало — пришлось запускать почти на самом маленьком симуляторе с разрешением 800×480 поинтов и скейлом ×2. В данный момент эта настройка работает и отлично помогает.

Создав свой sample-проект и вооружившись документацией, я начал разбираться, что к чему.
Первое, что я понял: навигационные приложения для CarPlay состоят из слоёв base view и templates.

Base view — это ваша карта. На этом слое должна быть только карта, никаких других вьюх и контролов.

Templates — это почти не кастомизирующийся обязательный набор UI-элементов для отображения маршрутов, манёвров, всяких списочков и так далее.

Разработка беты

Перейдём уже к написанию кода. Первое, что необходимо сделать, — реализовать парочку обязательных методов CPApplicationDelegate в файле ApplicationDelegate.

func application(
   _ application: UIApplication,
   didConnectCarInterfaceController controller: CPInterfaceController,
   to window: CPWindow
) {}

func application(
  _ application: UIApplication,
  didDisconnectCarInterfaceController controller: CPInterfaceController,
  from window: CPWindow
) {}

Давайте рассмотрим сигнатуру:

С UIApplication всё понятно.
CPWindow — наследник UIWindow, окно для внешнего дисплея головного устройства магнитолы.
CPInterfaceController — что-то типа аналога UINavigationController’а, только из CarPlay.framework.

Теперь перейдём непосредственно к реализации метода.

func application(
   _ application: UIApplication,
   didConnectCarInterfaceController controller: CPInterfaceController,
   to window: CPWindow
) {
  let carMapViewController = CarMapViewController(
    interfaceController: controller
  )
  let navigationController = UINavigationController(
    rootViewController: carMapViewController
  )
  window.rootViewController = navigationController
}

В didConnect необходимо написать код, похожий на тот, который мы привыкли видеть в didFinishLaunching. CarMapViewController — это base view (контроллер на самом деле, но ладно), как по документации.

Вот такую картинку в итоге я получил:

Где-то в это время до меня дошло, что в новом Xcode new build system включена по умолчанию и, скорее всего, из-за этого 2ГИС не собирается.

Я открыл Xcode, поставил legacy (а точнее stable, давайте называть вещи своими именами) build system, и моя теория подтвердилась: 2ГИС собрался.

Выставив тот самый capability-ключ, я запустил 2ГИС под CarPlay и не увидел логов о переходе приложения в режим background. Стало ещё непонятнее, ведь инженеры Apple со сцены сказали про background-режим, но, с другой стороны, нам обещали contentView у UIAlertView, а в итоге UIAlertView стал deprecated.

Решив, что так и должно быть, я не стал заморачиваться с MKMapView. Она лишила бы нас оффлайна и заставила заново писать отрисовку маршрутов.

Проблема одной карты

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

Обычно в момент использования 2ГИС на CarPlay телефон заблокирован и лежит где-нибудь на полочке. А значит карта в этот момент на телефоне не сильно-то и нужна (не помешает для поиска, конечно). Поэтому мы решили при подсоединении телефона к CarPlay забирать карту из основного приложения и выводить её на экран CarPlay магнитолы. А при отсоединении, соответственно, возвращать обратно в приложение на телефон.

READ  Видеорегистратор автомобильный ксиоми и видеомагнитофон Xiaomi

Да, решение такое себе, но оно быстрое, до сих пор работает и не пришлось пинать пару других команд, чтобы склепать MVP.

Контролы на карте

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

Начнём с зума и текущего местоположения, ведь эти контролы находятся на самой карте и это не обычные UIControl. Как я писал выше, на base view находится только карта.

Для того, что бы поместить эти контролы на карту, пришлось снова лезть в документацию и sample-приложение. Там я вычитал про первый темплейт — CPMapTemplate.

CPMapTemplate — прозрачный темплейт для отображения некоторых контролов на карте и аналога navigationBar’а. Создаётся и выставляется он так:

let mapTemplate = CPMapTemplate()
self.interfaceController.setRootTemplate(mapTemplate, animated: false)

Далее необходимо создать эти контролы и положить их на карту.

let zoomInButton = CPMapButton(…)
let zoomOutButton = CPMapButton(…)
let myLocationButton = CPMapButton(…)

self.mapTemplate.mapButtons = [
  zoomInButton, 
  zoomOutButton, 
  myLocationButton
]

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

Дальше я полез смотреть, как мне заставить двигаться карту, и нашёл в документации вот такое:

Navigation apps are designed to work with a variety of car input devices, and CarPlay does not support direct user interaction in the base view (apps do not directly receive tap or drag events). 

Странно, подумал я, и полез смотреть, как это сделано в sample-приложении CountryRoads. Ответ — через вот такой интерфейс:

Не очень удобно, но по-другому никак, документация же не будет врать, верно?

Поскольку место для контролов на карте у нас закончилось, необходимо было сделать кнопку для перевода карты в режим «таскания» в этом аналоге navigationBar’а.

let panButton = CPBarButton(…)
self.mapTemplate.leadingNavigationBarButtons = [panButton]
self.mapTemplate.trailingNavigationBarButtons = []

Но вот массивы leadingNavigationBarButtons и trailingNavigationBarButtons тоже оказались не без прикола: сколько элементов в них ни пихай, они возьмут только первые два. Тоже без ошибок в логе и ассертов.

А для активации и деактивации режима перетаскивания карты необходимо написать:

self.mapTemplate.showPanningInterface(animated: true)
self.mapTemplate.dismissPanningInterface(animated: true)

Построение и отображение маршрутов на карте

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

Просто для демки и понимания, что и как делать, решил взять две точки и строить между ними маршрут. Точкой А было местоположение пользователя, а точкой Б — наш главный офис в Новосибирске.

let choice0 = CPRouteChoice(
  summaryVariants: ["46 км"],
  additionalInformationVariants: ["с учетом пробок"],
  selectionSummaryVariants: ["1 час 7 мин"]
)
let choice1 = CPRouteChoice(
   summaryVariants: ["46 км"],
   additionalInformationVariants: ["с учетом пробок"],
   selectionSummaryVariants: [“1 час 11 мин"]
)

let startItem = MKMapItem(…)
let endItem = MKMapItem(…)
endItem.name = "Толмачёво, международный аэропорт”

let trip = CPTrip(
   origin: startItem,
   destination: endItem,
   routeChoices: [choice0, choice1]
)

let tripPreviewTextConfiguration = CPTripPreviewTextConfiguration(
   startButtonTitle: "В путь”,
   additionalRoutesButtonTitle: “Ещё”,
   overviewButtonTitle: "Назад"
)

self.mapTemplate.showTripPreviews(
  [trip],
  textConfiguration: tripPreviewTextConfiguration
)

На экране мы получили контрол с описанием маршрута:

Режим навигации

Маршруты — это хорошо, но главная фишка навигатора всё же в навигации. Чтобы она появилась, необходимо написать следующее:

func mapTemplate(
  _ mapTemplate: CPMapTemplate,
  startedTrip trip: CPTrip,
  using routeChoice: CPRouteChoice
) {
   self.navigationSession = 
       self.mapTemplate.startNavigationSession(for: trip)
}

CPNavigationSession — класс, с помощью которого можно отображать некоторые UI-элементы, необходимые только в режиме навигации.

Чтобы отобразить манёвр, необходимо:

let maneuver = CPManeuver()
maneuver.symbolSet = CPImageSet(
  lightContentImage: icon, 
  darkContentImage: darkIcon
)
maneuver.instructionVariants = ["Ул. Кутателадзе"]
maneuver.initialTravelEstimates = CPTravelEstimates(…)

self.navigationSession?.upcomingManeuvers = [maneuver]

После чего на экране магнитолы мы получим вот это:

Чтобы обновлять метраж до манёвра, необходимо:

let estimates = CPTravelEstimates(…)
self.navigationSession?.updateEstimates(estimates, for: maneuver)

It just works!

Когда основная функциональность для навигатора был готова, я решил показать эту поделку на внутренней презентации. Презентация удалась: все загорелись идеей доделать, потестировать и запустить навигатор как можно скорее.

Первым делом мы заказали реальное головное устройство с поддержкой CarPlay. И тут, как говорится, пошла жара.

PIONEER AVH-Z500BT

Provision Profiles

Из-за добавления нового capability-ключа необходимо перегенерировать профили. В обычной разработке мы не думаем об этом, ведь Xcode сделает всё сам. Но не в случае с приватным ключом.

Code Signing Error: Automatic signing is unable to resolve an issue with the "v4ios" target's entitlements. Automatic signing can't add the com.apple.developer.carplay-maps entitlement to your provisioning profile. Switch to manual signing and resolve the issue by downloading a matching provisioning profile from the developer website.

Это так же сломало нам CI, так как для локальной дистрибуции версий приложения мы используем enterprise-аккаунт, в который мы не запрашивали разрешение на разработку приложения под CarPlay. Но это уже совсем другая история

Debugging

Подключиться к CarPlay можно через Bluetooth или Lightning. Практика показывает, что второй способ гораздо популярнее. Наша магнитола в Bluetooth не умела, поэтому во время разработки пришлось пользоваться Wi-Fi дебагом. Если вы пробовали его на проектах сложнее, чем hello world, то вы знаете, какой это ад.

А для тех, кто не пробовал, рассказываю:

Я собирал приложение по проводу на телефон, а только потом, подключив телефон к CarPlay, через Wi-Fi, заливал на телефон и запускал по несколько минут.
Копирование приложения на телефон было около 3 минут, запуск приложения ещё около минуты и только потом после запуска остановка на брейкпоинтах была только секунд через 15.

И тут мне стало очень интересно, почему Apple не сделала никакой DevKit (чтобы Apple-way, it just works и вот это всё). Без него собирать тестовый стенд было не очень удобно. До сих пор раз в пару недель что-нибудь отваливается — приходится по фоткам вспоминать, что куда втыкать. Хорошо, что админ при сборке этого стенда рассказал, что и зачем.

The best framework we ever made

В конце концов, когда всё собралось на реальное устройство, стало понятно, что фиче «2ГИС под CarPlay» точно быть. Настало время делать по красоте.

Проблемы с вьюпортом

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

Я рассчитывал, что получу какой-нибудь layoutGuide с текущей видимой областью. Чтобы он учитывал и navigationBar, и вьюшку с маршрутом, и контролы на карте. На деле я не получил ничего. До сих пор непонятно, как настраивать вьюпорт, поэтому у нас в коде есть хардкод типа:

let routeControlsWidth = self.view.frame.width * 0.48 
let zoomControlWidth = self.view.frame.width * 0.15

Построение проезда не только между двумя точками

В первый релиз мы решили взять наш рубрикатор, сделанный через CPGridTemplate:

Избранное и Дом/Работа через CPListTemplate.

И клавиатурный поиск через CPSearchTemplate:

Код я показывать про темплейты не буду, так как он простой и про него хорошо написана документация (хоть про что-то).

Однако стоит упомянуть, какие проблемы были обнаружены при работе с ними.

CPInterfaceController может в навигацию, похожую на UIKit. т. е.

self.interfaceController.pushTemplate(listTemplate, animated: true)
self.interfaceController.presentTemplate(alertTemplate, animated: true)

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

Непонятно, почему Apple не спрятали логику транзишенов под капотом, не сделав тогда интерфейс типа:

self.interfaceController.showTemplate(listTemplate, animated: true)

Это также сломало возможность пользоваться наследниками CPTemplate, словно контроллерами в UIKit.

При попытке, например, положить в стек темплейтов ваш наследник, вы получите вот это:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unsupported object <YourAwesomeGridTemplate: 0x60000060dce0> <identifier: 6CAC7E3B-FE70-43FC-A8B1-8FC39334A61D, userInfo: (null)> passed to pushTemplate:animated:. Allowed classes: {(
    CPListTemplate,
    CPGridTemplate,
    CPSearchTemplate,
    CPMapTemplate
)}’

Тестирование и баги

Тестированием занимался artemenko-a-a. Один из первых багов, который он нашёл, мы до сих пор не можем починить.

Дело в том, что при отсоединении телефона от CarPlay-магнитолы спорадически нас прибивает Watchdog — без объяснении причины. Даже syslogs открывали, ничего не понятно. Так что если есть идея, как починить или понять причину, то велкам в комменты.

Следующий баг был в этом же месте, но с особенным поведением. Я писал выше, что метод didDisconnect у CPApplicationDelegate вызывается в момент отсоединения телефона от CarPlay. И в этом методе мы возвращаем карту с экрана магнитолы обратно в основное приложение. Представьте себе, сколько бы мы словили проблем, если бы этот метод не вызывался хотя бы раз из пяти.

Стало понятно, что это проблема iOS, а не конкретно нашего приложения, так как вся система считала, что она подключена к CarPlay.

Я даже зарепортил это как radar (как и все остальные баги). Меня попросили скинуть логи с таким-то профилем, но я не мог ответить поддержке в течение некоторого времени, поэтому они закрыли radar.

READ  Видеорегистратор автомобильный рейтинг недорогих

Раз Apple делать ничего не планировала, проблему пришлось обходить самостоятельно, так как воспроизводилась она достаточно часто.

Схема хиленькая, но выбора у нас не было. Мы пошли этим путём, и всё сработало!

К счастью, этот костыль из кода давно уже удалён: разработчики Apple починили всё в одном из релизов iOS.

История двух реджектов

Первый реджект был связан с метадатой. В тексте реджекта говорилось, что у нас в описании (не release notes) не сказано о том, что мы поддерживаем CarPlay. Как вы можете догадаться, ни в review guideline’ах, ни у того же Google Maps такого не было. Мы не стали спорить (потому что это обычно дольше, чем править метадату), скопировали строчку из Release Notes в Description и стали ждали нового ревью.

Второй реджект случился из-за списка городов. У 2ГИСа есть очень крутая фича — полный офлайн-режим работы. Эта фича стрельнула нам в ногу.

То, о чём нельзя говорить

Перемещение карты жестами

Примерно в это же время вышел навигатор под CarPlay от Google Maps — и там можно было передвигать карту жестами по экрану. Приватные API, подумал я, это очевидно! Ребята из Google просто пришли из соседнего здания и сказали, что им надо. Ведь документация гласит:

Navigation apps are designed to work with a variety of car input devices, and CarPlay does not support direct user interaction in the base view (apps do not directly receive tap or drag events). 

Однако я всё-таки решил убедиться и полез гуглить, хоть это и было почти бессмысленно, ведь никаких технических статей про CarPlay Navigation Apps не было. Однако я умудрился найти что-то полезное и, ВНЕЗАПНО, на сайте Apple.

В гайдлайнах я нашел видео, которое говорит, что документация нагло врёт. На видео видно, как карту всё-таки можно перетаскивать жестами. Я понял, что ничего не понял, и единственное, что мне оставалось, — открыть CarPlay.framework и пересмотреть все .h файлы.

И о чудо! Я нахожу в CPMapTemplate’е его делегат CPMapTemplateDelegate, в котором есть 3 метода, которые как будто кричат о том, что если их реализовать, то можно будет получить управление жестами картой.

/*Called when a pan gesture begins. May not be called when connected to some CarPlay systems.
/
optional public func mapTemplateDidBeginPanGesture(_ mapTemplate: CPMapTemplate)

/*Called when a pan gesture changes. May not be called when connected to some CarPlay systems.
/
optional public func mapTemplate(_ mapTemplate: CPMapTemplate, didUpdatePanGestureWithTranslation translation: CGPoint, velocity: CGPoint)

/*Called when a pan gesture ends. May not be called when connected to some CarPlay systems.
/
optional public func mapTemplate(_ mapTemplate: CPMapTemplate, didEndPanGestureWithVelocity velocity: CGPoint
)

Я реализовал их и запустил приложение на симуляторе — ничего не сработало. Не успев расстроиться, я понял, что симулятор может быть такого же качества, как и документация, и собрал на девайс. Всё завелось, счастью не было предела!

Забавный факт: CarPlay-магнитоле необходима четверть экрана, чтобы понять, что начался pan-жест. Хочу заметить, что UIPanGestureRecognizer’у нужно всего 10 поинтов.

Неодинаковость UI на разных магнитолах

Нам в поддержку поступило обращение: у пользователя в поиске вылезает всего один саджест, хотя могло бы быть и больше. Странно, подумал я, ведь на всех экранах помещается всего одна строка. Запросили скриншот:

И это совсем отличается от UI CPSearchTemplate, который я показывал выше. И это нужно учитывать при разработке, хоть и никак нельзя понять, сколько ячеек в табличке внизу может вместиться в экран.

Контрол ограничения скорости

Мы посмотрели на статистику и поняли, что навигатором для CarPlay пользуются и надо довести его хотя бы до уровня навигатора в основном приложении. В первую очередь решили добавить контрол ограничения скорости. Без проблем, конечно, не обошлось.

Вопрос номер один: где размещать?

Пошарив снова по .h файлам в CPWindow, я нашел любопытный layoutGuide:
var mapButtonSafeAreaLayoutGuide: UILayoutGuide

И это оказалось тем, что нужно. Наш контрол отлично туда вписался:

Вопрос номер два: это, вообще, законно?

Дело в том, что технически контрол находится на base view. А base view по документации не может содержать в себе ничего, кроме карты:

The base view is where the map is drawn. The base view must be used exclusively to draw a map, and may not be used to display other UI elements. Instead, navigation apps overlay UI elements such as the navigation bar and map buttons using the provided templates. 

Но ревьюверы пропустили нас в AppStore, а значит контролы, которые касаются навигации, встраивать всё-таки можно.

Голосовой поиск

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

Проблема первая: анимации. Дело в том, что в CPVoiceControlTemplate нет возможности сделать стандартные анимации. Анимацию для распознавания речи и поиска пришлось собирать покадрово из картинок и указывать, сколько они идут по времени.

for i in 1...12 {
   if let image = UIImage(named: "carplay_searching_\(i)") {
      images.append(image)
   }
}

let image = UIImage.animatedImage(with: images, duration: 0.96)

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

Проблема вторая: доступы. Алерты на доступ к микрофону и распознаванию речи появляются на дисплее телефона. Пришлось писать на дисплее магнитолы, что пользователю необходимо взять телефон в руки, дать разрешение и только потом пользоваться навигатором на магнитоле. Очень удобно!

Праворульные автомобили.

Нам прислали скриншот, в котором UI всего приложения был перевёрнут!

И, естественно, вьюпорт карты оставался таким, как мы его захардкодили, ведь никто не ожидал, что есть отдельная настройка для праворульных автомобилей. Как «правильно» это обойти, я не нашёл, но заметил, что, поскольку наш контрол ограничения скорости лежит в layoutGuide’е для контролов карты, он переместился в левую сторону.

Ультрафикс не заставил себя ждать. Сделали грубо, но это работает.

let isLeftWheelCar = self.speedControlViewController.view.frame.origin.x > self.view.frame.size.width / 2.0

Очень надеюсь, что есть правильное решение, и я просто не дочитал.

На этом у меня всё. Если вдруг соберётесь делать свой навигатор под CarPlay, учтите, что документация и фреймворк несовершенны. Платформа абсолютно новая, никто ничего не знает, а Apple делиться знаниями не торопятся.

Как добавить Яндекс.Навигатор в CarPlay: простая инструкция

Большинство современных автомобилей уже в штатной комплектации оснащены многофункциональной мультимедийной системой, поддерживающей CarPlay.

Это очень удобно, поскольку появляется возможность использовать многие полезные приложения смартфона, управляя ими непосредственно с головного устройства транспортного средства. Однако установка некоторых приложений, особенно выпущенных недавно, вызывает некоторые трудности. В этой статье мы поговорим о том, как же добавить в CarPlay Яндекс.Навигатор, не заморачиваясь со сложными программными махинациями.

Как добавить Яндекс.Навигатор в CarPlay

В скором времени Яндекс может добавить официальную поддержку CarPlay и Android Auto в «Карты» и «Навигатор», но эта функция будет доступна только для подписчиков «Яндекс.Плюс» – сообщает блогер Wylsacom. В корпорации Яндекса подтвердили, что готовится интеграция приложений с CarPlay, однако до этого времени перечисленные в статье способы остаются актуальными.

Кратко о CarPlay

CarPlay представляет собой программное обеспечение от компании Apple, позволяющее в полной мере использовать приложения от смартфона на мультимедийном проигрывателе автомобиля. Однако функционал такого сервиса крайне ограничен – большинство приложений из AppStore будут недоступны на CarPlay. Apple аргументирует это повышенными мерами безопасности на дороге, чтобы водитель не отвлекался на не информативные приложения.

Технология CarPlay поддерживается большинством популярных производителей авто, причем она даже предусматривает изначальную установку базового пакета программ. К сожалению, Яндекс.Навигатор к таковым не относится, более того, до сентября 2018 года его в принципе невозможно было добавить в CarPlay. Однако на сегодняшний день существует масса способов решения этого вопроса.

Первый способ – стандартное добавление с помощью CarPlay

Этот метод является самым простым, поскольку не требует установку сторонних приложений. Суть заключается в замене стандартных карт, установленных изначально, на Яндекс.Навигатор. Делается это следующим образом:

  • перейдите в «Настройки»;
  • выберите вкладку «Основные»;
  • найдите и откройте «CarPlay»;
  • выберите свое транспортное средство;
  • переместитесь во второй раздел открывшихся настроек;
  • выберите из предложенного списка приложение «Яндекс.Навигатор».

Apple CarPlay

Приложение устанавливается путем простого удержания пальца над логотипом, плавно передвигая его на основной экран.

Второй способ – использование сторонних сервисов

Добавить Яндекс.Навигатор в CarPlay можно также при помощи программы CarBridge. К сожалению, она не бесплатна – оплату допускается производить посредством PayPal. Отметим, что для установки приложения необходимо сделать джейлбрейк.

Неопытному пользователю iPhone может быть трудно выполнить все эти махинации – за помощью можно обратиться в сервисный центр по ремонту Apple «Service-King»:

READ  Android auto обновление и Android Auto

Простая инструкция по активации джейлбрейка:

  • устанавливаем на компьютер iTunes и обновляем его до последней версии;
  • деактивируем защиту дисплея путем ввода пароля (перед этим желательно сделать резервную копию данных);
  • выключаем опцию «Найти айфон» и активируем «Режим полета»;
  • скачиваем на ПК программу «Pangu 9»;
  • устанавливаем ее и запускаем от имени администратора;
  • подсоединяем к компьютеру смартфон, ждем, когда система его обнаружит и нажимаем «Старт»;
  • через несколько секунд должна высветиться надпись «Already backup» – кликаем на нее;
  • дожидаемся завершения установки (внимание, на 70% загрузки айфон будет перезагружен, после этого необходимо снова активировать «Режим полета»);
  • после окончания установки нужно открыть программу, предварительно предоставив ей все необходимые разрешения.

Яндекс Навигатор в Айфоне

Далее все просто:

  • скачиваем CarBridge;
  • открываем;
  • дожидаемся полной установки;
  • проверяем наличие программы в настройках устройства.

Затем открываем приложение уже через настройки, принимаем пользовательское соглашение и во вкладку «Активированные приложения» добавляем Яндекс.Навигатор. Также с помощью CarBridge можно удалить ненужные программы и более удобно расположить иконки приложений.

Одна из основных проблем Яндекс.Навигатора – постоянные сбои в работе (вылеты, невозможность обнаружить спутник и т.д.). Однако все это подлежит устранению.

Исправление ошибок в работе Яндекс. Навигатора

Эта процедура весьма сложная, особенно для людей, не имеющих опыта работы с *nix.

Если Вы ощущаете, что не сможете правильно выполнить необходимые действия, лучше обратитесь к мастерам по ремонту iPhone https://service-king.ru/remont-iphone – некорректные манипуляции с программой отразятся на ее работе в целом.

Для перезаписи программы необходимо выполнить следующее:

  • открыть /var/containers/Bundle/Application/Навигатор/YandexNavigator.app/Info.plist;
  • найти строки:

<string>Give access to your location to get the right directions.</string>

  • до или после них вставить следующую команду:

<string>Give access to your location to get the right directions.</string>

  • перезагрузить приложение;
  • открыть «Настройки»;
  • перейти во вкладку «Геопозиция»;
  • выбрать «Всегда».

Готово, навигатор будет работать исправно.

Использование смартфона в автомобиле — это не только опасно, но и запрещено законом во многих странах. Однако, появление технологических инноваций, таких как Apple CarPlay и Android Auto, позволяют автомобилям легко и безопасно взаимодействовать со смартфоном во время движения.

Сегодня мы расскажем о том, какие приложения работают через CarPlay и Android Auto, а также дадим подробные инструкции о том, как добавлять, удалять и упорядочивать приложения в этих системах.

Какие приложения работают через CarPlay

Вот список приложений, которые работают через Apple CarPlay:

  • Подкасты
  • Bookmate
  • PlugShare
  • Viber
  • WhatsApp
  • Слушай аудиокниги
  • Spotify
  • Яндекс.Музыка

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

Как добавить приложения в CarPlay

Для добавления, удаления или упорядочивания приложений в CarPlay, выполните следующие действия:

  1. Откройте настройки iPhone.
  2. Найдите раздел «Основные» и нажмите «CarPlay».
  3. Выберите свой автомобиль и нажмите «Настройка».
  4. Нажмите кнопку «Добавить» или «Удалить» для добавления или удаления приложений.

Какие приложения работают с Android Auto

Вот список приложений, которые работают через Android Auto:

  • Google Play Книги
  • Messenger
  • Pandora — Music & Podcasts
  • Android Auto
  • Spotify: Music and Podcasts
  • WhatsApp Messenger
  • Spotify for Podcasters
  • iHeart: Music, Radio, Podcasts

Какие навигаторы работают с Apple CarPlay

Что касается навигации, есть возможность использовать Яндекс Навигатор или Яндекс Карты через Apple CarPlay. Приложение Яндекс Навигатор должно быть установлено или обновлено до версии 6.00 и выше, а Яндекс Карты — до версии 13.4 и выше.

Как подключить CarPlay или Android Auto через Bluetooth

Подключение телефона к Apple CarPlay или Android Auto можно осуществить без проводов через Bluetooth. Вот инструкция по подключению:

  1. Убедитесь, что ваш автомобиль находится в режиме беспроводного подключения или парном режиме Bluetooth.
  2. Затем перейдите в Настройки на вашем iPhone.
  3. Найдите раздел «Основные» и нажмите «CarPlay» или «Android Auto».
  4. Выберите нужный автомобиль.

Полезные советы и выводы

  • Использование CarPlay и Android Auto позволяет водителям контролировать смартфон в безопасном режиме во время движения.
  • Добавление или удаление приложений в этих системах можно осуществить через настройки iPhone.
  • Некоторые приложения могут не работать с CarPlay или Android Auto, проверьте список приложений перед установкой или покупкой нового.
  • Периодически обновляйте приложения и системы, чтобы получить лучший опыт в использовании CarPlay и Android Auto.

Как в CarPlay добавить приложения

Если вы хотите изменить порядок приложений, удерживайте их значки и перетаскивайте на нужное место. После этого приложения будут отображаться в новом порядке на экране CarPlay в автомобиле. Однако, не все приложения могут быть добавлены в CarPlay. Их список ограничен, и зависит от производителя автомобиля и доступных на рынке приложений. Некоторые из самых популярных приложений, которые можно добавить в CarPlay, включают в себя Spotify, Waze, Google Maps, WhatsApp и многие другие. CarPlay позволяет использовать функционал вашего iPhone во время поездки и способен значительно облегчить передвижение на автомобиле.

Можно ли смотреть ютуб через CarPlay

Не существует возможности просмотра YouTube через CarPlay на устройствах iOS в автомобиле из-за ограничений, установленных Apple. В то же время, мультимедийные системы в авто поддерживают использование навигационных приложений, среди которых можно найти Google Maps, Яндекс. Навигатор, Sygic GPS-навигацию, MAPS.ME, Waze, и 2GIS. Хотя YouTube остается недоступным, CarPlay представляет собой современную технологию, которая позволяет автомобилистам получать информацию, управлять мультимедийными функциями, отвечать на звонки и читать сообщения, не отвлекаясь от дороги. Конечно, использование мультимедийных приложений при вождении может оказаться опасным, поэтому следует использовать их только в ситуациях, когда это необходимо.

Какие приложения совместимы с Android Auto

Android Auto — это инновационная технология, позволяющая водителю оставаться на связи с важными приложениями на его телефоне, в то время, как он находится за рулем. Эта технология совместима с множеством приложений, которые могут быть скачаны из Google Play Store. Среди таких приложений можно выделить Google Play Книги, Messenger, Pandora — Music & Podcasts, Spotify: Music and Podcasts, WhatsApp Messenger и многие другие. Каждое из них обладает высоким рейтингом в Google Play. Например, Pandora — Music & Podcasts имеет рейтинг в 4,1 звезды, а iHeart: Music, Radio, Podcasts — 4,6 звезды. Они все могут быть интегрированы в Android Auto, что облегчит и упростит коммуникацию водителя с другими людьми, а также позволит получать и проигрывать любимые песни и подкасты во время поездки.

Какие приложения установить в машину

Для автомобилистов рекомендуется установить несколько приложений, которые помогут в различных ситуациях. Навигационные приложения, такие как «Яндекс.Навигатор», «Яндекс.Карты», 2ГИС и Maps.me помогут быстро и удобно найти нужный путь и доставят в пункт назначения. Кроме того, существует приложение «Яндекс.Заправки», которое поможет выбрать ближайшую заправку и найти наиболее выгодную цену на топливо. «Автодор» поможет планировать маршруты дальних поездок. Если произошло ДТП, можно воспользоваться приложением «ДТП. Европротокол» или «Помощник ОСАГО», чтобы быстро оформить все необходимые документы. «Госуслуги» и «Госуслуги.Авто» помогут быстро решить различные вопросы, связанные со своим автомобилем, например, оплатить штрафы или получить техосмотр. Все эти приложения могут значительно облегчить жизнь водителя и сделать ее более комфортной и безопасной.

Плейлист Youtube CarPlay+ со всеми установками

Расширение Apple CarPlay Plus работает на базе всех телефонов iPhone от 5S до 12, в котором установлено специальное программное обеспечение, позволяющее скачивать, устанавливать и использовать практически любые приложения из AppStore, такие как Яндекс Навигатор, Навител, СитиГид, Youtube, TV+, ЦТВ, Стрелка Антирадар, проигрыватель видео MX Player и многие другие.

Принцип работы устройства — Plug and Play — необходимо подключить iPhone к штатному USB разъему CarPlay автомобиля, и Вы сразу получаете доступ ко всем приложениям, установленным в телефоне и назначенным для отображения в CarPlay.

Для того, чтобы принимать звонки в режиме CarPlay, введите Ваш iCloud в телефон. Никаких настроек не требуется, входящие звонки будут автоматически дублироваться на экране автомобиля.

Для активации исходящих звонков потребуется СИМ карта любого оператора, так же как и для организации интернет соединения на устройстве. При наличии в автомобиле точки доступа WiFi, возможно использовать телефон без СИМ карты.

Стоимость комплекта CarPlay Plus включает в себя гарантию 1 год на телефон от поставщика оборудования, подписку (лицензию) на 24 месяца c последующей пролонгацией в онлайн режиме. 

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

В случае приобретения прошитого устройства у нас, все риски берет на себя наш технический отдел и клиенту предоставляется гарантия на устройство 1 год.

Оцените статью
Авто-пилот