Skip to content

Commit 2dfeeed

Browse files
committed
Add logs
1 parent 67c52a3 commit 2dfeeed

File tree

2 files changed

+185
-4
lines changed

2 files changed

+185
-4
lines changed

Sources/CodeScanner/CodeScanner.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@
99
import AVFoundation
1010
import SwiftUI
1111

12+
public enum CodeScannerLogLevel {
13+
case info
14+
case error
15+
}
16+
1217
public protocol CodeScannerLoggerProtocol {
1318
func log(
14-
level: String,
19+
level: CodeScannerLogLevel,
1520
message: String,
1621
file: String,
1722
function: String,

Sources/CodeScanner/ScannerViewController.swift

Lines changed: 179 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,13 @@ extension CodeScannerView {
179179

180180
override public func viewDidLoad() {
181181
super.viewDidLoad()
182+
codeScannerLogger?.log(
183+
level: .info,
184+
message: "ScannerViewController viewDidLoad started",
185+
file: #file,
186+
function: #function,
187+
line: #line
188+
)
182189
self.addOrientationDidChangeObserver()
183190
self.setBackgroundColor()
184191
self.handleCameraPermission()
@@ -217,12 +224,34 @@ extension CodeScannerView {
217224
}
218225

219226
private func setupSession() {
227+
codeScannerLogger?.log(
228+
level: .info,
229+
message: "Setting up capture session",
230+
file: #file,
231+
function: #function,
232+
line: #line
233+
)
234+
220235
guard let captureSession = captureSession else {
236+
codeScannerLogger?.log(
237+
level: .error,
238+
message: "Capture session is nil, cannot setup session",
239+
file: #file,
240+
function: #function,
241+
line: #line
242+
)
221243
return
222244
}
223-
245+
224246
if previewLayer == nil {
225247
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
248+
codeScannerLogger?.log(
249+
level: .info,
250+
message: "Created preview layer",
251+
file: #file,
252+
function: #function,
253+
line: #line
254+
)
226255
}
227256

228257
previewLayer.frame = view.layer.bounds
@@ -233,36 +262,111 @@ extension CodeScannerView {
233262
reset()
234263

235264
if (captureSession.isRunning == false) {
265+
codeScannerLogger?.log(
266+
level: .info,
267+
message: "Starting capture session",
268+
file: #file,
269+
function: #function,
270+
line: #line
271+
)
236272
DispatchQueue.global(qos: .userInteractive).async {
237273
self.captureSession?.startRunning()
274+
DispatchQueue.main.async {
275+
codeScannerLogger?.log(
276+
level: .info,
277+
message: "Capture session started running: \(self.captureSession?.isRunning ?? false)",
278+
file: #file,
279+
function: #function,
280+
line: #line
281+
)
282+
}
238283
}
284+
} else {
285+
codeScannerLogger?.log(
286+
level: .info,
287+
message: "Capture session already running",
288+
file: #file,
289+
function: #function,
290+
line: #line
291+
)
239292
}
240293
}
241294

242295
private func handleCameraPermission() {
243-
switch AVCaptureDevice.authorizationStatus(for: .video) {
296+
let authStatus = AVCaptureDevice.authorizationStatus(for: .video)
297+
codeScannerLogger?.log(
298+
level: .info,
299+
message: "Camera permission status: \(authStatus.rawValue)",
300+
file: #file,
301+
function: #function,
302+
line: #line
303+
)
304+
305+
switch authStatus {
244306
case .restricted:
307+
codeScannerLogger?.log(
308+
level: .error,
309+
message: "Camera access restricted",
310+
file: #file,
311+
function: #function,
312+
line: #line
313+
)
245314
break
246315
case .denied:
316+
codeScannerLogger?.log(
317+
level: .error,
318+
message: "Camera permission denied",
319+
file: #file,
320+
function: #function,
321+
line: #line
322+
)
247323
self.didFail(reason: .permissionDenied)
248324
case .notDetermined:
325+
codeScannerLogger?.log(
326+
level: .info,
327+
message: "Camera permission not determined, requesting access",
328+
file: #file,
329+
function: #function,
330+
line: #line
331+
)
249332
self.requestCameraAccess {
250333
self.setupCaptureDevice()
251334
DispatchQueue.main.async {
252335
self.setupSession()
253336
}
254337
}
255338
case .authorized:
339+
codeScannerLogger?.log(
340+
level: .info,
341+
message: "Camera permission authorized, setting up capture device",
342+
file: #file,
343+
function: #function,
344+
line: #line
345+
)
256346
self.setupCaptureDevice()
257347
self.setupSession()
258-
348+
259349
default:
350+
codeScannerLogger?.log(
351+
level: .error,
352+
message: "Unknown camera permission status: \(authStatus.rawValue)",
353+
file: #file,
354+
function: #function,
355+
line: #line
356+
)
260357
break
261358
}
262359
}
263360

264361
private func requestCameraAccess(completion: (() -> Void)?) {
265362
AVCaptureDevice.requestAccess(for: .video) { [weak self] status in
363+
codeScannerLogger?.log(
364+
level: status ? .info : .error,
365+
message: "Camera access request result: \(status)",
366+
file: #file,
367+
function: #function,
368+
line: #line
369+
)
266370
guard status else {
267371
self?.didFail(reason: .permissionDenied)
268372
return
@@ -285,24 +389,75 @@ extension CodeScannerView {
285389
}
286390

287391
private func setupCaptureDevice() {
392+
codeScannerLogger?.log(
393+
level: .info,
394+
message: "Setting up capture device",
395+
file: #file,
396+
function: #function,
397+
line: #line
398+
)
399+
288400
captureSession = AVCaptureSession()
289401

290402
guard let videoCaptureDevice = parentView.videoCaptureDevice ?? fallbackVideoCaptureDevice else {
403+
codeScannerLogger?.log(
404+
level: .error,
405+
message: "No video capture device available",
406+
file: #file,
407+
function: #function,
408+
line: #line
409+
)
291410
return
292411
}
293412

413+
codeScannerLogger?.log(
414+
level: .info,
415+
message: "Using video capture device: \(videoCaptureDevice.localizedName)",
416+
file: #file,
417+
function: #function,
418+
line: #line
419+
)
420+
294421
let videoInput: AVCaptureDeviceInput
295422

296423
do {
297424
videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
425+
codeScannerLogger?.log(
426+
level: .info,
427+
message: "Successfully created video input",
428+
file: #file,
429+
function: #function,
430+
line: #line
431+
)
298432
} catch {
433+
codeScannerLogger?.log(
434+
level: .error,
435+
message: "Failed to create video input: \(error.localizedDescription)",
436+
file: #file,
437+
function: #function,
438+
line: #line
439+
)
299440
didFail(reason: .initError(error))
300441
return
301442
}
302443

303444
if (captureSession!.canAddInput(videoInput)) {
304445
captureSession!.addInput(videoInput)
446+
codeScannerLogger?.log(
447+
level: .info,
448+
message: "Successfully added video input to capture session",
449+
file: #file,
450+
function: #function,
451+
line: #line
452+
)
305453
} else {
454+
codeScannerLogger?.log(
455+
level: .error,
456+
message: "Cannot add video input to capture session",
457+
file: #file,
458+
function: #function,
459+
line: #line
460+
)
306461
didFail(reason: .badInput)
307462
return
308463
}
@@ -313,7 +468,21 @@ extension CodeScannerView {
313468
captureSession?.addOutput(photoOutput)
314469
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
315470
metadataOutput.metadataObjectTypes = parentView.codeTypes
471+
codeScannerLogger?.log(
472+
level: .info,
473+
message: "Successfully added metadata output to capture session. Code types: \(parentView.codeTypes)",
474+
file: #file,
475+
function: #function,
476+
line: #line
477+
)
316478
} else {
479+
codeScannerLogger?.log(
480+
level: .error,
481+
message: "Cannot add metadata output to capture session",
482+
file: #file,
483+
function: #function,
484+
line: #line
485+
)
317486
didFail(reason: .badOutput)
318487
return
319488
}
@@ -508,6 +677,13 @@ extension CodeScannerView {
508677
}
509678

510679
func didFail(reason: ScanError) {
680+
codeScannerLogger?.log(
681+
level: .error,
682+
message: "Scanner failed with reason: \(reason)",
683+
file: #file,
684+
function: #function,
685+
line: #line
686+
)
511687
DispatchQueue.main.async {
512688
self.parentView.completion(.failure(reason))
513689
}

0 commit comments

Comments
 (0)