Знакомство

Menusa - проект Dodo Brands. Инструмент по автоматизации процессов для малого бизнеса в сфере общепита.

Как мы работаем:

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

  • Ресторан получает QR-код, который он разместит на столе

  • Гость сканирует QR-код и попадает на сайт-меню, которое мы сгенерировали для ресторана

  • Гость выбирает блюдо и делает заказ официанту

На текущий момент у нас больше 1000 заведений в 63 странах мира. Приложение глобальное и доступно по всему миру.

Позовите, пожалуйста, официанта

Мы думали как дальше развивать наш продукт, и решили начать с реализации функционала вызова официанта.

Проблема: сейчас в заведениях мы либо поднимаем руку, либо нажимаем на кнопку вызова официанта, тогда фициант получает уведомление на свой пейджер. Так как мы делаем мобильное приложение для глобального рынка, а двигаться надо быстро, то нам не подходят решения из физического мира и нужно что-то придумать «в цифре». Пейджеры не подходят, потому что придется поддерживать множество интеграций и систем оповещения, что не входит в наш фокус развития.

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

Мы могли-бы добавить новую роль Официант в текущее приложение, но мы хотели разделить функционал управления меню от режима официанта.

Что мы можем сделать:

  • Создать отдельное приложение для Официанта

  • Сделать скрытые возможности для официантов в текущем приложении. Самое простое — открывать секретную ссылку через диплинк. 

Отдельное приложение мы создавать не хотели, поэтому остановились на втором варианте.

App Clip

И тут пришла мысль что на iOS есть App Clip, на Android — Instant App, оба нужны для того, чтобы по диплинку интерфейс показывать. Заодно и установку сокращают.

Есть и ограничения: работают только с iOS 14, живут 30 дней на телефоне максимум, есть ограничения на максимальный размер App Clip, ведь он должен моментально скачиваться. В сумме этого хватает для одного-двух экранов.

В итоге, вызов официанта выглядит так:

  • Мы генерируем QR-код для официантов, который можно наклеить на стену в служебном помещении. 

  • Официант сканирует QR-код, открывается и устанавливается App Clip с режимом официанта, так он выходит на смену и готов принимать заказы. 

  • Гость в заведении сканирует другой QR-код на столе, открывает сайт с меню, выбирает что нравится и прямо из меню жмет кнопку вызова официанта

  • Официант получает пуш уведомления с номером столика — номер уже был зашит QR на столе. 

Размер имеет значение

App Clip — маленькая версия приложения как по функционалу, так и по размеру, установка должна быть моментальной. На момент написания статьи Apple предоставляет 3 возможных размера для App Clip

  • iOS 15 - 10MB uncompressed binary size

  • iOS 16 and later - 15MB uncompressed binary size

  • iOS 17 - 50MB uncompressed binary size for digital invocations

compressed size - сжатый размер загрузки приложения
uncompressed size - не сжатый размер который эквивалентен размеру установленного приложения на устройстве

Для эксперимента мы запихали в App Clip все приложение и получили 48 MB uncompressed size. Наше приложение поддерживает минимальную версию iOS 15, поэтому нужно было уменьшать размер, так как поднятие таргета до 17 версии нас бы не спасло так как мы используем QR коды для открытия App Clip.

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

  • uncompressed size - 9,8 MB

  • сompressed size - 2,7 MB

Т.е. скачать надо всего 3 мб, а после распаковки станет почти 10. Идеально.

Как измерить размер приложения - клац

Пуш уведомления

Вместе с App Clips в iOS 14 появился новый тип push-уведомлений — эфемерные пуши. Для таких пушей не нужно запрашивать разрешение на получения уведомлений.

Что бы иметь возможность использовать эфемерные пуши достаточно в Info.plist добавить ключ и его значение NSAppClipRequestEphemeralUserNotification : YES

Мы хотели упростить жизнь официантам и избавить их от запроса авторизации пуш уведомлений используя эфемерные пуши, но оказалось, что такие пуши будут работать лишь первые 8 часов и чтобы дальше получать уведомления, нужно либо запросить постоянную авторизацию, либо переустановить App Clip, поэтому решили сразу добавить явный запрос на получение уведомлений. 

Первый реджект

Месяц разработки, тестирования, исправления багов наконец отправили сборку в Appstore Connect и сразу получили реджект

App Clip обязан дублировать функционал основного приложением, а у нас был уникальный функционал. В итоге нам пришлось добавить функционал в основное приложение с доступом через Universal links. Но пользователи про это не знают, QR-кода на виду у них нет и вы им про это не рассказывайте. 

Релиз, раскатка, огорчение

Долгожданный момент — получили апрув и пошли тестировать App Clip, но при сканировании QR кода вместо App Clip открывался наш сайт. 

