@@ -267,13 +267,7 @@ private final actor NFCConnectionManager: NSObject {
267
267
if let message = message {
268
268
currentState. session? . alertMessage = message
269
269
}
270
- }
271
-
272
- switch result {
273
- case . success:
274
- await invalidate ( )
275
- case let . failure( error) :
276
- await invalidate ( error: error)
270
+ currentState. session? . invalidate ( )
277
271
}
278
272
}
279
273
@@ -282,7 +276,7 @@ private final actor NFCConnectionManager: NSObject {
282
276
trace ( message: " Manager.connected(session:tag:) - tag: \( String ( describing: tag. identifier) ) " )
283
277
284
278
guard let promise = currentState. connectionPromise else {
285
- await invalidate ( )
279
+ await cleanup ( session : session )
286
280
return
287
281
}
288
282
@@ -299,15 +293,21 @@ private final actor NFCConnectionManager: NSObject {
299
293
await promise. fulfill ( connection)
300
294
}
301
295
302
- private func invalidate( error: Error ? = nil ) async {
303
- currentState. session? . invalidate ( )
296
+ private func cleanup( session: NFCTagReaderSession , error: Error ? = nil ) async {
297
+ guard currentState. session === session else {
298
+ return
299
+ }
300
+
301
+ switch error {
302
+ case . none:
303
+ await currentState. didCloseConnection? . fulfill ( nil )
304
+ await currentState. connectionPromise? . cancel ( with: ConnectionError . cancelledByUser)
305
+ case let . some( error) :
306
+ await currentState. didCloseConnection? . fulfill ( nil )
307
+ await currentState. connectionPromise? . cancel ( with: error)
308
+ }
304
309
305
- // Workaround for the NFC session being active for an additional 4 seconds after
306
- // invalidate() has been called on the session.
307
- try ? await Task . sleep ( for: . seconds( 5 ) )
308
- await currentState. didCloseConnection? . fulfill ( error)
309
- await currentState. connectionPromise? . cancel ( with: error ?? ConnectionError . cancelled)
310
- currentState = . inactive
310
+ self . currentState = . inactive
311
311
}
312
312
}
313
313
@@ -325,16 +325,16 @@ extension NFCConnectionManager: NFCTagReaderSessionDelegate {
325
325
trace ( message: " NFCTagReaderSessionDelegate: Session invalidated – \( error. localizedDescription) " )
326
326
327
327
let nfcError = error as? NFCReaderError
328
+
329
+ let mappedError : Error ?
328
330
switch nfcError? . code {
329
331
case . some( . readerSessionInvalidationErrorUserCanceled) :
330
- return
332
+ mappedError = nil // user cancelled, no error
331
333
default :
332
- Task {
333
- if await currentState. session === session {
334
- await stop ( with: . failure( error) )
335
- }
336
- }
334
+ mappedError = error
337
335
}
336
+
337
+ Task { await cleanup ( session: session, error: mappedError) }
338
338
}
339
339
340
340
// @TraceScope
@@ -354,7 +354,7 @@ extension NFCConnectionManager: NFCTagReaderSessionDelegate {
354
354
if await session === currentState. session {
355
355
await connected ( session: session, tag: firstTag)
356
356
} else {
357
- await invalidate ( error: ConnectionError . cancelled)
357
+ await cleanup ( session : session , error: ConnectionError . cancelled)
358
358
}
359
359
}
360
360
}
0 commit comments