@@ -179,6 +179,13 @@ extension CodeScannerView {
179
179
180
180
override public func viewDidLoad( ) {
181
181
super. viewDidLoad ( )
182
+ codeScannerLogger? . log (
183
+ level: . info,
184
+ message: " ScannerViewController viewDidLoad started " ,
185
+ file: #file,
186
+ function: #function,
187
+ line: #line
188
+ )
182
189
self . addOrientationDidChangeObserver ( )
183
190
self . setBackgroundColor ( )
184
191
self . handleCameraPermission ( )
@@ -217,12 +224,34 @@ extension CodeScannerView {
217
224
}
218
225
219
226
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
+
220
235
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
+ )
221
243
return
222
244
}
223
-
245
+
224
246
if previewLayer == nil {
225
247
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
+ )
226
255
}
227
256
228
257
previewLayer. frame = view. layer. bounds
@@ -233,36 +262,111 @@ extension CodeScannerView {
233
262
reset ( )
234
263
235
264
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
+ )
236
272
DispatchQueue . global ( qos: . userInteractive) . async {
237
273
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
+ }
238
283
}
284
+ } else {
285
+ codeScannerLogger? . log (
286
+ level: . info,
287
+ message: " Capture session already running " ,
288
+ file: #file,
289
+ function: #function,
290
+ line: #line
291
+ )
239
292
}
240
293
}
241
294
242
295
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 {
244
306
case . restricted:
307
+ codeScannerLogger? . log (
308
+ level: . error,
309
+ message: " Camera access restricted " ,
310
+ file: #file,
311
+ function: #function,
312
+ line: #line
313
+ )
245
314
break
246
315
case . denied:
316
+ codeScannerLogger? . log (
317
+ level: . error,
318
+ message: " Camera permission denied " ,
319
+ file: #file,
320
+ function: #function,
321
+ line: #line
322
+ )
247
323
self . didFail ( reason: . permissionDenied)
248
324
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
+ )
249
332
self . requestCameraAccess {
250
333
self . setupCaptureDevice ( )
251
334
DispatchQueue . main. async {
252
335
self . setupSession ( )
253
336
}
254
337
}
255
338
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
+ )
256
346
self . setupCaptureDevice ( )
257
347
self . setupSession ( )
258
-
348
+
259
349
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
+ )
260
357
break
261
358
}
262
359
}
263
360
264
361
private func requestCameraAccess( completion: ( ( ) -> Void ) ? ) {
265
362
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
+ )
266
370
guard status else {
267
371
self ? . didFail ( reason: . permissionDenied)
268
372
return
@@ -285,24 +389,75 @@ extension CodeScannerView {
285
389
}
286
390
287
391
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
+
288
400
captureSession = AVCaptureSession ( )
289
401
290
402
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
+ )
291
410
return
292
411
}
293
412
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
+
294
421
let videoInput : AVCaptureDeviceInput
295
422
296
423
do {
297
424
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
+ )
298
432
} 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
+ )
299
440
didFail ( reason: . initError( error) )
300
441
return
301
442
}
302
443
303
444
if ( captureSession!. canAddInput ( videoInput) ) {
304
445
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
+ )
305
453
} 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
+ )
306
461
didFail ( reason: . badInput)
307
462
return
308
463
}
@@ -313,7 +468,21 @@ extension CodeScannerView {
313
468
captureSession? . addOutput ( photoOutput)
314
469
metadataOutput. setMetadataObjectsDelegate ( self , queue: DispatchQueue . main)
315
470
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
+ )
316
478
} 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
+ )
317
486
didFail ( reason: . badOutput)
318
487
return
319
488
}
@@ -508,6 +677,13 @@ extension CodeScannerView {
508
677
}
509
678
510
679
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
+ )
511
687
DispatchQueue . main. async {
512
688
self . parentView. completion ( . failure( reason) )
513
689
}
0 commit comments