2011-08-19 20 views
10

Un utilizzo comune nei giochi casuali consiste nel far avanzare artificialmente l'orologio di sistema per andare avanti nel gioco. In che modo tale avanzamento del clock utente può essere rilevato da un'app su un dispositivo iOS?Come posso rilevare localmente l'avanzamento del clock iPhone da un utente tra le esecuzioni dell'app?

  • non deve comportare comunicazione di rete
  • non deve assumersi applicazione è aperta (in esecuzione o sospeso), mentre l'orologio è advanced
  • Deve rilevare orologio avanzamento, rilevando orologio ripristino non è sufficiente

Idealmente , la soluzione sarebbe robusta contro i riavvii, ma questo non è un requisito.

+1

Non pensare che si possa fare senza la comunicazione di rete. Il ricevitore GPS 'potrebbe' fare questo, ma non penso che esponga qualcosa del tempo nell'API. – iandotkelly

risposta

1

Stavo pensando al fatto che la roba di CoreLocation potrebbe fare questo se quella parte dei dati GPS è stata esposta a voi. Comunque questo mi ha fatto pensare.

Il mio unico suggerimento è quello di mettere qualcosa in elaborazione in background, che deve essere per uno dei piccoli specifici motivi, per esempio per tracciare la posizione in background. Come un effetto collaterale di questo, prova a rilevare un cambio di orologio su un normale timer. Apple potrebbe respingerlo in quanto potrebbe essere chiaro che non sta utilizzando le informazioni sulla posizione ed è solo un motivo per sfruttare l'elaborazione in background.

Qualsiasi soluzione che non coinvolge la rete è quindi molto più difficile da implementare, mi chiedo perché non lo si sta utilizzando.

11
+1

mach_absolute_time si reimposta al riavvio del dispositivo. Va bene se un utente aggira il rilevamento dei cheat riavviandosi, ma non è ok se il riavvio non corretto li contrassegna come avanza l'orologio. –

+0

Inoltre, sulla base del bel post sul blog di Ben Dodson, http://bendodson.com/weblog/2013/01/29/ca-current-media-time/, questo non funzionerebbe se il dispositivo andasse a dormire per alcuni il tempo trascorso tra le riproduzioni dal momento che appare CACurrentMediaTime (e quindi mach_absolute_time dal momento che si basa su di esso?) contano solo il tempo del dispositivo attivo e non il tempo di attività. – stuckj

0

Mentre io non credo che sia possibile determinare in modo affidabile se un utente ha manualmente girate il loro orologio in avanti senza accesso alla rete, è possibile determinare in modo affidabile se sono tornati indietro nel tempo. E poiché sappiamo che questo è fisicamente impossibile, si può quindi ritenere che abbiano manipolato il loro orologio per imbrogliare.

Ciò che intendo con questo è, non è il solito processo per attivare un'azione in-app che richiede un periodo di attesa, uscire dall'app e girare l'orologio in avanti, rilanciare l'app per ottenere qualunque cosa fossero aspettando e quindi riportare l'orologio indietro al tempo reale?

Se questo è davvero il caso, quindi, basandosi sul suggerimento di @smgambel, è possibile memorizzare l'ora fisica e il fuso orario corrente ad ogni avvio e confrontare con l'ora e il fuso orario precedentemente memorizzati.Se l'ora è dietro lo il tempo precedentemente memorizzato e il fuso orario del dispositivo non è cambiato, è possibile presumere che l'utente abbia manipolato l'orologio.