Uruchom aplikację przez ponad 10 minut w tle

Próbuję utrzymać aplikację iOS w stanie aktywnym przez ponad 10 minut, gdy wejdzie w stan tła.

Jak mogę to zaimplementować.

Author: Richard J. Ross III, 2012-03-16

7 answers

Patrz sekcja "wykonanie W Tle" W iPhoneAppProgrammingGuide . W skrócie, Twoja aplikacja musi być jednym z tych typów:

  • Aplikacje odtwarzające treści dźwiękowe dla użytkownika w tle, takie jak aplikacja odtwarzacza muzyki
  • Aplikacje informujące użytkowników o ich lokalizacji przez cały czas, takie jak aplikacja nawigacyjna
  • Aplikacje obsługujące Voice over Internet Protocol (VoIP)
  • Aplikacje kiosku, które muszą pobrać i przetworzyć nową zawartość
  • aplikacje, które otrzymuj regularne aktualizacje zewnętrznych akcesoriów

I musisz dodać do Info.plist w następujący sposób: Dodaj klucz UIBackgroundModes do swojego Info.plik plist i ustaw jego wartość na tablicę zawierającą jeden lub więcej z następujących łańcuchów:

  • audio-aplikacja odtwarza treści dźwiękowe do użytkownika w tle. (Ta zawartość obejmuje przesyłanie strumieniowe treści audio lub wideo za pomocą AirPlay.)
  • Lokalizacja-aplikacja informuje użytkowników o ich lokalizacji, nawet gdy jest bieganie w tle.
  • voip-aplikacja umożliwia użytkownikowi wykonywanie połączeń telefonicznych za pomocą połączenia internetowego.
  • newsstand-content-aplikacja jest aplikacją newsstand, która pobiera i przetwarza magazyn lub gazetę zawartość w tle.
  • external-accessory-aplikacja współpracuje z akcesorium sprzętowym, które musi dostarczyć aktualizacje na regularny harmonogram poprzez zewnętrzne ramy akcesoriów.
  • [5]} Bluetooth-central-aplikacja współpracuje z akcesorium Bluetooth który musi dostarczać aktualizacje na harmonogram regularny za pośrednictwem CoreBluetooth framework

Należy pamiętać, że częścią procesu przeglądu będzie sprawdzanie, aby upewnić się, że aplikacja robi to, co mówi, że robi w odniesieniu do przetwarzania w tle.

 55
Author: Brian Cooley,
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
2016-01-06 05:09:56

Oto co zrobiłem używając beginBackgroundTaskWithExpirationhandler .

  • napisz metodę rozpoczynającą zadanie w tle.
  • wewnątrz tego zadania w tle, Uruchom NSTimer z zaplanowanym (nie powtarzającym się) czasem, który wynosi poniżej 10 minut. Na potrzeby mojej sytuacji wykorzystałem 5 minut.
  • Po wywołaniu selektora NStimer Zakończ zadanie w tle, a następnie natychmiast wywołaj metodę, którą napisałeś wcześniej, aby rozpocząć inne zadanie w tle.
  • Jeśli chcesz zaplanować metody do uruchomienia w określonych godzinach, musisz sprawdzić je w zadaniu w tle.

To rozwiązanie nie jest idealne i nadal jest głodne władzy, ale zrobi to, co chcesz.

Edit: od iOS7, proponuję przeczytać ten doskonały post .

 20
Author: ingh.am,
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-24 14:23:06

Tylko niektóre typy aplikacji mogą działać w tle. Zobacz sekcję "wdrażanie długotrwałych zadań w tle" tego przewodnika .

Jeśli nie żądasz uprawnień do przetwarzania w tle, możesz użyć aplikacji beginBackgroundTaskWithExpirationhandler , ale nie możesz uzyskać dodatkowego czasu.

 2
Author: CJ Foley,
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
2012-03-16 14:09:06

