App Clip и тысяча проблем

Знакомство

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 кода открывается шторка приложения. Оно уже скачалось в фоне без открытия App Store

При сканировании App Clip кода открывается шторка приложения. Оно уже скачалось в фоне без открытия App Store

Как выглядит сайт с меню для клиента

Как выглядит сайт с меню для клиента

Официант получил уведомление

Официант получил уведомление

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

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

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

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

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

  • uncompressed size — 9,8 MB

  • сompressed size — 2,7 MB

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

2f3dead13fb2268bf72b4361e692e55c.png

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

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

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

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

8f3188566753c4db07617a582ad05b97.png

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

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

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

c6a5ad15c5743c91e01ca3fc190673a4.png

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

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

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

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

1e5e3b5c5231230f1c7822eb85f229fe.png

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

d02f4d47e79e6576c8671490bb6a6a0d.png

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

761ff3ae724a0df7feee76b0f4941d06.png

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

dc8286d2be1e68500d718c5d23d5fed5.jpgb83cd9c02cf79a59d0609bc4095fe7d3.jpgd303762fcb88d241f49a53621f01283c.png

Результаты немного поставили в тупик: все указывало на то, что у нас нет зарегистрированного 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

cf65a913c0c693fc52ba319aa05ee2eb.png

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

8b2e2dfb4c6936e6b89f02092997225a.jpeg783997ccfe4329d9c8dc5161ed548071.jpeg89a03d673185b869a207dbb9249e6495.jpeg

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

955a996cb47ecf0285dd9cb883cca6d0.png

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

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

c6cccd0713424dc7f924a44e44394e8d.jpg

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

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

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

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

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

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

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

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

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

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

© Habrahabr.ru