Czy system iOS uruchomi moją aplikację w tle, jeśli użytkownik zamknął ją na siłę?

Uruchamiam pobieranie w tle, używając flagi content-available w powiadomieniu push. Mam fetch i remote-notification UIBackgroundModes włączone.

Oto implementacja, której używam w moim 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 jest odbierane, a aplikacja uruchomiła lokalne powiadomienie "wygląda na to, że dostałem powiadomienie" , jak powinien to zrobić powyższy kod).

Jednak Gdy aplikacja nie działa i powiadomienie push jest odbierane z flagą content-available, aplikacja nie jest uruchamiana , a metoda delegata didRecieveRemoteNotification nigdy nie jest wywoływana.

Wideo WWDC Co nowego z wielozadaniowości (#204 z WWDC 2013) pokazuje to: Tutaj wpisz opis obrazka

Mówi, że aplikacja jest "uruchamiana w tle" po otrzymaniu powiadomienia push z flagą content-available.

Dlaczego moja aplikacja nie uruchamia się w tle?

Więc prawdziwe pytanie brzmi:

Czy iOS wykonywać zadania w tle po tym, jak użytkownik wymusi zamknięcie aplikacji?

Author: Honey, 2013-09-28

6 answers

UPDATE2:

Możesz to osiągnąć za pomocą nowego frameworka PushKit, wprowadzonego w iOS 8. Chociaż PushKit jest używany do VoIP. Tak więc korzystanie powinno być związane z VoIP, w przeciwnym razie istnieje ryzyko odrzucenia aplikacji. (Zobacz ta odpowiedź ).

UDPDATE1:

Dokumentacja została wyjaśniona dla iOS8 . Dokumentację można przeczytać tutaj . Oto odpowiedni fragment:

Użycie ta metoda przetwarzania przychodzących powiadomień zdalnych dla Twojej aplikacji. W przeciwieństwie do metody application:didReceiveRemoteNotification:, która jest wywoływane tylko wtedy, gdy aplikacja jest uruchomiona na pierwszym planie, system wywołuje tę metodę, gdy aplikacja jest uruchomiona na pierwszym planie lub tło. Ponadto, jeśli włączyłeś powiadomienia zdalne tryb tła, system uruchamia aplikację (lub budzi ją z stan zawieszony) i umieszcza go w stanie tła, gdy push nadchodzi powiadomienie. jednak system robi nie automatycznie uruchom aplikację, jeśli użytkownik ma siłę-zamknij ją. W tej sytuacji użytkownik musi ponownie uruchomić aplikację lub ponownie uruchomić urządzenie przed uruchomieniem systemu próbuje ponownie uruchomić aplikację automatycznie.


Chociaż wideo WWDC nie wyjaśniło tego jasno, szybkie wyszukiwanie na forach programistów wykazało, że: {]}

Https://devforums.apple.com/message/873265#873265 (wymagane logowanie)

Należy również pamiętać, że jeśli zabijesz swojego aplikacja z przełącznika aplikacji (tj. przesunięcie w górę, aby zabić aplikację) wtedy system operacyjny nigdy nie uruchomi ponownie aplikacja niezależnie od powiadomienia push lub pobierania w tle. W tym przypadku użytkownik musi ręcznie ponownie uruchomić aplikację raz, a następnie z tego wskaż, że zostaną wywołane działania w tle. - pmarcos

Ten post był przez pracownika Apple, więc myślę, że mogę zaufać, że te informacje są poprawne.

Więc wygląda na to, że gdy aplikacja zostanie zabita z aplikacji przełącznik (przesuwając w górę), aplikacja nigdy nie zostanie uruchomiona, nawet dla zaplanowanych pobrań w tle.

 206
Author: Santa Claus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-21 16:04:08

Możesz zmienić ustawienia uruchamiania celu w "Zarządzaj schematem" na Wait for <app>.app to be launched manually , co pozwala na debugowanie przez ustawienie punktu przerwania w application: didReceiveRemoteNotification: fetchCompletionHandler: i wysłanie powiadomienia push, aby uruchomić uruchomienie w tle.

