È oramai prassi trovare su AppStore applicazioni che sfruttano il flash LED dell’iPhone 4 in poi per poter creare delle torce. Vediamo cosa c’è dietro a queste applicazioni andando ad analizzare un po’ com’è fatto il codice.

Andremo a creare un’applicazione che tramite uno switch (UISwitch) permette di accendere e spegnere il flash.

Apriamo Xcode, e creiamo un nuovo progetto del tipo Single-view application ed inseriamo il framework AVFoundation. (Ecco la guida per inserire i framework) ed iniziamo ad aggiungere nel file ViewController.xib un oggetto di tipo UISwitch.

Passiamo al file ViewController.h e digitiamo il seguente codice:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface ViewController : UIViewController{

AVCaptureSession *torchSession;

    IBOutlet UISwitch *switcher;
}

@property (nonatomic, retain) AVCaptureSession * torchSession;

- (IBAction) toggleTorch;

@end

Adesso dobbiamo passare ad implementare i metodi, quindi spostiamoci nel file ViewController.m e scriviamo il metodo, senza dimenticarci ti fare il syntetize dello switcher.

@synthesize torchSession;
.
.
.
- (IBAction) toggleTorch {
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    AVCaptureDeviceInput *flashInput = [AVCaptureDeviceInput deviceInputWithDevice:device error: nil];
    AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];

    AVCaptureSession *session = [[AVCaptureSession alloc] init];

    if ([device hasTorch] && [device hasFlash]){

        if (device.torchMode == AVCaptureTorchModeOff) {

            [session beginConfiguration];
            [device lockForConfiguration:nil];
            [device setTorchMode:AVCaptureTorchModeOn];
            [device setFlashMode:AVCaptureFlashModeOn];
            [device unlockForConfiguration];

            [session addInput:flashInput];
            [session addOutput:output];

            [device unlockForConfiguration];

            [output release];

            [session commitConfiguration];
        }
    }

    if ([switcher isOn]==YES) {
        [session startRunning];
        [self setTorchSession:session];
        [session release];
    }
    else {
        [torchSession stopRunning];
    }

}

Colleghiamo metodi e oggetti (per lo switch usiamo ValueChanged) con l’interfaccia ed avviamo l’applicazione.
Abbiamo concluso. Ricordiamoci che, ovviamente, dobbiamo provare l’applicazione sel dispositivo reale poiché il simulatore non supporta il Flash.