Domanda
La mia applicazione richiede una connessione a Internet. Sembra che se mantengo il mio iPhone inattivo per un po ', interrompe la sua connessione 3G. Una volta che lo riattivo (scorri per sbloccare) ed eseguo la mia applicazione, non è possibile connettersi a Internet. Devo prima eseguire Youtube o Safari, quindi ottenere la connessione Internet, quindi devo chiudere Youtube / Safari e quindi posso usare la mia applicazione per accedere al mio servizio.
La prego di farmi sapere come posso attivare la connessione 3G dalla mia applicazione (in modo da poter utilizzare la mia applicazione direttamente dopo che si è svegliata dallo stato inattivo e non devo eseguire altre applicazioni come Youtube / Safari?
Grazie.
Soluzione
Per disabilitare il timer di inattività, dai un'occhiata a proprietà idleTimerDisabled della classe UIApplication.
Da Apple:
Il valore predefinito di questa proprietà è NO. Quando la maggior parte delle applicazioni non ha tocca come input dell'utente in breve periodo, il sistema mette il dispositivo in un & # 8220; sleep & # 8221; indicare dove si trova lo schermo si attenua. Questo viene fatto ai fini di risparmio energetico. Però, applicazioni che non hanno utente input ad eccezione di accelerometro & # 8212; giochi, ad esempio & # 8212; can, impostando questa proprietà su SÌ, disabilita & # 8220; timer di inattività & # 8221; avvertire sospensione del sistema.
Importante: dovresti impostarlo proprietà solo se necessario e dovrebbe assicurarsi di reimpostarlo su NO quando il bisogno non esiste più. Maggior parte le applicazioni dovrebbero lasciare il sistema spegni lo schermo quando è inattivo il timer è scaduto. Questo include l'audio applicazioni. Con l'uso appropriato di Servizi di sessione audio, riproduzione e la registrazione procede ininterrottamente quando lo schermo si spegne. Il solo applicazioni che dovrebbero disabilitare il i timer inattivi stanno mappando le applicazioni, giochi o programmi simili con interazione sporadica dell'utente.
Altri suggerimenti
Esiste ovviamente un'altra soluzione migliore, ma è possibile caricare una pagina vuota con:
[NSString stringWithContentsOfUrl ... ]
La connessione verrà stabilita se necessario.
Solo NSURLConnection
(e tutte le API sovrapposte) reinizializza la connessione dati dopo il risveglio dalla sospensione. Per reinizializzare la connessione dati, creare un NSURLConnection
fittizio a un indirizzo non locale e cancellarlo immediatamente; quindi l'API socket
funzionerà come previsto.
C'è un post sui forum degli sviluppatori in cui uno sviluppatore di Apple lo spiega in dettaglio (ma al momento non riesco a trovarlo)
Sei sicuro di aver stabilito correttamente la connessione? La mia applicazione fa lo stesso usando i socket e non ha problemi a ristabilire la connessione dopo lo spegnimento del dispositivo. Utilizzare l'API di raggiungibilità nel framework SystemConfiguration per ricevere una notifica quando è disponibile la copertura e successivamente effettuare il tentativo di connessione. Si noti che un periodo di tempo - da alcuni secondi a un paio di minuti - deve trascorrere dopo che il dispositivo si è svegliato per ottenere la connettività Internet, quindi sii paziente.
C'è un esempio di raggiungibilità di Apple, cerca anche stackoverflow per la raggiungibilità e troverai altri suggerimenti su come implementarlo.
In realtà, si ottiene lo stesso problema quando si cambiano le impostazioni di rete sul telefono tra i lanci dell'applicazione. Ad esempio, supponiamo che tu usi la connessione WIFI all'avvio dell'app. Quindi chiudi l'app e spegni il WIFI in modo che il dispositivo utilizzi la rete del gestore telefonico. Quando riavvii l'app, il socket non sarà in grado di connettersi se non esegui il trucco con il fittizio NSURLConnection (o avvii il browser prima di connetterlo all'app).
Inoltre, annullare NSURLConnection subito dopo averlo inizializzato (con connectionWithRequest o initWithRequest) non ha funzionato per me. Non annullare la richiesta o attendere qualche tempo prima di annullarla (ad es. Con performSelector: withObject: afterDelay :).