@@ -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