iOS-интервью: вопросы о состояниях приложений

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

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

Каковы состояния приложения iOS?

В приложении iOS есть 5 состояний приложения.

  • Not-Running: приложение не запущено.
  • Inactive: приложение находится в активном режиме, но не получает события.
  • Active: приложение находится на переднем плане и получает события.
  • Background: Приложение работает в фоновом режиме и выполняет коды.
  • Suspended: приложение находится в фоновом режиме и не выполняет коды. Обычно это происходит через 5 секунд, когда приложение остается в фоновом режиме, но это можно продлить.

Что такое неработающее состояние?

Когда приложение не запущено или система завершает работу/удаляет/выключает его, это называется состоянием «Не работает».

Что такое неактивное и активное состояние?

Неактивно: приложение работает на переднем плане, но в настоящее время не получает события. (Однако это может быть выполнение другого кода.) Приложение обычно остается в этом состоянии ненадолго, когда оно переходит в другое состояние. Приложение может переходить в неактивное состояние при получении звонков/смс. Это также может произойти при переходе в другое состояние. В этом состоянии мы не можем взаимодействовать с пользовательским интерфейсом. Это представлено UIApplication.State.inactive.

Активно: это нормальное состояние приложения, при котором приложение остается на переднем плане и получает события. Мы можем перейти в это состояние только из неактивного состояния. Это представлено UIApplication.State.active.

Что такое событие?

Большинство событий, отправляемых в приложение iOS, инкапсулируются в объект события — экземпляр класса UIEvent. События в iOS представляют собой касание пальцами (UITouch) представлений приложения или пользователя, встряхивающего устройство. Распространение и обработка событий — это работа объектов-респондеров, которые являются экземплярами класса UIResponder. Классы UIApplication, UIViewController, UIWindow и UIView (и ваш собственный RTAppDelegate) наследуются от UIResponder. (Apple Doc)

Объясните переходы состояний?

Приложение может переходить следующими способами.

Not-running -> Inactive -> Active -> Inactive -> Background -> Inactive -> Active

Как вы можете отправить приложение в фоновое состояние?

Приложение может быть отправлено в фоновое состояние с помощью

  1. Нажатие кнопки блокировки экрана
  2. Вход в экран многозадачности
  3. Нажмите кнопку «Домой» или проведите пальцем вверх.
  4. Система выдает предупреждение (например, предупреждение о низком заряде батареи)

Как проверить статус приложения?

Объясните приостановленное состояние?

Приложение переходит в это состояние из фонового состояния (в промежутке между ними вызывается неактивное состояние) операционной системой. В этом состоянии приложение остается в памяти, но не выполняет никакого кода. Поскольку в этом состоянии приложение ничего не делает, это не влияет на срок службы батареи. Приложение не будет получать уведомления при переходе в приостановленное состояние.

Если какому-либо приложению требуется память, а системе не хватает памяти, ОС может принять решение о завершении приложения из приостановленного состояния.

Как долго приложение остается в фоновом режиме, прежде чем его приостановят?

Обычно приложение остается в фоновом режиме около 5 секунд в общих случаях, прежде чем перейти в состояние ожидания, но мы можем попросить ОС продлить время, если это необходимо, используя возможности.

Есть процессы, которые могут работать бесконечное время в фоновом режиме.

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

Также есть приложения, которые переходят в фоновый режим по мере необходимости.

  • Приложения, поддерживающие передачу голоса по интернет-протоколу (VoIP).
  • Приложения газетного киоска, которым необходимо загружать и обрабатывать новый контент.
  • Приложения, которые получают регулярные обновления от внешних аксессуаров

Как узнать, перешло ли приложение в фоновое или переднее состояние?

Используя уведомление, мы можем узнать, когда приложение переходит в режим переднего плана или в фоновый режим.

Как запросить дополнительное фоновое время?

Используя beginBackgroundTaskWithExpirationHandler, мы можем запросить дополнительное время для фоновой задачи.

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

Каждый вызов этого метода должен быть сбалансирован соответствующим вызовом метода endBackgroundTask:. Вы можете узнать оставшееся время с помощью backgroundTimeRemaining. Если вы не вызываете endBackgroundTask: для каждой задачи до истечения времени, система убивает приложение.

Функция AppDelegate, связанная с состояниями приложения?

optional func funcDidBecomeActive (_ application: UIApplication)

optional func funcWillResignActive (_ application: UIApplication)

optional func funcWillEnterForeground (_ application: UIApplication)

optional func funcDidEnterBackground (_ application: UIApplication)

optional func funcWillTerminate(_ application: UIApplication)

Что происходит во время запуска приложения?

Пользователь нажимает на значок -> main() -> @main -> Load main UI file -> Initialisation (willFinishLaunchingWithOptions)-> Restore UI state -> Finish Initialisation (didFinishLaunchingWithOptions) -> Running

Что происходит во время фонового состояния?

Вошел ли фоновый режим -> Может работать в фоновом режиме?

Да -> handle events (execute code) -> Sleep/Suspend

Нет -> Suspend -> If there is a memory warning -> Terminate

Как включить фоновый режим и реализовать его?

Зайдите в настройки проекта.

Нажмите на signing and capabilities -> +Capabilities -> Background Modes

Теперь вы можете увидеть доступные фоновые режимы. Отметьте те, которые вам нужны.

Перейдите в файл info.plist и добавьте Разрешенные идентификаторы планировщика фоновых задач и добавьте свои идентификаторы.

Импортируйте BackgroundTask в свой класс, и вы сможете использовать BGTaskScheduler для регистрации фоновой операции.

Как совершать вызовы API в фоновом режиме?

Чтобы реализовать фоновую выборку, необходимо сделать три вещи:

  • Установите флажок Фоновая загрузка в фоновых режимах возможностей вашего приложения.
  • Используйте setMinimumBackgroundFetchInterval(_:), чтобы установить временной интервал, подходящий для вашего приложения.
  • Внедрите application(_:performFetchWithCompletionHandler:) в свой делегат приложения для обработки фоновой выборки.

В чем отличия iOS 13 от жизненного цикла приложения?

В iOS 13 жизненный цикл приложения обрабатывается по-разному с помощью UIWindowSceneDelegate.

- (void)sceneDidBecomeActive:(UIScene *)scene { }
- (void)sceneWillResignActive:(UIScene *)scene { }

Мы можем использовать этот метод для обработки неактивных и активных состояний.

Мы можем управлять этим поведением с помощью манифеста сцены приложения в файле info.plist приложения.

ссылки:

https://www.dummies.com/web-design-development/mobile-apps/handling-events-while-your-ios-application-is-executing/

https://developer.apple.com/library/archive/documentation/General/Conceptual/Devpedia-CocoaApp/EventHandlingiPhone.html

https://hackernoon.com/application-life-cycle-in-ios-12b6ba6af78b

https://www.iosiqa.com/2019/05/application-states.html

https://medium.com/@chinthaka01/the-execution-states-of-an-ios-application-84e117132e27

https://www.raywenderlich.com/5817-background-modes-tutorial-getting-started