Uruchamiam pobieranie w tle za pomocą content-available
flagi w powiadomieniu wypychanym. Mam fetch
i remote-notification
UIBackgroundModes
włączone.
Oto implementacja, której używam w mojej 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);
}
Gdy aplikacja działa w tle, działa dobrze. (Powiadomienie zostało odebrane, a aplikacja uruchomiła powiadomienie lokalne „wygląda na to, że dostałem powiadomienie”, tak jak powinien to zrobić powyższy kod).
Jednak gdy aplikacja nie działa, a content-available
flagę otrzymuje powiadomienie wypychane , aplikacja nie jest uruchamiana, a didRecieveRemoteNotification
metoda delegowania nigdy nie jest wywoływana.
Wideo WWDC Co nowego w wielozadaniowości (nr 204 z WWDC 2013) pokazuje to:
Mówi, że aplikacja jest „uruchamiana w tle” po otrzymaniu powiadomienia wypychanego z content-available
flagą.
Dlaczego moja aplikacja nie uruchamia się w tle?
Tak więc prawdziwe pytanie brzmi:
Czy iOS wykona zadania w tle po tym, jak użytkownik wymusi zamknięcie aplikacji?
źródło
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Odpowiedzi:
AKTUALIZACJA 2:
Możesz to osiągnąć za pomocą nowej struktury PushKit, wprowadzonej w iOS 8. Chociaż PushKit jest używany do VoIP. Dlatego należy korzystać z VoIP, w przeciwnym razie istnieje ryzyko odrzucenia aplikacji. (Zobacz tę odpowiedź ).
UDPDATE1:
Dokumentacja została wyjaśniona dla iOS8 . Dokumentację można przeczytać tutaj . Oto odpowiedni fragment:
Chociaż wideo WWDC tego nie wyjaśniło, pojawiło się szybkie wyszukiwanie na forach programistów:
https://devforums.apple.com/message/873265#873265 (wymagane logowanie)
Ten post został napisany przez pracownika Apple, więc myślę, że mogę ufać, że te informacje są prawidłowe.
Wygląda więc na to, że gdy aplikacja zostanie zabita z przełącznika aplikacji (przez przesunięcie w górę), aplikacja nigdy nie zostanie uruchomiona, nawet w przypadku zaplanowanych pobrań w tle.
źródło
Możesz zmienić ustawienia uruchamiania celu w „Zarządzaj schematem” na
Wait for <app>.app to be launched manually
, co pozwala na debugowanie poprzez ustawienie punktu przerwaniaapplication: didReceiveRemoteNotification: fetchCompletionHandler:
i wysyłanie powiadomienia wypychania w celu uruchomienia uruchamiania w tle.Nie jestem pewien, czy to rozwiąże problem, ale na razie może ci pomóc w debugowaniu.
źródło
Odpowiedź brzmi TAK, ale nie należy używać opcji „Pobieranie w tle” lub „Zdalne powiadomienie”. PushKit to odpowiedź, której pragniesz.
Podsumowując, PushKit, nowa platforma w systemie iOS 8, to nowy mechanizm powiadomień wypychanych, który może cicho uruchamiać aplikację w tle bez wizualnego powiadomienia, nawet gdy aplikacja została zabita przez przesunięcie z przełącznika aplikacji, co zadziwiające, nawet jej nie widzisz z przełącznika aplikacji.
Referencje PushKit od Apple:
Aby wdrożyć tę nową funkcję, zapoznaj się z tym samouczkiem: https://zeropush.com/guide/guide-to-pushkit-and-voip - przetestowałem ją na moim urządzeniu i działa zgodnie z oczekiwaniami.
źródło
W rzeczywistości, jeśli chcesz przetestować pobieranie w tle, musisz włączyć jedną opcję w schemacie:
Kolejny sposób, w jaki możesz to przetestować:
Oto pełne informacje na temat tej nowej funkcji: http://www.objc.io/issue-5/multitasking.html
źródło
Próbowałem różnych wariantów tego od kilku dni i przez jeden dzień myślałem, że ponownie uruchamiam aplikację w tle, nawet gdy użytkownik przesunął palcem, aby zabić, ale nie, nie mogę odtworzyć tego zachowania.
Szkoda, że zachowanie jest zupełnie inne niż wcześniej. Na iOS 6, jeśli zabijesz aplikację z poruszających się ikon, nadal będzie budzona ponownie po wyzwalaczach SLC. Teraz, jeśli zabijesz, przesuwając, tak się nie stanie.
To inne zachowanie, a użytkownik, który nadal uzyskiwałby użyteczne informacje z naszej aplikacji, gdyby zabił je na iOS 6, teraz tego nie zrobi.
Musimy szturchnąć naszych użytkowników, aby ponownie otworzyli aplikację teraz, jeśli przesunęli palcem, aby ją zabić i nadal oczekują niektórych zachowań powiadomień, które im daliśmy. Obawiam się, że nie będzie to oczywiste dla użytkowników, gdy przeciągną aplikację. Mogą to być w zasadzie czyszczenie lub chęć zmiany kolejności wyświetlanych aplikacji w zminimalizowanym zakresie.
źródło
To może ci pomóc
Źródło: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
źródło
Link do filmu: https://developer.apple.com/videos/play/wwdc2019/707/
źródło