@@ -14,14 +14,25 @@ public protocol BarcodeScannerCodeDelegate: class {
1414
1515/// Delegate to report errors.
1616public protocol BarcodeScannerErrorDelegate : class {
17- func scanner( _ controller: BarcodeScannerViewController , didReceiveError error: Error )
17+ func scanner( _ controller: BarcodeScannerViewController , didReceiveError error: BarcodeScannerError )
1818}
1919
2020/// Delegate to dismiss barcode scanner when the close button has been pressed.
2121public protocol BarcodeScannerDismissalDelegate : class {
2222 func scannerDidDismiss( _ controller: BarcodeScannerViewController )
2323}
2424
25+ // MARK: - Error types
26+
27+ public enum BarcodeScannerError : Error {
28+ /// Error when something besides a MachineReadableCodeObject was detected. (Check AVMetadataObject.ObjectType documentation)
29+ case nonMachineReadableCodeDetected
30+ /// Error describing an unexpected/general error
31+ case unexpected( Error )
32+ /// Error when a MachineReadableCodeObject was detected but its metadata is unsupported
33+ case unsupported
34+ }
35+
2536// MARK: - Controller
2637
2738/**
@@ -45,6 +56,9 @@ open class BarcodeScannerViewController: UIViewController {
4556 /// Delegate to dismiss barcode scanner when the close button has been pressed.
4657 public weak var dismissalDelegate : BarcodeScannerDismissalDelegate ?
4758
59+ /// Stop scanning when other object besides a MachineReadableCodeObject is detected
60+ public var stopCaptureWhenDetectingOtherObject = true
61+
4862 /// `AVCaptureMetadataOutput` metadata object types.
4963 public var metadata = AVMetadataObject . ObjectType. barcodeScannerMetadata {
5064 didSet {
@@ -236,7 +250,7 @@ extension BarcodeScannerViewController: CameraViewControllerDelegate {
236250 }
237251
238252 func cameraViewController( _ controller: CameraViewController , didReceiveError error: Error ) {
239- errorDelegate? . scanner ( self , didReceiveError: error)
253+ errorDelegate? . scanner ( self , didReceiveError: . unexpected ( error) )
240254 }
241255
242256 func cameraViewControllerDidTapSettingsButton( _ controller: CameraViewController ) {
@@ -251,15 +265,17 @@ extension BarcodeScannerViewController: CameraViewControllerDelegate {
251265 didOutput metadataObjects: [ AVMetadataObject ] ) {
252266 guard !locked && isVisible else { return }
253267 guard !metadataObjects. isEmpty else { return }
268+ guard let metadataObj = metadataObjects. first as? AVMetadataMachineReadableCodeObject else {
269+ if self . stopCaptureWhenDetectingOtherObject { controller. stopCapturing ( ) }
270+ errorDelegate? . scanner ( self , didReceiveError: . nonMachineReadableCodeDetected)
271+ return
272+ }
273+
254274 controller. stopCapturing ( )
255-
256- guard
257- let metadataObj = metadataObjects [ 0 ] as? AVMetadataMachineReadableCodeObject ,
258- var code = metadataObj. stringValue,
259- metadata. contains ( metadataObj. type)
260- else {
261- errorDelegate? . scanner ( self , didReceiveError: NSError ( ) )
262- return
275+
276+ guard var code = metadataObj. stringValue, metadata. contains ( metadataObj. type) else {
277+ errorDelegate? . scanner ( self , didReceiveError: . unsupported)
278+ return
263279 }
264280
265281 var rawType = metadataObj. type. rawValue
0 commit comments