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

Я запускаю фоновую загрузку, используя content-available флаг на push-уведомлении. у меня есть fetch а также remote-notificationUIBackgroundModes включен.

Вот реализация, которую я использую в своем 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);

}

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

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

Видео WWDC, Что нового с многозадачностью (#204 от WWDC 2013) показывает это: введите описание изображения здесь

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

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

Итак, настоящий вопрос:

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

6 ответов

Решение

UPDATE2:

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


UDPDATE1:

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

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


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

https://devforums.apple.com/message/873265 (требуется вход в систему)

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

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

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

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

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

Скриншот

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

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

Ссылка PushKit от Apple:

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

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

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

включение bg fetch

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

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

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

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

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

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

Для iOS13

Для фоновых нажатий в iOS13 необходимо установить следующие параметры:

apns-priority = 5
apns-push-type = background
//Required for WatchOS
//Highly recommended for Other platforms 

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

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

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

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

Другие вопросы по тегам