2014-09-20 15 views
8

Aplikacja My Objective C na iOS 7 pobiera aktualizacje lokalizacji w tle z listy startUpdatingsignificantLocationChanges lub delegata startUpdatingLocation (która zależy od trybu, w którym znajduje się aplikacja, ale nie sądzę, aby miało to znaczenie).Czy baza Firebase może wysyłać i odbierać w tle na iOS 7?

W delegacie zbieram informacje o lokalizacji, zapisuję je w słowniku, a następnie zapisuję słownik w bazie Firebase.

// this code is in the location update delegate routine 

// the code that gathers the various elements that go into the dictionary 
// are omitted for clarity, I don't think that they matter 

// we may be running in the background on iOS 7 when we are called! 

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
    [[NSNumber numberWithFloat:newLocation.coordinate.latitude] stringValue], @"Latitude", 
    [[NSNumber numberWithFloat:newLocation.coordinate.longitude] stringValue], @"Longitude", 
    [[NSNumber numberWithFloat:newLocation.horizontalAccuracy] stringValue], @"Accuracy", 
    formattedDateString, @"TimeNow", 
    [dateFormatter stringFromDate:newLocation.timestamp], @"TimeStamp", 
    [[NSNumber numberWithDouble:interval] stringValue], @"Date", 
    self.mode, @"Mode", 
    nil]; 

    // Write it once to CurrentLocation 
    [ref setValue:dictionary]; 

    // yes, I know this is clumsy 
    fbTmp = [NSMutableString stringWithString: fbRoot]; 
    [fbTmp appendString : @"/locationHistory"]; 
    ref = [[Firebase alloc] initWithUrl:fbTmp]; 

    // Now write it again to the locationHistory list 
    ref = [ref childByAutoId]; 
    [ref setValue:dictionary]; 

Czasem to działa, czasem nie (czyli w tym samym przebiegu aplikacji, czasami lokalizacja zostanie zapisana do Firebase powodzeniem zgodnie z oczekiwaniami, a czasami nie. Nie ma żadnego oczywiste rymowanie lub uzasadnienie, kiedy wydaje się działać, a kiedy nie).

Podejrzewam, że problem polega na tym, że zapis Firebase nie kończy się pomyślnie w tle, ale nie jestem pewien. Jestem bardzo nowym użytkownikiem iOS, Objective C i Firebase.

Moja aplikacja jest oznaczona w swoich Zdolnościach jako wymagająca usług w tle dla Aktualizacji lokalizacji i pobierania w tle (ta ostatnia moja przypadkowa próba rozwiązania tego problemu, pierwsza, której potrzebuję).

Podejrzewam, że muszę powiedzieć systemowi operacyjnemu, że potrzebuję czasu na ukończenie zapisu za pomocą zadania backkground, a następnie zakończyć zadanie w tle w bloku kończącym tworzenie bazy firebase - czy ktoś potwierdził, że to zadziała, gdy działa w trybie tła?

Jeśli tak, czy muszę to zrobić w drugim zapisie (zakładając, że są one zakończone w kolejności), lub w obu (z licznikiem, który odliczam po zakończeniu każdego zapisu)?

Wszelkie wskazówki najbardziej doceniane.

+1

Co aplikacje mogą robić w tle to przegląd systemu operacyjnego, a nie Firebase. Pozostaje podłączony przez dowolną długość, a następnie system operacyjny zeruje połączenie z gniazdem, jak mu się podoba. Prawdopodobnie odpowiada to za "czasy pracy". – Kato

Odpowiedz

0

Tak, musisz zakończyć swoje zadanie w tle. Mówi więc w Apple Documentation:

Jeśli aplikacja jest w środku zadania i potrzebuje trochę czasu, aby zakończyć to zadanie, może zadzwonić do beginBackgroundTaskWithName: expirationHandler: albo beginBackgroundTaskWithExpirationHandler: metody obiektu UIApplication poprosić o dodatkowy czas wykonania. Wywołanie jednej z tych metod powoduje opóźnienie zawieszenia aplikacji, co daje jej trochę więcej czasu na zakończenie pracy. Po zakończeniu tej pracy Twoja aplikacja musi wywołać metodę endBackgroundTask:, aby powiadomić system, że została zakończona i może zostać zawieszona.

Po prostu wpisz kod w zadanie tła, podaj maksymalny czas (3 minuty, jak myślę).

Przeczytać na Apple app lifecycle i wszystko powinno być dla Ciebie jasne, aby móc z niego skorzystać w przyszłości.

Powiązane problemy