Nie jestem pewien, czy to rozwiąże problem, ale może pomóc w debugowaniu na razie.

zrzut ekranu

 66
Author: runmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-06 22:28:02

Odpowiedź brzmi tak, ale nie należy używać "pobieranie w tle" lub "zdalne powiadomienie". PushKit jest odpowiedzią, której pragniesz.

Podsumowując, PushKit, nowy framework w ios 8, to nowy mechanizm powiadomień push, który może po cichu uruchomić aplikację w tle bez monitu wizualnego alertu, nawet Twoja aplikacja została zabita przez przesunięcie z przełącznika aplikacji, o dziwo nawet nie widać jej z przełącznika aplikacji.

Pushkit reference od Apple:

The PushKit framework zapewnia zajęcia dla aplikacji na iOS do odbieranie wypychania ze zdalnych serwerów. Popychacze mogą być jednego z dwóch typów: standard i VoIP. Standardowe wypychania mogą dostarczać powiadomienia tak samo jak w poprzednich wersjach iOS. VoIP zapewnia dodatkowe funkcjonalność poza standardowym push, który jest potrzebny do aplikacji VoIP aby wykonać na żądanie przetwarzanie push przed wyświetlaniem powiadomienie użytkownika.

Aby wdrożyć tę nową funkcję, zapoznaj się z tym samouczkiem: https://zeropush.com/guide/guide-to-pushkit-and-voip - Przetestowałem go na moim urządzeniu i działa zgodnie z oczekiwaniami.

 33
Author: superZhen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-02 17:27:31

W rzeczywistości, jeśli chcesz przetestować pobieranie w tle, musisz włączyć jedną opcję w scheme:

włączanie pobierania bg

Inny sposób, jak można go przetestować: symulacja pobierania bg

Oto pełna informacja o tej nowej funkcji: http://www.objc.io/issue-5/multitasking.html

 13
Author: Danil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-01 16:48:13

Próbowałem różnych wariantów tego dni, i myślałem, że przez jeden dzień miałem to ponowne uruchomienie aplikacji w tle, nawet gdy użytkownik przesunął, aby zabić, ale nie mogę replikować tego zachowania.

Szkoda, że zachowanie jest zupełnie inne niż wcześniej. Na iOS 6, jeśli zabiłeś aplikację z jiggling ikony, to nadal zostanie ponownie obudzony na wyzwalacze SLC. Jeśli zabijasz przez machnięcie, to się nie stanie.

To inne zachowanie, a użytkownik, który nadal będą uzyskiwać przydatne informacje z naszej aplikacji, gdyby zabili go na iOS 6, Teraz nie.

Musimy popchnąć naszych użytkowników, aby ponownie otworzyć aplikację teraz, jeśli zostały przesunięte, aby ją zabić i nadal oczekuje niektórych zachowań powiadomień, które użyliśmy, aby dać im. Obawiam się, że nie będzie to oczywiste dla użytkowników, gdy przesuną aplikację. W końcu mogą być w zasadzie czyszczeniem lub chcą zmienić kolejność aplikacji, które są wyświetlane zminimalizowane.

 2
Author: snarshad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-18 23:03:55

To może Ci pomóc

W większości przypadków system nie uruchamia ponownie aplikacji po ich wymuszeniu Zamknij przez użytkownika. Jednym z wyjątków są aplikacje lokalizacyjne, które w iOS 8 i później są ponownie uruchamiane po wymuszonym zamknięciu przez użytkownika. W innych przypadki, jednak użytkownik musi uruchomić aplikację jawnie lub ponownie uruchomić urządzenia przed uruchomieniem aplikacji automatycznie w tło przez system. Gdy ochrona hasłem jest włączona na urządzenie, system nie uruchamia się aplikacja w tle przed użytkownik najpierw odblokowuje urządzenie.

Źródło: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

 0
Author: Stanislav S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-05 10:04:07