Skip to content

Commit f4e64d2

Browse files
Merge pull request #4 from plangrid/bgonzales/continue_scanning
Continue or stop scanning when an object other than a barcode is detected
2 parents d7bbea0 + 1855362 commit f4e64d2

2 files changed

Lines changed: 27 additions & 11 deletions

File tree

BarcodeScanner.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Pod::Spec.new do |s|
22
s.name = "BarcodeScanner"
33
s.summary = "Simple and beautiful barcode scanner."
4-
s.version = "5.0.4"
4+
s.version = "5.0.5"
55
s.homepage = "https://github.com/hyperoslo/BarcodeScanner"
66
s.license = 'MIT'
77
s.author = { "Hyper Interaktiv AS" => "ios@hyper.no" }

Sources/Controllers/BarcodeScannerViewController.swift

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,25 @@ public protocol BarcodeScannerCodeDelegate: class {
1414

1515
/// Delegate to report errors.
1616
public 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.
2121
public 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

Comments
 (0)