Anche se non v'è alcuna API pubblica per fare questo, è possibile collegare in s IOHIDEventSystem
IOKit
' e ascoltare per lo schermo che oscura le notifiche:
// Create and open an event system.
IOHIDEventSystemRef system = IOHIDEventSystemCreate(NULL);
// Set the PrimaryUsagePage and PrimaryUsage that the AppleProxShim service uses
int page = 65280;
int usage = 8;
// Create a dictionary to match the service with
CFStringRef keys[2];
CFNumberRef nums[2];
keys[0] = CFStringCreateWithCString(0, "PrimaryUsagePage", 0);
keys[1] = CFStringCreateWithCString(0, "PrimaryUsage", 0);
nums[0] = CFNumberCreate(0, kCFNumberSInt32Type, &page);
nums[1] = CFNumberCreate(0, kCFNumberSInt32Type, &usage);
CFDictionaryRef dict = CFDictionaryCreate(0, (const void**)keys, (const void**)nums, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
// Get the total of matching services with the above criteria
CFArrayRef srvs = (CFArrayRef)IOHIDEventSystemCopyMatchingServices(system, dict, 0, 0, 0, 0);
// Get the service
IOHIDServiceRef serv = (IOHIDServiceRef)CFArrayGetValueAtIndex(srvs, 0);
int interval = 1 ;
// Set an interval of 1 , to activate the sensor
IOHIDServiceSetProperty((IOHIDServiceRef)serv, CFSTR("ReportInterval"), CFNumberCreate(0, kCFNumberSInt32Type, &interval));
// add your event handler
IOHIDEventSystemOpen(system, handle_event, NULL, NULL, NULL);
int defaultInterval = 0;
IOHIDServiceSetProperty((IOHIDServiceRef)serv, CFSTR("ReportInterval"), CFNumberCreate(0, kCFNumberSInt32Type, &defaultInterval));
// close handles and release the IOHIDEventSystemRef
IOHIDEventSystemClose(system, NULL);
CFRelease(system);
vostro gestore di eventi puntatore a funzione sarà simile a questa:
void handle_event(void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) {
if (IOHIDEventGetType(event) == kIOHIDEventTypeProximity) { // Proximity Event Received
// not necessary, but if you want the value from the sensor, get it from IOHIDEventGetIntegerValue
int proximityValue = IOHIDEventGetIntegerValue(event, (IOHIDEventField)kIOHIDEventFieldProximityDetectionMask); // Get the value of the ProximityChanged Field (0 or 64)
// Call dimScreen with the boolean NO
int (*SBSSpringBoardServerPort)() = (int (*)())dlsym(RTLD_DEFAULT, "SBSSpringBoardServerPort");
int port = SBSSpringBoardServerPort();
void (*_SBDimScreen)(int _port,BOOL shouldDim) = (void (*)(int _port,BOOL shouldDim))dlsym(RTLD_DEFAULT, "SBDimScreen");
// This is where the logic to dim the screen based on the sensor value would go. In this case, I'm hardcoding NO instead of the value of proximityValue from above
// BOOL dim = proximityValue == 0 ? NO : YES;
_SBDimScreen(port, NO);
}
}
La chiamata _SBDimScreen
potrebbe non essere nemmeno necessaria, poiché un puntatore a funzione vuota potrebbe interrompere tutti gli eventi del sensore di prossimità.
Codice modificato dall'esempio dello strumento della riga di comando sulla pagina AppleProxShim su iPhoneDevWiki.
Ciao, grazie per la risposta.Ok, con il tuo codice posso sapere lo stato del sensore di prossimità, ma se lo stato è "SI", il display non è ancora visibile? –
aggiornato la mia risposta –