Jaki jest właściwy sposób obsługi zadań w tle w systemie iOS
Mam aplikację VoIP i musi ona działać w tle. Dla mojego zrozumienia są to rzeczy, które muszę zrobić:
Zgłoś aplikację jako voip.Ustaw flagę „aplikacja nie działa w tle” na NIE.Ustaw obsługę wygaśnięcia, fragment kodu, który rozszerza standardowe 10 minut czasu wykonania.Więcej?Ustawiłem obie flagi w pliku info.plist i otrzymałem 10 minut. Próbowałem tego, co sugerujeten post. Oto mój kod:
//in didFinishLaunchingWithOptions:
expirationHandler = ^{
NSLog(@"ending background task");
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
NSLog(@"restarting background task");
bgTask = UIBackgroundTaskInvalid;
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:expirationHandler];
NSLog(@"finished running background task");
};
//in applicationDidEnterBackground
NSLog(@"entering background mode");
bgTask = UIBackgroundTaskInvalid;
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:expirationHandler];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// inform others to stop tasks, if you like
[[NSNotificationCenter defaultCenter] postNotificationName:@"MyApplicationEntersBackground" object:self];
//this while loop is just here for testing
inBackground = true;
while (inBackground) {
NSLog(@"stayin alive!!"); //this keeps going forever
sleep(10);
}
});
Sytuacja:Używam biblioteki innej firmy, która obsługuje komunikację z naszą usługą internetową. Usługa jest serwerem CommuniGate pro. Otrzymuję aktualizacje obecności (online / offline) i wiadomości błyskawiczne od kontaktów za pośrednictwem biblioteki. Biblioteka jest biblioteką ximss CommuniGate, utworzonym przez nią protokołem podobnym do xmpp i używanym do żądań sip opartych na xml, a także komunikatorach i obecności. Gdy użytkownik loguje się do aplikacji, widzi swoje kontakty (lista przyjaciół CmmuniGate) i może wybrać połączenie. Po wysłaniu komunikatu weryfikacyjnego ximss i zaakceptowaniu połączenia przez drugą stronę, rejestruje on czas rozpoczęcia połączenia i rozpoczyna wywołanie w czasie rzeczywistym.
Problem:Gdy aplikacja wchodzi w tło, naciskając przycisk home, zaczynam widzieć komunikat „pozostań przy życiu” w dzienniku i co dziesięć minut widzę, że ponownie uruchamia zadanie w tle.
Gdy aplikacja wchodzi w tło, naciskając przycisk zasilania, wiadomości „pozostając przy życiu” zaczynają pojawiać się przez dziesięć minut, po czym ponownie uruchamiają zadanie w tle i zaczynają je ponownie uruchamiać co około 50–100 milisekund.
Zrobiłbym to na razie, nawet jeśli zjada baterię, ponieważ mam czas na pracę nad aktualizacjami, a nasi użytkownicy nie są właścicielami ipadów. Problemem dla mnie jest teraz to, że biblioteka ximss traci połączenie (jest oparta na sesji). Mogłem zrestartować sesję w bibliotece, ale to oznacza sporo transferu danych, aby pobrać listę kontaktów, a niektórzy użytkownicy używają 3g.
Nie mogę edytować źródła biblioteki, ani nie mogę go zobaczyć, więc nie wiem, czy tworzy odpowiednie gniazda.
Co muszę zrobić, aby poprawnie obsłużyć obie sytuacje? Nie rozumiem nawet, dlaczego jest różnica.