2014-09-20 14 views
8

Meine Objective-C-App auf iOS 7 ruft Standortupdates im Hintergrund entweder vom startUpdatingsignificantLocationChanges- oder vom startUpdatingLocation-Delegaten ab (je nachdem, in welchem ​​Modus sich die App befindet, aber das ist nicht wichtig).Kann Firebase im Hintergrund auf iOS 7 senden und empfangen?

Im Delegaten sammle ich die Standortinformationen, schreibe sie in ein Wörterbuch und schreibe das Wörterbuch dann in eine 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]; 

Manchmal funktioniert es, manchmal nicht (dh im gleichen Lauf der App, manchmal die Lage zum Firebase geschrieben wird erfolgreich wie erwartet, und manchmal ist es nicht. Es gibt keine offensichtlichen Reim oder Grund zu, wenn es zu funktionieren scheint und wenn nicht).

Ich vermute, dass das Problem ist, dass der Firebase-Schreibvorgang im Hintergrundmodus nicht erfolgreich abgeschlossen wird, aber ich bin mir nicht sicher. Ich bin sehr neu in iOS und Objective C und Firebase.

Meine App ist als erforderlich Hintergrunddienste für Location Updates in seine Fähigkeiten markiert und Hintergrund holen (letztere meine zufälligen Versuch, dieses Problem zu beheben, die ehemalige ich weiß, dass ich brauche).

Mein Verdacht ist, dass ich dem Betriebssystem sagen muss, dass ich Zeit brauche, um den Schreibvorgang mit einer BackkgroundTask abzuschließen, und dann die Hintergrundaufgabe im Abschlussblock des Firebase schreiben zu beenden - hat jemand verifiziert, dass das beim Ausführen funktioniert im Hintergrundmodus?

Wenn ja, muss ich das nur im zweiten Schreibvorgang tun (vorausgesetzt, dass sie der Reihe nach abgeschlossen sind) oder in beiden (mit einem Zähler, den ich herunterzählen, wenn jeder Schreibvorgang abgeschlossen ist)?

Alle Hinweise am meisten geschätzt.

+1

Welche Apps im Hintergrund tun können, ist die Zuständigkeit des OS, nicht von Firebase. Es bleibt für eine beliebige Länge verbunden, und dann trennt das OS die Socket-Verbindung wie gewünscht. Das erklärt wohl die "Arbeit manchmal". – Kato

Antwort

0

Ja, Sie müssen Ihre Aufgabe im Hintergrund beenden. Er sagt so in der Apple Documentation:

Wenn Ihre App in der Mitte einer Aufgabe und braucht ein wenig mehr Zeit, um die Aufgabe abzuschließen, kann es die beginBackgroundTaskWithName nennen: expirationHandler: oder beginBackgroundTaskWithExpirationHandler: Methode des UIApplication Objekt um zusätzliche Ausführungszeit zu verlangen. Wenn Sie eine dieser Methoden aufrufen, wird die vorübergehende Aussetzung Ihrer App verzögert, sodass Sie ein wenig mehr Zeit haben, um die Arbeit zu beenden. Nach Abschluss dieser Arbeit muss Ihre App die endBackgroundTask: -Methode aufrufen, um das System darüber zu informieren, dass es fertig ist und ausgesetzt werden kann.

Geben Sie einfach Ihren Code in eine Hintergrundaufgabe, geben Sie ihm maximale Zeit (3 Minuten, denke ich).

Informieren Sie sich über Apple app lifecycle und alles für die Zukunft für Sie klären sollte.

Verwandte Themen