@@ -126,7 +126,7 @@ extension CodeScannerView {
126
126
127
127
#else
128
128
129
- var captureSession : AVCaptureSession !
129
+ var captureSession : AVCaptureSession ?
130
130
var previewLayer : AVCaptureVideoPreviewLayer !
131
131
let fallbackVideoCaptureDevice = AVCaptureDevice . default ( for: . video)
132
132
@@ -162,7 +162,7 @@ extension CodeScannerView {
162
162
163
163
@objc func updateOrientation( ) {
164
164
guard let orientation = view. window? . windowScene? . interfaceOrientation else { return }
165
- guard let connection = captureSession. connections. last, connection. isVideoOrientationSupported else { return }
165
+ guard let connection = captureSession? . connections. last, connection. isVideoOrientationSupported else { return }
166
166
connection. videoOrientation = AVCaptureVideoOrientation ( rawValue: orientation. rawValue) ?? . portrait
167
167
}
168
168
@@ -174,6 +174,14 @@ extension CodeScannerView {
174
174
override public func viewWillAppear( _ animated: Bool ) {
175
175
super. viewWillAppear ( animated)
176
176
177
+ setupSession ( )
178
+ }
179
+
180
+ private func setupSession( ) {
181
+ guard let captureSession = captureSession else {
182
+ return
183
+ }
184
+
177
185
if previewLayer == nil {
178
186
previewLayer = AVCaptureVideoPreviewLayer ( session: captureSession)
179
187
}
@@ -185,37 +193,41 @@ extension CodeScannerView {
185
193
186
194
delegate? . reset ( )
187
195
188
- if ( captureSession? . isRunning == false ) {
196
+ if ( captureSession. isRunning == false ) {
189
197
DispatchQueue . global ( qos: . userInteractive) . async {
190
- self . captureSession. startRunning ( )
198
+ self . captureSession? . startRunning ( )
191
199
}
192
200
}
193
201
}
194
-
202
+
195
203
private func handleCameraPermission( ) {
196
- switch AVCaptureDevice . authorizationStatus ( for: . video) {
197
- case . denied, . restricted:
198
- break
199
- case . notDetermined:
200
- self . requestCameraAccess {
201
- self . setupCaptureDevice ( )
204
+ switch AVCaptureDevice . authorizationStatus ( for: . video) {
205
+ case . denied, . restricted:
206
+ break
207
+ case . notDetermined:
208
+ self . requestCameraAccess {
209
+ self . setupCaptureDevice ( )
210
+ DispatchQueue . main. async {
211
+ self . setupSession ( )
212
+ }
213
+ }
214
+ case . authorized:
215
+ self . setupCaptureDevice ( )
216
+ self . setupSession ( )
217
+
218
+ default :
219
+ break
202
220
}
203
- case . authorized:
204
- self . setupCaptureDevice ( )
205
- return
206
- default :
207
- break
208
- }
209
221
}
210
222
211
- private func requestCameraAccess( completion: ( ( ) -> Void ) ? ) {
212
- AVCaptureDevice . requestAccess ( for: . video) { [ weak self] status in
213
- guard status else {
214
- self ? . delegate? . didFail ( reason: . permissionDenied)
215
- return
223
+ private func requestCameraAccess( completion: ( ( ) -> Void ) ? ) {
224
+ AVCaptureDevice . requestAccess ( for: . video) { [ weak self] status in
225
+ guard status else {
226
+ self ? . delegate? . didFail ( reason: . permissionDenied)
227
+ return
228
+ }
229
+ completion ? ( )
216
230
}
217
- completion ? ( )
218
- }
219
231
}
220
232
221
233
private func addOrientationDidChangeObserver( ) {
@@ -247,17 +259,17 @@ extension CodeScannerView {
247
259
return
248
260
}
249
261
250
- if ( captureSession. canAddInput ( videoInput) ) {
251
- captureSession. addInput ( videoInput)
262
+ if ( captureSession! . canAddInput ( videoInput) ) {
263
+ captureSession! . addInput ( videoInput)
252
264
} else {
253
265
delegate? . didFail ( reason: . badInput)
254
266
return
255
267
}
256
268
257
269
let metadataOutput = AVCaptureMetadataOutput ( )
258
270
259
- if ( captureSession. canAddOutput ( metadataOutput) ) {
260
- captureSession. addOutput ( metadataOutput)
271
+ if ( captureSession! . canAddOutput ( metadataOutput) ) {
272
+ captureSession! . addOutput ( metadataOutput)
261
273
262
274
metadataOutput. setMetadataObjectsDelegate ( delegate, queue: DispatchQueue . main)
263
275
metadataOutput. metadataObjectTypes = delegate? . parent. codeTypes
@@ -285,7 +297,7 @@ extension CodeScannerView {
285
297
286
298
if ( captureSession? . isRunning == true ) {
287
299
DispatchQueue . global ( qos: . userInteractive) . async {
288
- self . captureSession. stopRunning ( )
300
+ self . captureSession? . stopRunning ( )
289
301
}
290
302
}
291
303
0 commit comments