Будет ли iOS запускать мое приложение в фоновом режиме, если оно будет принудительно закрыто пользователем?

Я запускаю фоновый выбор, используя флаг content-available в push-уведомлении. У меня есть fetch и remote-notification UIBackgroundModes.

Вот реализация, которую я использую в своем AppDelegate.m:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Remote Notification Recieved");
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.alertBody =  @"Looks like i got a notification - fetch thingy";
    [application presentLocalNotificationNow:notification];
    completionHandler(UIBackgroundFetchResultNewData);

}

Когда приложение работает в фоновом режиме, оно отлично работает. (уведомление получено, и приложение вызвало локальное уведомление "похоже, что я получил уведомление", как следует из приведенного выше кода).

Однако , когда приложение не запущено, и уведомление о push-адресе получено с флагом content-available, приложение не запущено и didRecieveRemoteNotification никогда не называется.

Видео WWDC, новое с многозадачностью (№ 204 от WWDC 2013) показывает следующее: enter image description here

В нем говорится, что приложение "запускается в фоновом режиме", когда push-уведомление получено с флагом content-available.

Почему мое приложение не запускается в фоновом режиме?

Итак, реальный вопрос:

Будет ли iOS выполнять фоновые задачи после того, как пользователь отключит приложение?

Ответ 1

UPDATE2:

Вы можете достичь этого, используя новую платформу PushKit, представленную в iOS 8. Хотя PushKit используется для VoIP. Таким образом, ваше использование должно быть связано с VoIP, в противном случае существует риск отклонения приложения. (См. этот ответ).


UDPDATE1:

Документация была уточнена для iOS8. Документацию можно прочитать здесь. Вот соответствующая выдержка:

Используйте этот метод для обработки входящих удаленных уведомлений для вашего приложения. В отличие от метода application:didReceiveRemoteNotification:, который вызывается только когда ваше приложение работает на переднем плане, система вызывает этот метод, когда ваше приложение работает на переднем плане или фон. Кроме того, если вы включили удаленные уведомления В фоновом режиме система запускает ваше приложение (или выводит его из приостановлено) и переводит его в фоновое состояние при нажатии уведомление приходит. Однако система не работает автоматически запустите ваше приложение, если пользователь принудительно завершил его. В этой ситуации пользователь должен перезапустить ваше приложение или перезапустить устройство, прежде чем система пытается снова запустить ваше приложение автоматически.


Хотя это не было ясно из видео WWDC, быстрый поиск на форумах разработчиков показал это:

https://devforums.apple.com/message/873265#873265  (требуется регистрация)

Также имейте в виду, что если вы убьете свое приложение с помощью переключателя приложений (т.е. проведя вверх, чтобы убить приложение), тогда ОС никогда не перезапустит приложение независимо от push-уведомления или фоновой выборки. В этом случае пользователь должен вручную перезапустить приложение, а затем из этого указать вперед, будут выполняться фоновые действия. -pmarcos

Этот пост был написан сотрудником Apple, поэтому я думаю, что могу доверять этой информации.

Таким образом, похоже, что когда приложение будет убито из переключателя приложений (проведением вверх), оно никогда не будет запущено, даже для запланированных фоновых загрузок.

Ответ 2

Вы можете изменить целевые параметры запуска в "Управление схемой" на Wait for <app>.app to be launched manually, что позволяет отлаживать, установив точку останова в application: didReceiveRemoteNotification: fetchCompletionHandler: и отправив push-уведомление для запуска фонового запуска.

Я не уверен, что это решит проблему, но теперь это может помочь вам отлаживать.

screenshot

Ответ 3

Ответ - ДА, но не следует использовать "Фоновая выборка" или "Удаленное уведомление". PushKit - это ответ, который вы желаете.

Таким образом, PushKit, новая инфраструктура в ios 8, является новым механизмом push-уведомлений, который может незаметно запускать ваше приложение в фоновом режиме без визуального предупреждения, даже если ваше приложение было убито, выталкивая приложение из переключателя приложений, удивительно, что вы даже не может видеть это из переключателя приложений.

Ссылка PushKit от Apple:

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

Чтобы развернуть эту новую функцию, обратитесь к этому руководству: https://zeropush.com/guide/guide-to-pushkit-and-voip - я протестировал ее на своем устройстве и работает так, как ожидалось.

Ответ 4

На самом деле, если вам нужно проверить фоновый выбор, вам нужно включить один параметр в схеме:

enabling bg fetch

Другой способ, как вы можете проверить это: simulate bg fetch

Вот полная информация об этой новой функции: http://www.objc.io/issue-5/multitasking.html

Ответ 5

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

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

Это другое поведение, и пользователь, который будет продолжать получать полезную информацию из нашего приложения, если они убили его на iOS 6, теперь не будет.

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

Ответ 6

Это может помочь вам

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

Источник:https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Ответ 7

Я не уверен, что это работает в push-уведомлении или нет, потому что я не пытаюсь это сделать, но вы можете попробовать это, это с сайта разработчика Apple, а также WhatsApp использует это.

Это технология VoIP для push-уведомления.

Пожалуйста, проверьте это в здесь. этот сайт разработчика яблока.

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

Ответ 8

For **iOS13**

For background PUSHES in iOS13 you must set below parameters
apns-priority = 5
apns-push-type = background
Required for WatchOS
Highly recommended for Other platforms 

Background PUSHES Ссылка на видео: https://developer.apple.com/videos/play/wwdc2019/707/