Я запускаю фоновую загрузку, используя 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) показывает это:
В нем говорится, что приложение «запускается в фоновом режиме» при получении push-уведомления с content-available
флагом.
Почему мое приложение не запускается в фоновом режиме?
Итак, настоящий вопрос:
Будет ли iOS выполнять фоновые задачи после принудительного выхода из приложения?
источник
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Ответы:
UPDATE2:
Вы можете добиться этого, используя новую платформу PushKit, представленную в iOS 8. Хотя PushKit используется для VoIP. Таким образом, ваше использование должно быть связано с VoIP, в противном случае существует риск отклонения приложения. (См. Этот ответ ).
UDPDATE1:
Документация была уточнена для iOS8 . Документацию можно прочитать здесь . Вот соответствующая выдержка:
Хотя это не было ясно из видео WWDC, быстрый поиск на форумах разработчиков показал это:
https://devforums.apple.com/message/873265#873265 (требуется вход в систему)
Этот пост был написан сотрудником Apple, поэтому я думаю, что могу доверять этой информации.
Таким образом, похоже, что когда приложение убито из переключателя приложений (проведением пальцем вверх), приложение никогда не будет запущено, даже для запланированных фоновых загрузок.
источник
Вы можете изменить настройки запуска вашей цели в «Управление схемой» на
Wait for <app>.app to be launched manually
, что позволяет отлаживать ее, устанавливая точку остановаapplication: didReceiveRemoteNotification: fetchCompletionHandler:
и отправляя push-уведомление для запуска фонового запуска.Я не уверен, что это решит проблему, но пока может помочь с отладкой.
источник
Ответ ДА, но не следует использовать «Фоновая выборка» или «Удаленное уведомление». PushKit - это ответ, который вы желаете.
Таким образом, PushKit, новая платформа в ios 8, представляет собой новый механизм push-уведомлений, который может автоматически запускать ваше приложение в фоновом режиме без визуального оповещения, даже если ваше приложение было убито, если его убрать из переключателя приложений, удивительно, что вы даже не видите его из переключателя приложений.
Ссылка PushKit от Apple:
Чтобы развернуть эту новую функцию, обратитесь к этому руководству: https://zeropush.com/guide/guide-to-pushkit-and-voip - я протестировал его на своем устройстве, и он работает, как и ожидалось.
источник
На самом деле, если вам нужно протестировать фоновую выборку, вам нужно включить одну опцию в схеме:
Другой способ, как вы можете проверить это:
Вот полная информация об этой новой функции: http://www.objc.io/issue-5/multitasking.html
источник
Я пробовал разные варианты этого в течение нескольких дней, и я думал, что в течение одного дня он перезапускал приложение в фоновом режиме, даже когда пользователь проводил пальцем, чтобы убить, но нет, я не могу повторить это поведение.
К сожалению, поведение совсем другое, чем раньше. На iOS 6, если вы убьете приложение из-за движущихся значков, оно все равно будет повторно активировано при срабатывании SLC. Теперь, если вы убиваете, проводя, это не произойдет.
Это другое поведение, и пользователь, который продолжал бы получать полезную информацию из нашего приложения, если бы он убил его на iOS 6, теперь не будет.
Мы должны подтолкнуть наших пользователей к повторному открытию приложения сейчас, если они сделали это, чтобы убить его, и все еще ожидают некоторые из уведомлений, которые мы использовали для их предоставления. Я беспокоюсь, что это не будет очевидно для пользователей, когда они удаляют приложение. Они могут, в конце концов, в основном убирать или хотеть изменить расположение приложений, которые показаны свернутыми.
источник
Это может помочь вам
Источник: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
источник
Ссылка на видео: https://developer.apple.com/videos/play/wwdc2019/707/
источник