I’m working on an iOS app that uses an NSTimer for a countdown. This is prone to user tampering: if, for example, the user switches out of the app, closes the app manually, changes the device clock, and comes back in, the timer will have to be recreated. Another scenario: the user locks the device, it goes into low-power mode (which requires timers to be recreated), and the clock auto-sets before the game is opened again. If that happens, I won’t have an accurate way of determining how much time has passed since the app was closed, since the device clock has changed.
Tl;dr: countdown timers sometimes have to be recreated after a device clock change. How is this problem usually handled?
Any time you’re relying on the system clock for accurate timing you’re going to have troubles, even if the user isn’t deliberately tampering with the clock. Typically clock drift is corrected by slightly increasing or decreasing the length of a second to allow the clock to drift back into alignment over a period of minutes. If you need accurate timing, you can either use something like
mach_absolute_time()which is related to the system uptime rather than the system clock, or you can use Grand Central Dispatch. Thedispatch_after()function takes adispatch_time_twhich can either be expressed using wall time (e.g. system clock) or as an offset againstDISPATCH_TIME_NOW(which ignores wall clock).