2009-05-22 11 views
2

Ich entwickle eine Netzwerkanwendung auf dem iPhone, die ständig eine Internetverbindung benötigt. Sobald ich mich jedoch beim Server anmelde und das iPhone für einige Zeit nicht aktiviere, wechselt das iPhone in den Energiesparmodus und trennt meine Netzwerkverbindung (es meldet mich ab).Verlust der Netzwerkverbindung auf dem iPhone

Wenn ich die gleiche Anwendung auf dem iPhone ausführen, während das iPhone über ein USB-Kabel mit dem PC verbunden ist, verliert es nie seine Netzwerkverbindung.

In der Datei info.plist habe ich diese beiden Flags hinzugefügt, scheint aber keine Wirkung zu haben.

UIRequiresPersistentWifi -> true SBUsesNetwork - integer -> 3

Bin ich etwas fehlt? Können Sie mir bitte mitteilen, wie ich sicherstellen kann, dass die Netzwerkverbindung während der gesamten Laufzeit der Anwendung bestehen bleibt?

Antwort

1

Was meinen Sie mit "melde mich hier"? Auf Netzwerkebene gibt es keine "eingeloggt" (*). Es gibt nur Pakete. Du schickst sie oder du nicht. Hat Ihr Serverprozess also eine Erwartung, dass Pakete oder Nachrichten periodisch ankommen? Wenn dies der Fall ist, müssen Sie sie senden, und das bedeutet, dass Sie nicht inaktiv gehen können (idleTimerDisabled = YES). Wenn Sie den Server steuern, ist es besser, weniger anspruchsvoll darüber zu sein, wie oft Sie damit sprechen. Dies alles geschieht jedoch weit oberhalb der Netzwerkschicht.

UIRequiresPersistentWifi bedeutet, dass das Wifi-Radio während der Ausführung der App eingeschaltet bleibt, auch wenn Sie nicht darüber sprechen. Dies ist wichtig für den Empfang von Daten. Andernfalls können Sie das Netzwerk verlassen und andere können nach etwa 30 Minuten nicht mit Ihnen sprechen. Es sollte in Info.plist eingestellt werden, aber das ist sicherlich in Ihrem App-Bundle. Wenn dies nicht der Fall wäre, würde Ihre App nicht starten, das ist also nicht das Problem.

(*) Das Zellennetzwerk hat das Konzept von angemeldet, aber das ist nicht, was Ihr Problem verursacht.

+0

Danke für Ihre Antwort. Mit "Abmelden" meine ich, dass die Anwendung ihre TCP-Verbindung mit dem Server verliert. – ebaccount

+0

Das meine ich mit "es gibt nur Pakete". Die Tatsache, dass ich meinen Computer ausschalte, unterbricht keine TCP-Verbindung. Und TCP hat keine Möglichkeit zu wissen, ob die andere Seite noch da ist. Die einzigen Dinge, die eine TCP-Sitzung beenden, sind FIN, RST und ein Fehlschlag, wenn die andere Seite mit mir spricht. "TCP keepalive" ist hier irreführend, weil es für ein paar Stunden nicht einmal ins Spiel kommt. Also, warum hast du deine TCP-Verbindung verloren? Sendet der Server Ihnen Daten, auf die Sie nicht antworten? –

+0

Ja, nach einer Weile erhalte ich keine Daten vom Server – ebaccount

4

in Ihrer Anwendung delegieren ("AppDelegate"), die Leerlaufzeitgeber in der +initialize Methode deaktivieren:

myApp.idleTimerDisabled = YES; 

Beachten Sie, dass dies Ihr iPhone vom Schlafen zu halten, während die App geöffnet ist. Dies kann zu Problemen mit der Akkulaufzeit führen.

Eine andere Option könnte sein, einen Hintergrund-Thread einzurichten, der zeitgesteuert eine kleine CFStream öffnet.

+0

Vielen Dank für Ihre Antwort. Ich denke, myApp.idleTimerDisabled = YES; wird jedoch keine machbare Lösung sein. Ich habe mich über UIRequiresPersistentWifi Option gefragt. Es sollte funktionieren. Muss ich die Datei info.plist irgendwo in meinem Projekt angeben? – ebaccount

+0

Ich wollte einen weiteren Punkt hinzufügen, ich sende periodische Keepalives zum Server. Aber ich benutze Socket() (nicht CFStream) – ebaccount

+0

Ich denke, Sie müssen möglicherweise die IdleTimedDisabled Flag auf JA gesetzt. UIRequiresPersistentWifi stellt lediglich sicher, dass das WiFi-Radio eingeschaltet ist, aber das hindert Ihr iPhone nicht daran, in den Ruhezustand zu wechseln. –