Wie gehe ich mit Hintergrundaufgaben in iOS richtig um?

Ich habe eine VoIP-App, die im Hintergrund ausgeführt werden muss. Nach meinem Verständnis sind dies die Dinge, die ich tun muss:

Kennzeichne die App als voip.Setzen Sie das Flag 'Anwendung läuft nicht im Hintergrund' auf NO.Legen Sie einen Ablauf-Handler fest, einen Code, der die standardmäßige Ausführungszeit von 10 Minuten verlängert.Mehr?

Ich habe beide Flags in der Datei info.plist gesetzt und bekomme meine 10 Minuten. Ich habe versucht, was in vorgeschlagen wirddieser Beitrag. Hier ist mein Code:

//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);
    }
});
Die Situation:

Ich benutze eine Drittanbieter-Bibliothek, die die Kommunikation mit unserem Webservice verwaltet. Der Dienst ist ein CommuniGate Pro-Server. Ich erhalte Anwesenheitsaktualisierungen (online / offline) und Sofortnachrichten von Kontakten über die Bibliothek. Die Bibliothek ist die ximss-Bibliothek von CommuniGate, ein Protokoll, das xmpp ähnelt und für xml-basierte SIP-Anfragen sowie für Sofortnachrichten und Anwesenheitsinformationen verwendet wird. Wenn sich der Benutzer bei der App anmeldet, werden seine Kontakte (CmmuniGate-Freundesliste) angezeigt, und er kann auswählen, einen anzurufen. Nachdem eine ximss-Bestätigungsnachricht gesendet wurde und die Gegenstelle den Anruf angenommen hat, protokolliert sie die Startzeit des Anrufs und startet einen Anruf zur Gesichtszeit.

Das Problem:

Wenn die App durch Drücken der Home-Taste in den Hintergrund gelangt, wird im Protokoll die Meldung "Stayin Alive" angezeigt, und alle zehn Minuten wird die Hintergrundaufgabe neu gestartet.
Wenn die App durch Drücken des Ein- / Aus-Schalters in den Hintergrund gelangt, werden zehn Minuten lang die Meldungen angezeigt, dass die App am Leben bleibt. Danach wird die Hintergrundaufgabe neu gestartet und etwa alle 50 bis 100 Millisekunden neu gestartet.
Im Moment wäre das in Ordnung gewesen, auch wenn der Akku leer ist, da ich Zeit habe, an Updates zu arbeiten und unsere Benutzer die iPads nicht besitzen, wie wir es tun. Das Problem für mich ist jetzt, dass die ximss-Bibliothek ihre Verbindung verliert (sie ist sitzungsbasiert). Ich könnte die Sitzung in der Bibliothek neu starten, aber dies bedeutet ziemlich viel Datenübertragung, um die Kontaktliste abzurufen, und einige Benutzer verwenden 3g.
Ich kann die Quelle der Bibliothek nicht bearbeiten und kann sie auch nicht sehen, daher weiß ich nicht, ob die Sockets richtig erstellt werden.

Was muss ich tun, um mit beiden Situationen richtig umzugehen? Ich verstehe nicht einmal, warum es einen Unterschied gibt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage