Должен ли я избегать пользовательского интерфейса, когда приложение iOS запускается в фоновом режиме

Мое приложение поддерживает фоновые обновления местоположения (особенно при значительном мониторинге местоположения).

Нужно ли предотвращать загрузку пользовательского интерфейса (через контроллеры и т. д.), когда я узнаю, что приложение находится в фоновом режиме (application.applicationState == UIApplicationStateBackground)?

Мое намерение состоит в том, чтобы избежать тяжелой загрузки пользовательского интерфейса (это БОЛЬШОЕ приложение) в фоновом режиме, что может привести к потере всего ограниченного времени, которое у меня есть в фоновом режиме, чтобы фактически реагировать на обновление местоположения.

Например (в ObjC, но вопрос также для Swift), скажем, у меня есть некоторый RootViewController, который инициализирует и содержит всю иерархию контроллеров/представлений, должен ли я в viewDidLoad сделать:

if ([UIApplication sharedApplication].applicationState ==  UIApplicationStateBackground) {
    // Root view controller loaded while in background, so doing only background stuff
    [self justDoBackgroundStuffWithoutUI];
} else {
    // Root view controller loaded normally, so loading normal UI
    [self initializeUIAndChildControllers];
}

? Или я должен просто «доверить» iOS игнорировать все эти задачи пользовательского интерфейса, потому что она будет знать, что находится в фоновом состоянии?


person mllm    schedule 05.01.2017    source источник
comment
Вы можете просто доверить iOS справиться с этим, он не будет отображать пользовательский интерфейс в фоновом состоянии, это встроено в ОС. Базовая структура UIKit будет решать, нужно ли приложению фактически отображать или нет. Имейте в виду, что события жизненного цикла приложения для контроллеров представления в основном возникают в ответ на взаимодействие с пользователем, после запуска viewDidLoad и viewDidAppear остальные действительно запускаются только тогда, когда пользователь что-то делает, чего они не будут, пока приложение не на переднем плане.   -  person Scriptable    schedule 05.01.2017
comment
Другая мысль заключается в том, что, если мои контроллеры также, например, автоматически загружают много изображений на свои viewDidLoad - я предполагаю, что это не будет игнорироваться ОС. Возможно, UIImageViewa не будут отображаться, но данные и UIImages действительно будут загружены.   -  person mllm    schedule 05.01.2017
comment
В этом случае сетевые запросы «должны» по-прежнему выполняться, но когда приложение находится в фоновом режиме, у любых оставшихся задач есть только ограниченное количество времени для завершения того, что они делают, прежде чем они будут приостановлены/прекращены. он не будет просто продолжать работать бесконечно.   -  person Scriptable    schedule 05.01.2017
comment
@mllm: Попробуйте переместить код загрузки изображения в viewWillAppear (но, очевидно, выполните его только один раз). viewWillAppear не следует вызывать до тех пор, пока не появится представление. Кроме того, на iPad Pro + разделенный экран ваше приложение может быть в фоновом режиме, но видимым, поэтому вам, возможно, придется обновлять экран в фоновом режиме.   -  person gnasher729    schedule 05.01.2017


Ответы (2)


Вы можете игнорировать их и позволить ОС справиться с этим, просто будьте осторожны, если у вас есть длительные задачи BG, у них может быть или не быть времени для завершения, поэтому лучше быть очень осторожным, поскольку это не позволит вам запускать задачи вечно.

person Matt Douhan    schedule 05.01.2017

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

  • ненужным, потому что нет никакой дополнительной ценности для пользователя, который не использует приложение. Простого выполнения вещей в представленииWillAppear будет достаточно.
  • сбивает с толку, потому что пользователи, возможно, ожидают увидеть изменения сами при появлении экрана, я не знаю о вашем приложении, но это скорее бизнес-выбор. Возможно, у вас есть что-то похожее в способе отображения изменений, например gmail/whatsapp, и вы хотите, чтобы пользователи видели новые электронные письма/сообщения.
  • неэффективно, потому что вы просто слишком рано делаете что-то, что потребляет батарею. Вы даже сказали «тяжелая загрузка пользовательского интерфейса». Что произойдет, если местоположение будет меняться снова и снова и снова? могут ли изменения быть отменены в том смысле, что они больше не нужны, или вам всегда будут нужны изменения, независимо от того.

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

person Honey    schedule 05.01.2017