Ten kod sprawia, że aplikacja na iOS działa w nieskończoność w tle. Skopiuj i wklej poniższe metody do singleton / menedżera, który obsługuje zadania, które musisz wykonać w tle.

// @interface

// Declare Private property
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;

//@end
// ...

// Copy into
//@implementation 

- (void)setupBackgrounding {
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appBackgrounding:)
                                                 name: UIApplicationDidEnterBackgroundNotification
                                               object: nil];
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appForegrounding:)
                                                 name: UIApplicationWillEnterForegroundNotification
                                               object: nil];
}

- (void)appBackgrounding: (NSNotification *)notification {
    [self keepAlive];
}

- (void) keepAlive {
    self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
        [self keepAlive];
    }];
}

- (void)appForegrounding: (NSNotification *)notification {
    if (self.backgroundTask != UIBackgroundTaskInvalid) {
        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
    }
}
 2
Author: rismay,
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-11-15 22:36:46

Https://github.com/yarodevuci/backgroundTask Sprawdź mój kod tutaj używam odtwarzacza audio, który odtwarza pusty plik wav działa idealnie na IOS 8 zużycie baterii około 10% w ciągu 24 godzin Sposób użycia:

var backgroundTask = BackgroundTask()
backgroundTask.startBackgroundTask() //Starts playing blank audio file. You can run NSTimer() or whatever you need and it will continue executing in the background.

backgroundTask.stopBackgroundTask() //Stops the task

Uwaga: Apple odrzuci to, jeśli spróbujesz je przesłać!

 1
Author: Maksim Kniazev,
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
2017-07-07 13:24:38

Nie możesz. chyba, że Twoja aplikacja używa audio, voip lub gps. Możesz powiadomić użytkownika (za pomocą powiadomień lokalnych), że czas się zbliża i poprosić go o otwarcie/zamknięcie aplikacji.

Również jeśli po prostu trzeba powiadomić użytkownika, można użyć powiadomień push.

 0
Author: fbernardo,
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
2012-03-16 14:06:29

Jeśli typ aplikacji nie jest jednym z VOIP / Audio / lokalizacja....(sprawdź tryby tła),

Lub nie chcesz określać swojej aplikacji jako aplikacji w tle, możesz zaimplementować beginBackgroundTaskWithName:expirationHandler lub beginBackgroundTaskWithExpirationhandler aby poprosić o więcej czasu na uruchomienie procesu w tle. Szczegółowy opis znajdziesz tutaj

Aplikacje poruszające się w tle powinny się w stanie spoczynku tak szybko, jak to możliwe, aby mogły być zawieszone przez system. Jeśli Twoja aplikacja jest w trakcie wykonywania zadania i potrzebuje trochę więcej czasu na wykonanie tego zadania, może wywołać beginBackgroundTaskWithName: expirationHandler: lub beginBackgroundTaskWithExpirationhandler: metodę obiektu UIApplication, aby zażądać dodatkowego czasu wykonania. Wywołanie jednej z tych metod opóźnia tymczasowe zawieszenie aplikacji, dając jej trochę więcej czasu na zakończenie pracy. Po zakończeniu tej pracy aplikacja musi wywołać metodę endBackgroundTask:, aby poinformować system, że jest gotowy i może zostać zawieszony.

Każde wywołanie metody beginBackgroundTaskWithName: expirationHandler: lub beginBackgroundTaskWithExpirationhandler: generuje unikalny token do powiązania z odpowiednim zadaniem. Gdy aplikacja zakończy zadanie, musi wywołać metodę endBackgroundTask: z odpowiednim tokenem, aby poinformować system, że zadanie zostało ukończone. Brak wywołania metody endBackgroundTask: dla zadania w tle spowoduje zakończenie aplikacji. Jeśli podczas uruchamiania zadania podałeś funkcję obsługi wygaśnięcia, system wywoła tę funkcję i daje ci ostatnią szansę na zakończenie zadania i uniknięcie zakończenia.

 0
Author: User9527,
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
2017-12-05 09:08:54