2013-03-21 7 views
5

Es ist möglich, simulate touch events on iOS, und Sie können verschiedene systemweite Benachrichtigungen erhalten, wenn im Hintergrund mit CTTelephonyCenterAddObserver und CFNotificationCenterAddObserver, zB:iOS Touch Ereignisbenachrichtigungen (private API)

Ich habe noch einen Weg gefunden, Touch-Benachrichtigungen im Hintergrund zu bekommen. Gibt es ein "Touch Event", das mit CFNotificationCenterAddObserver verwendet werden kann, ein anderes Benachrichtigungscenter, das verwendet werden kann, oder ein völlig anderer Ansatz?

Ich wäre glücklich mit Low-Level-Touch-Informationen (z. B. x, y-Koordinaten und Touch-Typ), aber höhere Informationen (zB Taste gedrückt, Taste gedrückt usw.) wäre noch besser!

+0

Vielleicht könnte Ihnen helfen http://stackoverflow.com/questions/8303235/is-it-possible-to-capture-touch-events-in-the-background- on-a-jailbroken-ios-dev. Suchen Sie auch nach 'GSEvents' – Rog

Antwort

14

Sie können das IOHID-Zeug in IOKit verwenden, um die x, y-Koordinaten zu erhalten.

#include <IOHIDEventSystem.h> 

IOHIDEventSystemClient erstellen:

void *ioHIDEventSystem = IOHIDEventSystemClientCreate(kCFAllocatorDefault); 

Register Rückruf:

IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); 
IOHIDEventSystemClientRegisterEventCallback(ioHIDEventSystem, handle_event, NULL, NULL); 

austragen Rückruf:

IOHIDEventSystemClientUnregisterEventCallback(ioHIDEventSystem, handle_event, NULL, NULL); 
IOHIDEventSystemClientUnscheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); 

Rückruf:

void handle_event (void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) { 
    if (IOHIDEventGetType(event)==kIOHIDEventTypeDigitizer){ 
     IOHIDFloat x=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerX); 
     IOHIDFloat y=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerY); 
     int width = [[UIScreen mainScreen] bounds].size.width; 
     int height = [[UIScreen mainScreen] bounds].size.height; 
     NSLog(@"click : %f, %f", x*width, y*height) ; 
    } 
} 

Sie können dies auch überprüfen: IOHIDEventSystemCreate on iOS6 failed. Hoffe, das hilft.

EDIT: Bitte sehen Sie das Ergebnis aus dem Protokoll. Getestet auf iPhone 4 und 5.

void handle_event (void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) { 
    NSLog(@"handle_event : %d", IOHIDEventGetType(event)); 
if (IOHIDEventGetType(event)==kIOHIDEventTypeDigitizer){ 
    IOHIDFloat x=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerX); 
    IOHIDFloat y=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerY); 
    NSLog(@" x %f : y %f", x, y); 
//2013-03-28 10:02:52.169 MyIOKit[143:907] handle_event : 11 
//2013-03-28 10:02:52.182 MyIOKit[143:907] x 0.766754 : y 0.555023 
} 
} 
+0

Awesome! Ich bekomme die Ereignisse, aber meine x, y Werte sind enorm, zB: 1050201600.000000, 1052667392.000000. Irgendwelche Tipps? –

+0

Haben Sie x und y vor der Multiplikation überprüft? Ich bin jetzt nicht vor meinem Mac, aber soweit ich mich erinnere, habe ich x und y von% bekommen. Wenn Sie sich beispielsweise in der oberen rechten Ecke berühren, gilt x = 0,9 und y 0,1. – pt2121

+0

Ja, die große Zahl ist das x, y ohne zu multiplizieren. –