UIApplication/Event recording
Contents
Interface
@interface UIApplication -(void)_addRecorder:(id)recorder; -(void)_removeRecorder:(id)recorder; -(void)_playbackEvents:(NSArray*)events atPlaybackRate:(float)playbackRate messageWhenDone:(id)target withSelector:(SEL)selector; @end
Event recorder
Event recording is supported by two private methods, -_addRecorder: and -_removeRecorder:. It uses the delegation pattern. The recorder object will be informed whenever an event arrives. There can be multiple event recorders.
A recorder object must conform to the informal protocol
@protocol UIApplicationEventRecording -(void)recordApplicationEvent:(NSDictionary*)event; @end
the argument event is the plist representation of the GSEvent, converted using the GSEventCreatePlistRepresentation function.
Example implementation
This code will record events into the file events.plist.
@interface Recorder : NSObject { NSMutableArray* eventList; } @end @implementation Recorder -(id)init { if ((self = [super init])) eventList = [[NSMutableArray alloc] init]; return self; } -(void)dealloc { [eventList release]; [super dealloc]; } -(void)save { [eventList writeToFile:@"events.plist" atomically:YES]; } -(void)recordApplicationEvent:(NSDictionary*)event { [eventList addObject:event]; } @end ... // Start recording. Recorder* recorder = [[Recorder alloc] init]; [[UIApplication sharedApplication] _addRecorder:recorder]; ... // Stop recording and save the files. [[UIApplication sharedApplication] _removeRecorder:recorder]; [recorder save]; [recorder release];
Event playback
Event playbacks allows you to send recorded events back the UI elements. It can be used as a macro system, or UI unit testing.
Playbacks are called through the -_playbackEvents:atPlaybackRate:messageWhenDone:withSelector: method.
- The events is an NSArray of NSDictionary's (which are GSEvents).
- The playback rate is a number governing the speed the events will be sent. The larger the number, the faster it will go. By default you should pass 1.
- The target is informed when the playback is done. The selector should have the signature
-(void)done:(NSDictionary*)infowhere the content of info is:
- UIApplicationEventRecordingDeliveryTimeUserInfoKey: An NSArray which contains the time where the corresponding event happened.
Example implementation
Assume the events are recorded to event.plist:
NSArray* eventList = [NSArray arrayWithContentsOfFile:@"events.plist"]; [[UIApplication sharedApplication] _playbackEvents:eventList atPlaybackRate:1.0f messageWhenDone:nil withSelector:NULL];