Getting Reliable Reaction Timing Out of iOS
iOS doesn't make it easy to measure millisecond-precise reaction times. The system throttles background execution, the display refresh rate rounds your measurements to 60Hz or 120Hz ticks anyway, and touch events arrive on a completely different cadence than you'd expect. Most people building a Gameplay Reaction iOS app end up frustrated because the first results they get are wildly inconsistent — sometimes 5 milliseconds off, sometimes 40. Here's what actually works. The core issue is that UIScreen.main.refreshRate tells you the display can do 120fps on Pro models, but the actual touch sampling rate and the Core Graphics render loop don't always line up neatly. Your UI might redraw at 60Hz while the touch subsystem samples at 120Hz, and the two streams desync depending on memory pressure. I wasted three days on this before realizing my baseline measurements were jittery because I was firing the stimulus change inside a CADisplayLink callback instead of using a hardware-level trigger.
Gameplay Reaction iOS Implementation
Start with a simple approach that most developers overlook: use UITapGestureRecognizer paired with CACurrentMediaTime() for your clock, not Date(). Date() has enough drift to add noise to your numbers. CACurrentMediaTime() ties directly to the runloop and stays synchronized with the display cycle, which cuts your measurement variance roughly in half compared to the standard approach. Here's the practical setup. Create a full-screen view. Make it white on load. Hide it behind a black overlay. When the black overlay gets tapped, record the timestamp and immediately swap to white. When the white view gets tapped, record that timestamp and subtract. That delta is the reaction time. The whole thing takes about twenty lines of Swift. The key detail everyone misses is the initial tap. You need a calibration period where the user taps once to acknowledge the test is starting, then waits for the color change. If you skip this, the first reaction time in every session will be garbage because the user hasn't settled into the task yet. I saw a developer include the first trial as data once. His average came out to 230ms. After removing that first trial, the group average dropped to 195ms. That's a fifteen percent swing from one bad data point.
For distribution, run at least twenty trials per session with randomized intervals between stimuli. The interval between the black tap and the white flash should vary between 1500 and 3500 milliseconds. If it stays constant, users will predict the timing and your reaction times will look artificially fast. Randomization is non-negotiable if you want usable numbers. You can find existing implementations on GitHub by searching for reaction time test iOS. The most common free option is a project called ReactionTime-iOS by various indie developers. There's also the older Reaction Test app that still gets updated on the App Store, though its source isn't publicly available. For a clean open-source reference implementation, look for repos using CADisplayLink with CACurrentMediaTime and full-screen UIView-based stimulus delivery. There's a specific edge case that took me a while to track down. On iPhones with the Dynamic Island and Face ID, if your app uses the full screen and the device is locked mid-test, the system briefly blanks the display for authentication. That blanking interval registers as a massive outlier in your data — sometimes 2000ms or more. The workaround is straightforward: add a UIApplication.willResignNotification observer that pauses the test and resets the state whenever the app goes to the background. Without this, your dataset gets corrupted by background transitions every single session.
Get the Full Details

Another practical limitation worth noting: iPad reaction times tend to be slower than iPhone reaction times in published studies, and part of that is just screen size and thumb reach. If your app targets both form factors, factor that in or separate the data. Same thing with older devices — the A12 chip handles the color swap faster than an A10, and the visible latency difference shows up in your numbers even though the processing overhead is negligible. The display driver itself introduces about 16 milliseconds of variance on older hardware at 60Hz that simply doesn't exist on newer ProMotion displays at 120Hz. If you need sub-millisecond precision, this approach won't give it to you. iOS touch event latency sits around 10 to 20 milliseconds under ideal conditions, and your reaction time measurements will always include that baseline noise. For gaming analytics or sports science work where you need tighter bounds, you're better off using an external response device connected through Bluetooth or a dedicated hardware box. The Gameplay Reaction iOS approach is fine for general purposes, casual testing, and research that doesn't require laboratory-grade accuracy. It's not fine if you're trying to distinguish between a 180ms and a 190ms reaction. The code itself is trivial. The hard part is understanding what your numbers actually represent and designing the trial structure so they're interpretable. Build in practice trials, exclude the fastest and slowest five percent as outliers, report median reaction time rather than mean, and document your device model and iOS version alongside the results. Those last two steps are what separate a useful dataset from noise.