当接近传感器被覆盖时保持显示

我想拦截接近传感器而不closures显示器。

我知道我有两个Boolvariables的文档:

proximityMonitoringEnabled proximityState 

和这个代码

 [UIDevice currentDevice].proximityMonitoringEnabled = YES; 

当接近传感器检测到某些信息时,会closures显示屏,与拨打电话时将手机放在耳边的方式相同。

接近传感器被覆盖时,如何保持显示?

在阅读了关于这个话题的不同论坛之后,在接近传感器被覆盖的情况下,目前在公共api上不可能防止iPhone屏幕变黑。 你可以用传感器做的唯一事情就是告诉它什么时候通过通知中心,但是又不能控制它的自然行为(当它使屏幕变暗/变暗时)。

苹果公司的文档指出,“并非所有iPhone OS设备都有接近传感器”。要确定您的应用程序运行的设备是否支持接近度监测,请将proximityMonitoringEnabled属性设置为YES,然后检查其值:

 UIDevice *device = [UIDevice currentDevice]; [device setProximityMonitoringEnabled:YES]; if (device.proximityMonitoringEnabled == YES) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityChanged:) name:@"UIDeviceProximityStateDidChangeNotification" object:device]; } - (void) proximityChanged:(NSNotification *)notification { UIDevice *device = [notification object]; NSLog(@"In proximity: %i", device.proximityState); } 

资料来源: http : //www.whatsoniphone.com/blog/new-in-iphone-30-tutorial-series-part-4-proximity-detection/

将有助于检测传感器的当前状态。

允许屏幕变暗的公共API:

 [UIScreen mainScreen].wantsSoftwareDimming = YES; [UIScreen mainScreen].brightness = $your_brightness_value; 

在这里find: 在iOS 6中更改为wantSoftwareDimming?

虽然没有公开的API可以做到这一点,你可以挂钩到IOKitIOHIDEventSystem并听取屏幕调光通知:

 // 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); 

你的事件处理函数指针看起来像这样:

 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); } } 

调用_SBDimScreen可能甚至是不必要的,因为具有空函数指针可能会停止所有接近传感器事件。

从iPhoneDevWiki的AppleProxShim页面上的命令行工具示例修改的代码。

使用以下API启用/禁用接近传感器。

 [UIDevice currentDevice].proximityMonitoringEnabled = NO; // Disables the Proximity Sensor and won't turnoff the display when sensor covered [UIDevice currentDevice].proximityMonitoringEnabled = YES; // Enables the Proximity Sensor and will turnoff the display when sensor covered 

并非所有iOS设备都有接近传感器。 要确定接近度监测是否可用,请尝试启用它。 如果proximityMonitoringEnabled属性的值保持为NO,则接近监视不可用。

fo swift / iOS 10 / xcode 8.2

 UIDevice.current.isProximityMonitoringEnabled = true/false..