Платформа и устройство
Всё, что приложение получает от операционной системы: камера и файлы, разрешения, уведомления, работа в фоне и нативный код, который приходится писать, когда подходящего пакета нет. Слой, на котором «написал один раз» заканчивается и у каждой платформы появляется собственное мнение.
Почему это важно. Именно из-за этих вещей приложение не пускают в магазин, оно сажает батарею или тихо перестаёт работать после обновления системы. И именно они хуже всего описаны в туториалах: на каждой платформе всё своё и меняется каждый год.
Что нужно понимать
- Что операционная система на самом деле обещает — а обещает она меньше, чем кажется
- Когда просить разрешение и что происходит после отказа
- Что приложению позволено делать, пока оно не на переднем плане, — а позволено совсем немного
- Какие различия платформ косметические, а какие принципиальные
- Что сломается в следующей версии системы и как узнать об этом заранее
Основные темы
Разрешения
- Запрос в контексте, когда пользователю уже понятно зачем
- Окончательный отказ и переход в настройки
- Частичные разрешения: ограниченный доступ к фотографиям, приблизительная геопозиция, предварительные уведомления
- Объявление разрешений и их обоснование при проверке в магазине
Уведомления
- Локальные и push: какую задачу решает каждый вид
- Каналы, категории и то, как пользователь ими управляет
- Что происходит при нажатии в каждом состоянии приложения — на переднем плане, в фоне, выгруженным
- Доставка не гарантирована: система старается, но не обещает
Работа в фоне
- Что разрешает каждая платформа и на какое время
- Отложенные задачи и почему они запускаются не тогда, когда просили
- Оптимизация батареи и то, как производители убивают процессы по-своему
- Проектирование, при котором ничто важное не зависит от фоновой работы
Связка с нативным кодом
- Platform channels и цена одного вызова
- Method channel против event channel
- FFI для библиотек на C
- Federated-плагины и добавление платформы к уже существующему
- Как оставить нативный код тестируемым
Устройство
- Камера, файлы, «поделиться», биометрия
- Сеть и почему «подключено» не значит «работает»
- Возможности устройств, которые есть не везде, и аккуратная деградация
Уровни
| Уровень | Как это выглядит |
|---|---|
| Junior | Использует пакеты для камеры, файлов и уведомлений. Запрашивает разрешения там же, где их запрашивает пример. |
| Middle | Ведёт полный жизненный цикл разрешения, обрабатывает нажатие на уведомление во всех состояниях приложения и осознанно разводит различия платформ. |
| Senior | Пишет platform channels и плагины, проектирует с оглядкой на ограничения фоновой работы и заранее готовится к изменениям политик операционных систем. |
Практика
Для начала
-
Обработать отказ Окончательно отказать в разрешении и добиться, чтобы приложение из этого состояния выходило, предлагая переход в настройки.
-
Нажать на уведомление Сделать так, чтобы уведомление открывало нужный экран с переднего плана, из фона и из выгруженного состояния.
-
Спросить в контексте Перенести запрос разрешения со старта приложения на тот момент, когда оно действительно нужно, и объяснить зачем.
Глубже
-
Написать канал Реализовать method channel для того, чего не даёт ни один пакет, — сразу на обеих платформах.
-
Пережить «убийцу» Проверить приложение на устройстве с агрессивным управлением батареей и починить то, что перестало работать.
-
Поддержать частичный доступ Нормально обработать ограниченный доступ к галерее, а не считать его отказом.
Проверьте себя
- Что делает ваше приложение, когда в разрешении отказано окончательно?
- Что произойдёт, если нажать на уведомление, пока приложение выгружено?
- Какие ваши функции рассчитывают на фоновую работу, которой может не быть?
- Что в приложении сломается на следующей крупной версии операционной системы?
- Какие platform channels вы вызываете часто и во что это обходится?
- Как приложение ведёт себя при ограниченном, а не полном доступе к фотографиям?
Ресурсы
- Platform integration — официальная точка входа: каналы, плагины и поведение на каждой платформе.
- Writing platform-specific code — method- и event-каналы, с обеими нативными сторонами. Справочник на случай, когда готового пакета нет.
- Android app permissions best practices — рекомендации самого Android, включая запрос в контексте и обработку отказа.
- Apple: Requesting authorization — чего ждут в iOS, и по этим же ожиданиям проверяет App Review.
- Don't kill my app — каталог фоновых ограничений от конкретных производителей. Неувлекательное чтение, но раз за разом именно оно объясняет «у меня на телефоне работает».