Skip to content

Commit 06f9e59

Browse files
authored
Merge pull request yannickl#84 from mjrehder/master
Fixed crash bug when a QR Code string could not be decoded and result…
2 parents a85a209 + 0e9e6bc commit 06f9e59

File tree

4 files changed

+62
-10
lines changed

4 files changed

+62
-10
lines changed

Sources/QRCodeReader.swift

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
7878
/// Block is executed when a metadata object is found.
7979
public var didFindCode: ((QRCodeReaderResult) -> Void)?
8080

81+
/// Block is executed when a found metadata object string could not be decoded.
82+
public var didFailDecoding: ((Void) -> Void)?
83+
8184
// MARK: - Creating the Code Reade
8285

8386
/**
@@ -332,20 +335,27 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
332335

333336
// MARK: - AVCaptureMetadataOutputObjects Delegate Methods
334337

335-
336338
public func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
337339
for current in metadataObjects {
338340
if let _readableCodeObject = current as? AVMetadataMachineReadableCodeObject {
339-
if metadataObjectTypes.contains(_readableCodeObject.type) {
340-
if stopScanningWhenCodeIsFound {
341-
stopScanning()
341+
if _readableCodeObject.stringValue != nil {
342+
if metadataObjectTypes.contains(_readableCodeObject.type) {
343+
if let sVal = _readableCodeObject.stringValue {
344+
if stopScanningWhenCodeIsFound {
345+
stopScanning()
346+
}
347+
348+
let scannedResult = QRCodeReaderResult(value: sVal, metadataType:_readableCodeObject.type)
349+
350+
DispatchQueue.main.async(execute: { [weak self] in
351+
self?.didFindCode?(scannedResult)
352+
})
353+
}
342354
}
343-
344-
let scannedResult = QRCodeReaderResult(value: _readableCodeObject.stringValue, metadataType:_readableCodeObject.type)
345-
346-
DispatchQueue.main.async(execute: { [weak self] in
347-
self?.didFindCode?(scannedResult)
348-
})
355+
}
356+
else {
357+
NSLog("Could not retrieve a valid string value for code type \(_readableCodeObject.type)")
358+
self.didFailDecoding?()
349359
}
350360
}
351361
}

Sources/QRCodeReaderView.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,30 @@ final class QRCodeReaderView: UIView, QRCodeReaderDisplayable {
110110
}
111111
}
112112

113+
// MARK: - Scan Result Indication
114+
115+
func startTimerForBorderReset() {
116+
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(1)) {
117+
if let ovl = self.overlayView as? ReaderOverlayView {
118+
ovl.overlayColor = .white
119+
}
120+
}
121+
}
122+
123+
func addRedBorder() {
124+
self.startTimerForBorderReset()
125+
if let ovl = self.overlayView as? ReaderOverlayView {
126+
ovl.overlayColor = .red
127+
}
128+
}
129+
130+
func addGreenBorder() {
131+
self.startTimerForBorderReset()
132+
if let ovl = self.overlayView as? ReaderOverlayView {
133+
ovl.overlayColor = .green
134+
}
135+
}
136+
113137
// MARK: - Convenience Methods
114138

115139
private func addComponents() {

Sources/QRCodeReaderViewController.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,22 @@ public class QRCodeReaderViewController: UIViewController {
7575

7676
codeReader.didFindCode = { [weak self] resultAsObject in
7777
if let weakSelf = self {
78+
if let qrv = weakSelf.readerView.displayable as? QRCodeReaderView {
79+
qrv.addGreenBorder()
80+
}
7881
weakSelf.completionBlock?(resultAsObject)
7982
weakSelf.delegate?.reader(weakSelf, didScanResult: resultAsObject)
8083
}
8184
}
8285

86+
codeReader.didFailDecoding = { [weak self] in
87+
if let weakSelf = self {
88+
if let qrv = weakSelf.readerView.displayable as? QRCodeReaderView {
89+
qrv.addRedBorder()
90+
}
91+
}
92+
}
93+
8394
setupUIComponentsWithCancelButtonTitle(builder.cancelButtonTitle)
8495

8596
NotificationCenter.default.addObserver(self, selector: #selector(orientationDidChange), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)

Sources/ReaderOverlayView.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ public final class ReaderOverlayView: UIView {
5656
layer.addSublayer(overlay)
5757
}
5858

59+
var overlayColor: UIColor = UIColor.white {
60+
didSet {
61+
self.overlay.strokeColor = overlayColor.cgColor
62+
self.setNeedsDisplay()
63+
}
64+
}
65+
5966
public override func draw(_ rect: CGRect) {
6067
var innerRect = rect.insetBy(dx: 50, dy: 50)
6168
let minSize = min(innerRect.width, innerRect.height)

0 commit comments

Comments
 (0)