Frage
Meine Anwendung benötigt Internet-Verbindung. Es scheint, als wenn ich mein iPhone im Leerlauf für eine Weile halten schaltet er seine 3G-Verbindung nach unten. Sobald ich es nach oben (zu Entriegeln) und betreibe meine Anwendung aufwachen, kann es nicht mit dem Internet verbinden. Ich habe erste Youtube oder Safari laufen, dann ist es die Internetverbindung bekommt, dann muss ich Youtube / Safari heruntergefahren und dann kann ich meine Anwendung verwenden, um meinen Dienst anzumelden.
Könnten Sie bitte lassen Sie mich wissen, wie kann ich 3G-Verbindung aus meiner Anwendung aktivieren (so dass ich meine Anwendung verwenden können direkt nachdem sie aus dem Ruhezustand aufwacht und ich habe keine andere Anwendungen wie Youtube / Safari laufen?
Danke.
Lösung
Um den Leerlaufzeitgeber zu deaktivieren, werfen Sie einen Blick auf die idleTimerDisabled Eigenschaft der UIApplication Klasse.
Von Apple:
Der Standardwert dieser Eigenschaft ist NEIN. Bei den meisten Anwendungen haben keine berührt als Benutzereingabe für eine kurze Zeit, legt das System das Gerät in einen „Schlaf“ Zustand, in dem der Bildschirm dimmt. Dies wird für die Zwecke getan von Einsparen von Energie. Jedoch, Anwendungen, die haben Benutzer nicht Eingang mit Ausnahme der Beschleunigungsmesser-Spiele, zum Beispiel-Dose, durch diese Eigenschaft auf JA einstellen, Deaktivieren Sie die „Leerlaufzeitgeber“ zur Abwendung System schlafen.
Wichtig: Sie sollten diese eingestellt Eigenschaft nur bei Bedarf und sollte sicherzustellen, dass es auf NO zurückgesetzt werden, wenn die müssen nicht mehr existiert. Die meisten Anwendungen sollten das System lassen drehen Sie den Bildschirm, wenn der Leerlauf ab Timer abgelaufen ist. Dazu gehören Audio Anwendungen. Bei entsprechender Verwendung von Audio Session Dienstleistungen, Wiedergabe und Aufzeichnung geht ohne Unterbrechung, wenn der Bildschirm wird ausgeschaltet. Das einzige Anwendungen, die die Deaktivierung sollte Leerlaufzeitgeber sind Mapping-Anwendungen, Spiele oder ähnliche Programme mit sporadische Interaktion mit dem Benutzer.
Andere Tipps
Es gibt offensichtlich eine andere bessere Lösung, aber man konnte eine leere Seite mit geladen werden:
[NSString stringWithContentsOfUrl ... ]
Die Verbindung hergestellt wird, wenn es notwendig ist.
Nur NSURLConnection
(und alle APIs, die auf ihn geschichtet sind) neu initialisiert die Datenverbindung nach Erwachen aus dem Schlaf. Neu initialisiert die Datenverbindung einen Dummy-NSURLConnection
auf eine nicht-lokale Adresse erstellen und kündigen Sie es sofort; dann wird die socket
API wie erwartet.
Es gibt einen Post auf den Entwicklerforen, in denen ein Apple-Entwickler dies im Detail erklärt (aber ich kann es zur Zeit nicht finden)
Sind Sie sicher, dass Sie die Verbindung korrekt sind establising? Meine Anwendung macht die gleiche Sockets und es hat keine Probleme, die Verbindung nach Gerät Schlaf wieder herzustellen. Verwenden Erreichbarkeits API in Systemconfiguration Rahmen informiert werden, wenn Abdeckung verfügbar ist und nach, dass Ihr Verbindungsversuch machen. Beachten Sie, dass eine Zeitperiode - von einigen Sekunden bis einige Minuten - verstreichen muss, nachdem das Gerät aufwacht Internet-Konnektivität zu gewinnen, so geduldig sein.
Es gibt Erreichbarkeits Probe von Apple, suchen auch für die Erreichbarkeit Stackoverflow und Sie werden mehr Hinweise finden, wie es zu implementieren.
Eigentlich Sie das gleiche Problem, wenn Sie die Netzwerkeinstellungen auf Ihrem Telefon zwischen Start der Anwendung ändern. Zum Beispiel lassen Sie uns sagen, dass Sie die WLAN-Verbindung verwenden, wenn Sie die App starten. Dann Sie die App schließen und das WIFI abschalten, so dass das Gerät des Carriers Netzwerk verwendet. Wenn Sie die App die Socket Relaunch in der Lage, keine Verbindung herstellen, wenn Sie den Trick mit dem Dummy NSURLConnection tun (oder Sie starten den Browser vor lanuching die app).
Auch die NSURLConnection Cancelling direkt nach dem Initialisieren (mit connectionWithRequest oder initWithRequest) nicht für mich arbeiten. Entweder sie nicht die Anforderung abbrechen oder einige Zeit warten, bevor es Cancelling (zum Beispiel mit perform: withobject: afterDelay:).