iPhone4でサポートされてない露出モードのエラーが出たけど

iPhone 4でカメラ機能を使ったアプリケーションを作ってみているのだけど、タッチした所で露出を合わせようと思ったらこんなエラーが出た。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Setting exposureMode (1) is not supported by this device.  Use isExposureModeSupported:'

フォーカスする時みたいに exposurePointOfInterest で場所を指定して AVCaptureExposureModeAutoExpose をするのかな?と思ってこんなコードを書いてみたんだけど…。

if( [device isExposurePointOfInterestSupported] ) {
	NSError *error;
	if ([device lockForConfiguration:&error]) {
		device.exposurePointOfInterest = newPoint;
		device.exposureMode = AVCaptureExposureModeAutoExpose;
		[device unlockForConfiguration];
	}
}

で、ググったらこんなページが!

タッチした所で露出を合わせる方法

AVCaptureExposureModeContinuousAutoExposure で露出を合わせて、key-value observe を使って adjustingExposure が NO(合わせ終わった!)になるのを検出して AVCaptureExposureModeLocked にしろと。


結局こんな感じで露出合わせを始めて

if( [device isExposurePointOfInterestSupported] && [device isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]) {
	NSError *error;
	if ([device lockForConfiguration:&error]) {
		[device addObserver:self
				 forKeyPath:@"adjustingExposure"
					options:NSKeyValueObservingOptionNew
					context:nil];
		device.exposurePointOfInterest = newPoint;
		device.exposureMode = AVCaptureExposureModeContinuousAutoExposure;
		[device unlockForConfiguration];
	}
}	

露出合わせが終わったらこう受ける。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
	if ([keyPath isEqual:@"adjustingExposure"]) {
		if ([[change objectForKey:NSKeyValueChangeNewKey] boolValue] == NO) {
			NSError *error = nil;
			if ([device lockForConfiguration:&error]) {
				[device setExposureMode:AVCaptureExposureModeLocked];
				[device unlockForConfiguration];
			}
		}
	}
}

2011/12/03 Update:
値が変わったという知らせかどうかを確認する if 分の条件式を修正しました。
コチラでコードの不備を教えていただきました。ありがとうございます。


というわけで、このコード(要約)でとりあえず動いているけど iPhone 4 でサポートされてなかった AVCaptureExposureModeAutoExpose はどのモデルでサポートされるのかな?もしかしたら iPhone 4S だとサポートされてたりする???