Мне понадобилось время, чтобы выяснить, как это сделать, но я считаю, что этот код KVO будет работать на вас. Я не проверял этот код из тщательно, но я действительно получил это в основном работает в приложении:
static void * const torchLevelObservationContext = (void*)&torchLevelObservationContext;
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (context == torchLevelObservationContext) {
AVCaptureDevice *thisDevice = (AVCaptureDevice*)object;
NSLog(@"Current torch level: %f", thisDevice.torchLevel);
}
else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
-(id) init {
if (self = [super init]) {
AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
[videoDevice addObserver:self forKeyPath:@"torchLevel" options:NSKeyValueObservingOptionNew context:torchLevelObservationContext];
// whatever other initialization code ...
}
return self;
}
Caveat: главная причина, я пытался использовать этот код, чтобы определить текущее состояние горелки который включается через центр управления, поэтому я могу оставить его включенным при использовании AVCaptureDevice, и факел отключается по какой-либо причине после начала захвата. Но независимо от того, что я пробовал (torchActive, torchMode, torchLevel), я не смог определить состояние. Этот код работает только после того, как он взял управление AVCaptureDevice и использует его как AVCaptureSession. Если кто-то знает, как получить текущее состояние фонарика или фонарика, который включен из центра управления, это то, что я пытаюсь сделать.