2016-04-16 31 views
6

Sto lavorando su un'applicazione iOS che richiede di mantenere una sessione di orologio tra due dispositivi all'accettazione di entrambi gli utenti del dispositivo?Come mantenere la sessione di clock tra due dispositivi diversi?

Ma non sono sicuro di come sia possibile ottenere questo risultato senza avere un difetto nei tempi di entrambi i dispositivi?

ho già guardare seguenti idee:

1) mantenere lo stato di entrambi i dispositivi con l'aiuto di Webservices o spingere notifica in modo che il timer su entrambi i dispositivi avrà inizio allo stesso tempo. Ma se la rete non funziona correttamente questo approccio si sta guastando e c'è un difetto nel timer su entrambi i dispositivi.

Inoltre, desidero anche sapere come impedire che l'orologio dell'applicazione rimanga invariato anche dopo aver modificato la data e l'ora del dispositivo.

Qualsiasi aiuto su questo sarebbe apprezzato.

Grazie in anticipo.

Edit:

Dopo l'implementazione di approccio Bzz, va bene, ma una cosa che sto ancora affrontando problema è come calcolare e mantenere tempo impiegato nel webservice chiamando dal dispositivo A per inviare risultante timestamp di rete ad un altro dispositivo B.

Cosa si può fare per gestire questo caso?

risposta

2

Alcuni pensieri:

  • tenere traccia del vostro proprio tempo, essere indipendenti del clock di sistema. Usa l'orologio di sistema solo per convertire il tuo tempo in tempo di wall-wall quando devi mostrare qualcosa.

  • una unità di tempo (come un secondo) su un dispositivo dovrebbe essere uguale a un secondo sull'altro dispositivo, ad es. fidarsi che la durata di esso sia uguale su entrambi i dispositivi)

  • il ritardo di rete è un problema fondamentale. Considera che potrebbe esserci sempre un offset tra i due dispositivi. Forse si può trovare con un modo che rivela il ritardo, o si potrebbe trovare con un modo in cui il tempo assoluto non è rilevante

Ecco un'idea: quando Device1 invia una sincronizzazione-packet ogni 5 secondi , device2 dovrebbe avere questo pacchetto prima che faccia qualsiasi cosa al secondo 6. Quindi se il pacchetto non è ancora presente in device2 a 5 secondi, potrebbe aspettare che il pacchetto arrivi prima che continui a fare tutto ciò che deve essere fatto in seguito. Quando il pacchetto arriva a 3 secondi, device2 dovrebbe trattenerlo e elaborarlo al secondo 5. Fai questo in un modo bidirezionale, e entrambe le app sono sincronizzate in un intervallo di tempo di 5 secondi. A seconda delle tue esigenze e della rete, devi decidere cosa significa "attesa" e quanto spesso inviare un pacchetto di sincronizzazione.

+0

Hai ragione, ho lo stesso pensiero, ma la mia domanda è come posso ottenere questo approccio, migliore con meno no di cons? –

5

È possibile utilizzare ios-ntp per ottenere il tempo di rete e calcolare l'offset di tempo tra ora locale e di rete su entrambi i dispositivi. Quando si avvia il timer su un dispositivo, si sottrae l'offset dal timestamp locale e si invia il timestamp di rete risultante a un altro dispositivo. Su un altro dispositivo si aggiunge l'offset locale al timestamp della rete e si ottiene il timestamp di avvio del timer nell'ora locale.

È possibile utilizzare UIApplicationDelegate.applicationSignificantTimeChange(_ application: UIApplication) per monitorare le modifiche di orario sul dispositivo e ricalcolare l'offset aggiornando il tempo di rete.

+0

Come assicurarsi che l'ora locale non sia modificabile dall'utente? Nel mio caso, se l'utente cambia l'ora del dispositivo, anche l'orologio nell'applicazione viene influenzato? Cosa può essere un workaround anche per questo? Si dovrebbe mantenere un orologio separato per l'applicazione ottenendo GMT dal lato server e mantenere un timer al secondo per quello? –

1

È possibile ottenere dal servizio Web in cui si invia semplicemente il flag all'ora globale, in questo si imposta solo il flag per l'ora di inizio e di fine, quindi utilizzando questo metodo è possibile sincronizzare facilmente l'ora tra due dispositivi ro più.