Для дебага есть Advanced App Clip Experiences, который позволяет Apple узнать какие URL поддерживает наше приложение. Мы проверили — там все окей.

Далее начали смотреть в сторону нашего AASA файла на сайте, можно проверить валиден ли он через https://branch.io/resources/aasa-validator/ На этом этапе проблем не обнаружили, AASA файл доступен и валидный.

Дополнительно можно посмотреть в Appstoreconnect при подготовки приложения для публикации — тоже норм. 

Финальной точкой стала проверка App Clip на телефоне.

В настройках перейти в раздел “Разработчик”, найти секцию “Тестирование блиц-приложений”, выбрать “Диагностика” и указать URL адрес по которому должен открываться App Clip

Результаты немного поставили в тупик: все указывало на то, что у нас нет зарегистрированного Advanced Experiences. В гугле совет один — подождать индексацию на серверах Apple.

Спустя неделю ситуация не изменилась, App Clip все так же не открывался. Мы писали в тех. поддержку Apple, но в ответ получали только ссылки на документацию и рекомендацию написать вопрос на форуме разработчиков. Форум не очень помог — наш пост не принес ни какого результата, его просмотрело 426 человек и только 3человека отписалось со схожей проблемой. 

Занимательный факт — около 80% тем с тегом App Clip имеет идентичную проблему: все сделали, но не работает.

Если подвести итог того что мы попробовали:

  • Различные варианты настройки Advanced Experiences

  • Изменение AASA файла

  • Общение с тех. поддержкой

  • Создание поста на форуме разработчиков Apple

  • Общение со сторонними разработчиками кто уже выпускал App Clip

Ничего не помогало и мы добавили smart app banner, который запускал App Clip из Safari. Сценарий для официанта получилось пройти, но удовольствия никакого. 

Это еще не конец

2 недели спустя, в чате приходит сообщение — App Clip заработал, но мы сломали меню :D

Гости сканировали QR-код для просмотра меню, вместо него открывалось превью для официантов. Ну как так-то!

Оказалось что мы забыли убрать Advanced Experiences на основной сайт где находится меню (мы его добавляли для тестирования, когда пробовали все подряд)

Имейте ввиду в Advanced Experiences должна быть конкретная ссылка на App Clip, например domain.com/app-clip-123 

Узнав об этом мы побежали отключать лишние Experiences, но только через сутки App Clip перестал открываться, а еще через сутки он вовсе пропал с домена menusa.app

А вот теперь конец

В итоге App Clip работает: официанты сканируют QR-код, запускают App Clip и получают уведомления, когда нужно подойти к столику. Все в цифре, что легко масштабировать.

Если вы решите сделать App Clip, то планируйте, что вам придется:

  • Реализовать App Clip, обязательно интегрировав функционал из основного приложения, дополнительные фичи не подойдут

  • Добавить Advanced Experiences в App Store Connect

  • Создать AASA файла на сайте, чтобы связать ваше приложение со ссылкой

  • Протестировать через Local Advanced Experiences на телефоне до релиза

  • Пройти ревью

  • Подождать индексацию со стороны Apple — в нашем случае это заняло целых 2 недели, не отчаивайтесь!

Если вам понравилось и вы больше хотите узнать про разработку приложений в Додо Инжиниринге, то подписывайтесь на канал Dodo Mobile

Комментарии (4)


  1. MaxPro33
    21.11.2023 05:59

    Как проект Menusa реализует функционал вызова официанта через мобильное приложение и использование технологии App Clip для обеспечения данной функциональности?


    1. VladGalkib Автор
      21.11.2023 05:59

      Как проект Menusa реализует функционал вызова официанта через мобильное приложение


      Официант сканирует QR-код, открывается и устанавливается App Clip с режимом официанта, так он выходит на смену и готов принимать заказы. 

      Гость в заведении сканирует QR-код на столе, открывает сайт с меню, выбирает что нравится и прямо из меню жмет кнопку вызова официанта (в QR код вшит номер стола).

      Далее наш backend сервер, обрабатывает действие которые выбрал гость, формирует модель и отправляет через APNS сервера Apple, пуш доходит до официанта и отображается в мобильном приложении.

      Использование технологии App Clip для обеспечения данной функциональности

      App Clip это маленькая версия основного приложения, если у официанта установлено основное приложение, то при сканировании QR кода для выхода на смену откроется тот же самый функционал в основном приложении а не в App Clip.

      Проще говоря, мы разделили основной функционал от режима официанта с помощью App Clip.


  1. darkglaz
    21.11.2023 05:59

    А в андроиде будет что-то подобное?


    1. VladGalkib Автор
      21.11.2023 05:59

      На андроиде реализовали функционал официанта только внутри основного приложения через Universal links, флоу идентичный iOS за исключением того что для начала работы нужно скачать приложения из маркета.
      Возможно в дальнейшем реализуем Instant app.