Question
Mon application nécessite une connexion Internet. Il semble que si je garde mon iPhone inactif pendant un moment, il ferme sa connexion 3G. Une fois réveillé (diapositive à déverrouiller) et exécuté, mon application ne peut plus se connecter à Internet. Je dois d'abord utiliser Youtube ou Safari, puis la connexion Internet est établie, puis je dois fermer Youtube / Safari, puis je peux utiliser mon application pour me connecter à mon service.
Pourriez-vous s'il vous plaît laissez-moi savoir comment puis-je activer la connexion 3G à partir de mon application (afin que je puisse utiliser mon application directement après qu'elle soit sortie de l'état de veille et que je n'ai pas besoin d'exécuter d'autres applications comme Youtube / Safari?
Merci.
La solution
Pour désactiver le minuteur d'inactivité, consultez le propriété idleTimerDisabled de la classe UIApplication.
À partir d'Apple:
La valeur par défaut de cette propriété est NON. Lorsque la plupart des applications n'ont pas touche comme entrée utilisateur pour un court période, le système met l'appareil dans un état de «sommeil» où l'écran dims. Ceci est fait dans le but de conserver le pouvoir. cependant, applications qui n'ont pas d'utilisateur entrée sauf pour le accéléromètre - les jeux, par exemple - peuvent, en définissant cette propriété sur YES, désactiver le "minuteur inactif" pour éviter veille du système.
Important: vous devez définir ceci propriété que si nécessaire et devrait assurez-vous de le réinitialiser à NO lorsque le besoin n'existe plus. Plus les applications devraient laisser le système éteindre l'écran au ralenti le temps est écoulé. Cela comprend l'audio applications. Avec une utilisation appropriée de Services de session audio, lecture et enregistrement continue sans interruption lorsque l'écran s'éteint. Le seul applications qui devraient désactiver le les minuteries inactives sont des applications de cartographie, jeux, ou des programmes similaires avec interaction utilisateur sporadique.
Autres conseils
Il existe évidemment une autre meilleure solution, mais vous pouvez charger une page vierge avec:
[NSString stringWithContentsOfUrl ... ]
La connexion sera établie si nécessaire.
Seul NSURLConnection
(et les API superposées par-dessus) réinitialise la connexion de données après le réveil. Pour réinitialiser la connexion de données, créez un NSURLConnection
factice en une adresse non locale et annulez-la immédiatement. alors l’API socket
fonctionnera comme prévu.
Il existe un post sur les forums de développement où un développeur Apple explique cela en détail (mais je ne le trouve pas pour le moment)
Êtes-vous sûr d’établir la connexion correctement? Mon application utilise la même fonction pour les sockets et il n’y a aucun problème pour rétablir la connexion après la mise en veille du périphérique. Utilisez l'API Reachability dans la structure SystemConfiguration pour être averti lorsque la couverture est disponible et par la suite, tentez votre connexion. Notez qu'une période de temps - de quelques secondes à quelques minutes - doit s'écouler après le réveil de l'appareil pour obtenir la connexion à Internet, soyez patient.
Il existe un exemple d’atteignabilité d’Apple, effectuez une recherche également dans stackoverflow pour obtenir l’atteignabilité, et vous trouverez davantage de conseils pour le mettre en œuvre.
En fait, vous rencontrez le même problème lorsque vous modifiez les paramètres réseau de votre téléphone entre les lancements de l’application. Par exemple, disons que vous utilisez la connexion WIFI lorsque vous lancez l'application. Ensuite, vous fermez l'application et désactivez le WIFI afin que l'appareil utilise le réseau de l'opérateur. Lorsque vous relancez l'application, le socket ne pourra pas se connecter à moins que vous ne fassiez l'affaire avec la fausse connexion NSURLConnection (ou que vous lanciez le navigateur avant de lancer l'application).
De plus, l'annulation de NSURLConnection juste après son initialisation (avec connectionWithRequest ou initWithRequest) ne fonctionnait pas pour moi. N'annulez pas la demande ou attendez un moment avant de l'annuler (par exemple, avec performSelector: withObject: afterDelay:).