Have you ever needed to record a demo for an iOS app? There's always compromise involved. Either you use an overhead camera and deal with reflections and the user's hand blocking the screen, or you use a tool like Reflection (available for Mac and soon Windows). Either way you only get to see what's directly on the iOS device screen. Reflection-style recordings lack any indication of the user's touch and visual focus. To deal with this, I developed TOUCHkit. TOUCHkit provides a live touch feedback layer for demonstration use.
Demos play a key role in app development. From marketing to how-to support, they show how your application works by mirroring real-world interactions. With TOUCHkit, you can see both the screen that you're recording as well as the touches that create the interactions you're trying to present.
Here's a demonstration of TOUCHkit in action.
You can also download a copy of this brief sample video.
TOUCHkit in a Nutshell
TOUCHkit provides a way to compile your app for both normal and demonstration deployment — you don't change your core application to use it. It's designed to work as a single toggle, providing builds for each use. You add touch feedback by switching on the TOUCHkit feature, without otherwise affecting your normal application code.
To enable TOUCHkit, you set a single flag, compile and use that build for demonstration. For App Store deployment, you disable the flag. The application reverts to its normal behavior, and there are no App Store unsafe calls to worry about.
#define USES_TOUCHkit 1
TOUCHkit assumes that you're using a standard application with a single primary window. When compiled in, the kit replaces that window with a custom class that captures and duplicates all touches, allowing your application to show the user's touch bubble feedback.
There is one key code-level change you must make, but it's a very small one: in your application delegate class, you define a WINDOW_CLASS to use when building your iOS screen.
#if USES_TOUCHkit #import "TOUCHkitView.h" #import "TOUCHOverlayWindow.h" #define WINDOW_CLASS TOUCHOverlayWindow #else #define WINDOW_CLASS UIWindow #endif
Then instead of declaring a UIWindow, you use whichever class has been set by the toggle.
WINDOW_CLASS *window; window = [[WINDOW_CLASS alloc] initWithFrame:[[UIScreen mainScreen] bounds]];