App Clips — это облегченные версии приложения для iOS 14, которые позволяют людям быстро выполнять определенную задачу, не скачивая и не устанавливая его полную версию из App Store. Компания Apple анонсировала такие мини-приложения на всемирной конференции для разработчиков WWDC 2020. Мы в Rambler Group одними из первых попробовали App Clips для приложений «Рамблер/кассы».
Как работают App Clips
App Clip — это часть полного приложения (по правилам Apple App Clips не могут превышать 10 МБ), заточенная на выполнение определенной задачи. Например, заказ еды, покупка билета, бронирование гостиницы и т.д. При этом App Clips не надо устанавливать — достаточно просто запустить по ссылке.
Мини-приложения не сохраняются на домашних экранах смартфона или планшета iOS, а размещаются в «Библиотеке приложений». Через 30 дней с момента последнего запуска они автоматически удаляются с устройства. Для удобства пользователей в App Clips есть возможность добавить поддержку Apple Pay и вход через Apple ID для быстрой авторизации и оплаты услуг и товаров — без регистрации, ввода дополнительной информации и номера банковской карты.
Также Apple сделала множество вариантов запуска App Clips как в офлайне, так и в онлайне:
При этом App Clips используют такую же кодовую базу, что и основное приложение, а по своему формату больше похожи на плагин или контейнер.
Краткое руководство по добавлению App Clips в «Рамблер/кассу»
В этой статье мы хотим рассказать о некоторых нюансах создания App Clips для приложений «Рамблер/кассы».
Для интеграции мини-приложения на данный момент у нас выработан алгоритм:
1. Необходимо добавить target AppClip в проект, при этом указав целевой проект родительским (в нашем случае target Kassa).
2. Добавить при необходимости нужные pod'ы, указав их для конкретного target в Podfile (выполнить pod install).
3. В настройках таргета App Clips нужно перейти на вкладку Signing & Capabilities и в секции Associated Domains добавить домен вида appclips:{домен ссылки, которая будет открывать App Clips}. В случае «Рамблер/кассы» это appclips:kassa.rambler.ru и appclips:m.kassa.rambler.ru.
4. Указать версию и билд для target с App Clips, которые идентичны версии и билду родительского таргета.
5. Обработать входящие url для App Clips и реализовать навигацию для App Clips в методе, согласно документации Apple
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void -> Bool.
6. Собрать архив с приложением (оно должно автоматически включать App Clips) и отправить его в AppStore.
7. Вы великолепны!
Ссылки и открытие экранов
После того как пользователь нажимает «Открыть AppClip/Приложение» на всплывающем экране с App Clips, срабатывает метод:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
В userActivity.webpageURL лежит URL-ссылка, которую мы зашивали в качестве ссылки для App Clips.
После этого на основе параметров из этой ссылки откроется нужный экран приложения.
Виды ссылок
В данный момент App Clips «Рамблер/кассы» поддерживает три сценария покупки билетов:
Для тестирования мы взяли рабочие ссылки на ивенты, доступные на «Рамблер/кассе» с различными параметрами.
1. Мероприятие. В качестве вводных параметров взяли creationid, cityid, creationtype:
m.kassa.rambler.ru/msk/movie/100547?creationid=100547&cityid=2&creationtype=movie
Ссылка открывает экран деталей мероприятия, окружение идентично покупке билета в полноценном приложении, за исключением следующих вещей:
2. Место. В качестве вводных параметров взяли placeid, cityid, creationtype:
m.kassa.rambler.ru/msk/cinema/formula-kino-cdm-54351?placeid=97417&cityid=2&creationtype=movie
Ссылка открывает экран деталей места, окружение идентично покупке билета в полноценном приложении, за исключением:
3. Ссылка на конкретный сеанс. В качестве вводных параметров взяли sessionid:
m.kassa.rambler.ru/msk/concert/717293?cityid=2&sessionid=54293235
Ссылка открывает экран с конкретным сеансом (в виде таблицы или схемы зала), окружение идентично покупке билета в полноценном приложении.
Проблемы и решения
1. App Сlip запускается и падает
Проблема наблюдается при использовании сторонних pod'ов. При сборке продукта не копируются библиотеки в конечную директорию. Причина — отсутствие скрипта в Build Phases.
Для решения этой проблемы необходимо добавить скрипт (назовем его [CP] Embed Pods Frameworks):
${PODS_ROOT}/Target Support Files/Pods-{здесь имя таргета с апклипсом}/Pods-{здесь имя таргета с апклипсом}-frameworks.sh
В случае «Рамблер/кассы» скрипт выглядит так:
${PODS_ROOT}/Target Support Files/Pods-KassaAppClip/Pods-KassaAppClip-frameworks.sh
2. Сборка с App Clips собирается, архивируется и отправляется в AppStore, но приходит reject из-за веса приложения
В основном причиной этой проблемы являются какие-то большие ресурсы и сторонние библиотеки.
Одним из решений, позволяющим уменьшить размер библиотеки в целевом архиве, является включение Bitcode (Build Settings/Build Options/Enable Bitcode).
3. В App Clips метод UIDevice.current.identifierForVendor возвращает 000000-0000-000000.....
Это связано с особенностью App Clips: Apple ограничила доступ к идентификатору из соображений безопасности. В App Clips «Рамблер/кассы» мы используем рандомно сгенерированную 32-значную соль.
Что в итоге?
App Clips — хороший способ повышения конверсии для таких e-com-приложений, как «Рамблер/касса». В плюсе остаются все:
Как работают App Clips
App Clip — это часть полного приложения (по правилам Apple App Clips не могут превышать 10 МБ), заточенная на выполнение определенной задачи. Например, заказ еды, покупка билета, бронирование гостиницы и т.д. При этом App Clips не надо устанавливать — достаточно просто запустить по ссылке.
Мини-приложения не сохраняются на домашних экранах смартфона или планшета iOS, а размещаются в «Библиотеке приложений». Через 30 дней с момента последнего запуска они автоматически удаляются с устройства. Для удобства пользователей в App Clips есть возможность добавить поддержку Apple Pay и вход через Apple ID для быстрой авторизации и оплаты услуг и товаров — без регистрации, ввода дополнительной информации и номера банковской карты.
Также Apple сделала множество вариантов запуска App Clips как в офлайне, так и в онлайне:
- фирменная метка App Clips
- NFC-метка
- QR-код
- URL-ссылка
- баннер
- Apple Maps
- Siri.
При этом App Clips используют такую же кодовую базу, что и основное приложение, а по своему формату больше похожи на плагин или контейнер.
Краткое руководство по добавлению App Clips в «Рамблер/кассу»
В этой статье мы хотим рассказать о некоторых нюансах создания App Clips для приложений «Рамблер/кассы».
Для интеграции мини-приложения на данный момент у нас выработан алгоритм:
1. Необходимо добавить target AppClip в проект, при этом указав целевой проект родительским (в нашем случае target Kassa).
2. Добавить при необходимости нужные pod'ы, указав их для конкретного target в Podfile (выполнить pod install).
3. В настройках таргета App Clips нужно перейти на вкладку Signing & Capabilities и в секции Associated Domains добавить домен вида appclips:{домен ссылки, которая будет открывать App Clips}. В случае «Рамблер/кассы» это appclips:kassa.rambler.ru и appclips:m.kassa.rambler.ru.
4. Указать версию и билд для target с App Clips, которые идентичны версии и билду родительского таргета.
5. Обработать входящие url для App Clips и реализовать навигацию для App Clips в методе, согласно документации Apple
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void -> Bool.
6. Собрать архив с приложением (оно должно автоматически включать App Clips) и отправить его в AppStore.
7. Вы великолепны!
Ссылки и открытие экранов
После того как пользователь нажимает «Открыть AppClip/Приложение» на всплывающем экране с App Clips, срабатывает метод:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
В userActivity.webpageURL лежит URL-ссылка, которую мы зашивали в качестве ссылки для App Clips.
После этого на основе параметров из этой ссылки откроется нужный экран приложения.
Виды ссылок
В данный момент App Clips «Рамблер/кассы» поддерживает три сценария покупки билетов:
- открытие экрана деталей конкретного мероприятия;
- открытие экрана деталей конкретного места;
- открытие экрана конкретного сеанса для конкретного мероприятия.
Для тестирования мы взяли рабочие ссылки на ивенты, доступные на «Рамблер/кассе» с различными параметрами.
1. Мероприятие. В качестве вводных параметров взяли creationid, cityid, creationtype:
m.kassa.rambler.ru/msk/movie/100547?creationid=100547&cityid=2&creationtype=movie
Ссылка открывает экран деталей мероприятия, окружение идентично покупке билета в полноценном приложении, за исключением следующих вещей:
- на экране с деталями мероприятия отсутствует кнопка добавления в избранное;
- отсутствует отображение видео на деталях мероприятия.
2. Место. В качестве вводных параметров взяли placeid, cityid, creationtype:
m.kassa.rambler.ru/msk/cinema/formula-kino-cdm-54351?placeid=97417&cityid=2&creationtype=movie
Ссылка открывает экран деталей места, окружение идентично покупке билета в полноценном приложении, за исключением:
- на экране с деталями места отсутствует нижняя панель с функционалом навигации до места, добавления его в избранное и возможностью поделиться ссылкой.
3. Ссылка на конкретный сеанс. В качестве вводных параметров взяли sessionid:
m.kassa.rambler.ru/msk/concert/717293?cityid=2&sessionid=54293235
Ссылка открывает экран с конкретным сеансом (в виде таблицы или схемы зала), окружение идентично покупке билета в полноценном приложении.
Проблемы и решения
1. App Сlip запускается и падает
Проблема наблюдается при использовании сторонних pod'ов. При сборке продукта не копируются библиотеки в конечную директорию. Причина — отсутствие скрипта в Build Phases.
Для решения этой проблемы необходимо добавить скрипт (назовем его [CP] Embed Pods Frameworks):
${PODS_ROOT}/Target Support Files/Pods-{здесь имя таргета с апклипсом}/Pods-{здесь имя таргета с апклипсом}-frameworks.sh
В случае «Рамблер/кассы» скрипт выглядит так:
${PODS_ROOT}/Target Support Files/Pods-KassaAppClip/Pods-KassaAppClip-frameworks.sh
2. Сборка с App Clips собирается, архивируется и отправляется в AppStore, но приходит reject из-за веса приложения
В основном причиной этой проблемы являются какие-то большие ресурсы и сторонние библиотеки.
Одним из решений, позволяющим уменьшить размер библиотеки в целевом архиве, является включение Bitcode (Build Settings/Build Options/Enable Bitcode).
3. В App Clips метод UIDevice.current.identifierForVendor возвращает 000000-0000-000000.....
Это связано с особенностью App Clips: Apple ограничила доступ к идентификатору из соображений безопасности. В App Clips «Рамблер/кассы» мы используем рандомно сгенерированную 32-значную соль.
Что в итоге?
App Clips — хороший способ повышения конверсии для таких e-com-приложений, как «Рамблер/касса». В плюсе остаются все:
- пользователи могут быстро купить билет, не скачивая и не устанавливая основное приложение;
- разработчикам приятно быстро реализовать возможность, которая позволит быть зафичеренными или засветиться на лендинге с презентацией новой iOS 14: