Перейти к основному содержимому

Платформа и устройство

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

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

Что нужно понимать

  • Что операционная система на самом деле обещает — а обещает она меньше, чем кажется
  • Когда просить разрешение и что происходит после отказа
  • Что приложению позволено делать, пока оно не на переднем плане, — а позволено совсем немного
  • Какие различия платформ косметические, а какие принципиальные
  • Что сломается в следующей версии системы и как узнать об этом заранее

Основные темы

Разрешения

  • Запрос в контексте, когда пользователю уже понятно зачем
  • Окончательный отказ и переход в настройки
  • Частичные разрешения: ограниченный доступ к фотографиям, приблизительная геопозиция, предварительные уведомления
  • Объявление разрешений и их обоснование при проверке в магазине

Уведомления

  • Локальные и 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 — каталог фоновых ограничений от конкретных производителей. Неувлекательное чтение, но раз за разом именно оно объясняет «у меня на телефоне работает».