Ответ 1
По сути, в iOS нет такого понятия, как приложение типа сервиса или функциональность. Даже "фоновые" приложения (UIBackgroundMode) не могут работать совершенно бесплатно и без ограничений, таких как служба, демон и т.д. В других ОС.
Здесь ситуация с фоновым исполнением и уведомлениями и таймерами и т.д.
1) Приложение не может выполняться в фоновом режиме, если:
а) он запрашивает дополнительное время у ОС для этого. Это делается с помощью beginBackgroundTaskWithExpirationHandler. Apple не указывает (намеренно), как долго это дополнительное время, однако на практике оно составляет около 10 минут.
б) приложение имеет фоновый режим, режимы VoIP, аудио, местоположение, газетный киоск. Даже если у него есть один из этих типов, приложение не может выполняться без ограничений. В остальной части этого обсуждения предполагается, что приложение не имеет фонового режима. Если вы попытаетесь использовать один из этих фоновых режимов, чтобы ваше приложение могло работать в фоновом режиме, но ваше приложение не использует законным образом определенные функции, тогда ваше приложение будет отклонено после отправки в магазин приложений (т.е. Иметь UIBackgroundMode Это ДОЛЖНО быть: приложение VoIP, НЕОБХОДИМОЕ иметь постоянные обновления местоположения, возможность непрерывного воспроизведения звука в фоновом режиме - это фундаментальная функция, или приложение для газетных киосков).
2) Когда приложение приостановлено, оно не может сделать НИЧЕГО, чтобы пробудить себя напрямую. Ранее он не мог запланировать NSTimer, он не может использовать что-то вроде executeSelector: afterDelay. и т.п.
Единственный способ, которым приложение может снова стать активным, - это если ПОЛЬЗОВАТЕЛЬ делает что-то, чтобы сделать его активным. Пользователь может сделать это с помощью следующего:
а) Запустите приложение прямо с его иконки
б) Запустите приложение в ответ на локальное уведомление, которое ранее было запланировано приложением, когда оно было активным.
c) Запустите приложение в ответ на удаленное уведомление, отправленное сервером.
d) несколько других: например, запуск URL, если приложение зарегистрировано для запуска через URL; или если он зарегистрирован, чтобы иметь возможность иметь дело с определенным типом контента.
Если приложение находится на переднем плане, когда запускается локальное/удаленное уведомление, приложение получает его напрямую.
Если приложение в данный момент не находится на переднем плане, когда запускается локальное/удаленное уведомление, тогда приложение НЕ получает его. Нет кода, который выполняется при срабатывании уведомления!
Только если пользователь выберет уведомление, приложение станет активным и сможет его выполнить.
Обратите внимание, что пользователь может отключить уведомления либо для всего устройства, либо только для конкретного приложения, и в этом случае пользователь никогда их не увидит. Если устройство отключено во время срабатывания уведомления, оно теряется.
ОБНОВЛЕНИЕ ДЛЯ IOS 7
1) появились некоторые новые фоновые режимы, такие как фоновая выборка (однако вы все еще не можете быть вызваны ОС детерминированным способом)
2) там теперь фоновое push-уведомление
3) время beginBackgroundTaskWithExpirationHandler уменьшено с 10 минут до 3.