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


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

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

- (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 200

6 ответов:

UPDATE2:

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


UDPDATE1:

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

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


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

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

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

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

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

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

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

screenshot

ответ да, но не следует использовать "фоновую выборку" или "удаленное уведомление". PushKit-это ответ, который вы хотите.

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

ссылка на PushKit от Apple:

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

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

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

enabling bg fetch

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

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

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

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

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

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

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

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

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