react-native-nfc-manager 4.0.0-beta.1 → 4.0.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/README.md +146 -49
  2. package/android/src/main/java/community/revteltech/nfc/MifareClassicHandler.java +419 -0
  3. package/android/src/main/java/community/revteltech/nfc/MifareUltralightHandler.java +84 -0
  4. package/android/src/main/java/community/revteltech/nfc/NdefHandler.java +397 -0
  5. package/android/src/main/java/community/revteltech/nfc/NfcAdapterStateChangedReceiver.java +48 -0
  6. package/android/src/main/java/community/revteltech/nfc/NfcErrorCodes.java +16 -0
  7. package/android/src/main/java/community/revteltech/nfc/NfcManager.java +348 -1087
  8. package/android/src/main/java/community/revteltech/nfc/NfcManagerIOSStubBase.java +130 -0
  9. package/android/src/main/java/community/revteltech/nfc/NfcTechIoRouter.java +258 -0
  10. package/android/src/main/java/community/revteltech/nfc/TagTechnologyRequest.java +19 -7
  11. package/android/src/main/java/community/revteltech/nfc/Util.java +275 -2
  12. package/app.plugin.js +8 -9
  13. package/dist/ndef-lib/constants.js +67 -0
  14. package/dist/ndef-lib/constants.js.map +1 -0
  15. package/dist/ndef-lib/index.js +79 -0
  16. package/dist/ndef-lib/index.js.map +1 -0
  17. package/dist/ndef-lib/ndef-text.js +29 -0
  18. package/dist/ndef-lib/ndef-text.js.map +1 -0
  19. package/dist/ndef-lib/ndef-uri.js +40 -0
  20. package/dist/ndef-lib/ndef-uri.js.map +1 -0
  21. package/dist/ndef-lib/ndef-wifi-simple.js +100 -0
  22. package/dist/ndef-lib/ndef-wifi-simple.js.map +1 -0
  23. package/dist/ndef-lib/ndef.js +152 -0
  24. package/dist/ndef-lib/ndef.js.map +1 -0
  25. package/dist/ndef-lib/stringifier.js +155 -0
  26. package/dist/ndef-lib/stringifier.js.map +1 -0
  27. package/dist/ndef-lib/util.js +134 -0
  28. package/dist/ndef-lib/util.js.map +1 -0
  29. package/dist/specs/NativeNfcManager.js +5 -0
  30. package/dist/specs/NativeNfcManager.js.map +1 -0
  31. package/dist/src/NativeNfcManager.js +55 -0
  32. package/dist/src/NativeNfcManager.js.map +1 -0
  33. package/dist/src/NfcError.js +220 -0
  34. package/dist/src/NfcError.js.map +1 -0
  35. package/dist/src/NfcManager.js +175 -0
  36. package/dist/src/NfcManager.js.map +1 -0
  37. package/dist/src/NfcManagerAndroid.js +112 -0
  38. package/dist/src/NfcManagerAndroid.js.map +1 -0
  39. package/dist/src/NfcManagerIOS.js +119 -0
  40. package/dist/src/NfcManagerIOS.js.map +1 -0
  41. package/dist/src/NfcTech/Iso15693HandlerIOS.js +99 -0
  42. package/dist/src/NfcTech/Iso15693HandlerIOS.js.map +1 -0
  43. package/dist/src/NfcTech/IsoDepHandler.js +29 -0
  44. package/dist/src/NfcTech/IsoDepHandler.js.map +1 -0
  45. package/dist/src/NfcTech/MifareClassicHandlerAndroid.js +68 -0
  46. package/dist/src/NfcTech/MifareClassicHandlerAndroid.js.map +1 -0
  47. package/dist/src/NfcTech/MifareUltralightHandlerAndroid.js +23 -0
  48. package/dist/src/NfcTech/MifareUltralightHandlerAndroid.js.map +1 -0
  49. package/dist/src/NfcTech/NdefFormatableHandlerAndroid.js +16 -0
  50. package/dist/src/NfcTech/NdefFormatableHandlerAndroid.js.map +1 -0
  51. package/dist/src/NfcTech/NdefHandler.js +54 -0
  52. package/dist/src/NfcTech/NdefHandler.js.map +1 -0
  53. package/dist/src/NfcTech/NfcAHandler.js +16 -0
  54. package/dist/src/NfcTech/NfcAHandler.js.map +1 -0
  55. package/dist/src/NfcTech/NfcVHandler.js +33 -0
  56. package/dist/src/NfcTech/NfcVHandler.js.map +1 -0
  57. package/dist/src/index.js +53 -0
  58. package/dist/src/index.js.map +1 -0
  59. package/index.d.ts +110 -46
  60. package/ios/NfcManager.h +2 -11
  61. package/ios/NfcManager.mm +264 -438
  62. package/ios/RNNfcBridgeUtil.h +28 -0
  63. package/ios/RNNfcBridgeUtil.mm +52 -0
  64. package/ios/RNNfcManager+Felica.swift +61 -0
  65. package/ios/RNNfcManager+Iso15693.swift +895 -0
  66. package/ios/RNNfcManager+IsoDep.swift +145 -0
  67. package/ios/RNNfcManager+Mifare.swift +61 -0
  68. package/ios/RNNfcManager+Ndef.swift +120 -0
  69. package/ios/RNNfcManager.h +251 -0
  70. package/ios/RNNfcManager.swift +648 -0
  71. package/ios/RNNfcSessionDelegateProxy.swift +104 -0
  72. package/ios/RNNfcSwiftUtil.swift +34 -0
  73. package/ndef-lib/{constants.js → constants.ts} +2 -0
  74. package/ndef-lib/{index.js → index.ts} +23 -12
  75. package/ndef-lib/{ndef-text.js → ndef-text.ts} +7 -2
  76. package/ndef-lib/{ndef-uri.js → ndef-uri.ts} +8 -3
  77. package/ndef-lib/{ndef-wifi-simple.js → ndef-wifi-simple.ts} +34 -11
  78. package/ndef-lib/{ndef.js → ndef.ts} +53 -25
  79. package/ndef-lib/{stringifier.js → stringifier.ts} +27 -10
  80. package/ndef-lib/{util.js → util.ts} +23 -9
  81. package/package.json +39 -21
  82. package/react-native-nfc-manager.podspec +3 -2
  83. package/specs/NativeNfcManager.ts +18 -4
  84. package/src/NativeNfcManager.ts +84 -0
  85. package/src/{NfcError.js → NfcError.ts} +6 -17
  86. package/src/{NfcManager.js → NfcManager.ts} +51 -34
  87. package/src/{NfcManagerAndroid.js → NfcManagerAndroid.ts} +27 -8
  88. package/src/{NfcManagerIOS.js → NfcManagerIOS.ts} +31 -10
  89. package/src/NfcTech/{Iso15693HandlerIOS.js → Iso15693HandlerIOS.ts} +64 -36
  90. package/src/NfcTech/{IsoDepHandler.js → IsoDepHandler.ts} +8 -5
  91. package/src/NfcTech/{MifareClassicHandlerAndroid.js → MifareClassicHandlerAndroid.ts} +33 -24
  92. package/src/NfcTech/{MifareUltralightHandlerAndroid.js → MifareUltralightHandlerAndroid.ts} +14 -5
  93. package/src/NfcTech/{NdefFormatableHandlerAndroid.js → NdefFormatableHandlerAndroid.ts} +9 -2
  94. package/src/NfcTech/{NdefHandler.js → NdefHandler.ts} +19 -6
  95. package/src/NfcTech/{NfcAHandler.js → NfcAHandler.ts} +6 -3
  96. package/src/NfcTech/{NfcVHandler.js → NfcVHandler.ts} +8 -5
  97. package/src/__mocks__/{NativeNfcManager.js → NativeNfcManager.ts} +4 -1
  98. package/src/{index.js → index.ts} +1 -1
  99. package/android/src/main/java/community/revteltech/nfc/JsonConvert.java +0 -141
  100. package/android/src/main/java/community/revteltech/nfc/MifareUtil.java +0 -84
  101. package/ios/NfcManager+Felica.mm +0 -43
  102. package/ios/NfcManager+Iso15693.mm +0 -600
  103. package/ios/NfcManager+IsoDep.mm +0 -83
  104. package/ios/NfcManager+Mifare.mm +0 -43
  105. package/ios/Util.mm +0 -55
  106. package/specs/NativeNfcManager.d.ts +0 -6
  107. package/specs/NativeNfcManager.js +0 -3
  108. package/specs/NativeNfcManager.js.map +0 -1
  109. package/src/NativeNfcManager.js +0 -37
@@ -0,0 +1,648 @@
1
+ import CoreNFC
2
+ import Foundation
3
+
4
+ @objc(RNNfcManager)
5
+ public class RNNfcManager: NSObject {
6
+ static var runtimeSession: NFCNDEFReaderSession?
7
+ static var runtimeTagSession: NFCTagReaderSession?
8
+ static var runtimeSessionDelegateProxy: NSObject?
9
+ static var runtimeTechRequestTypes: [String]?
10
+ static var runtimeTechRequestCallback: RNNfcResponseSenderBlock?
11
+ static var runtimeSessionInvalidationCallback: RNNfcResponseSenderBlock?
12
+
13
+ static func resetSessionsState() {
14
+ runtimeSession = nil
15
+ runtimeTagSession = nil
16
+ runtimeSessionDelegateProxy = nil
17
+ }
18
+
19
+ static func resetRequestState() {
20
+ runtimeTechRequestTypes = nil
21
+ runtimeTechRequestCallback = nil
22
+ }
23
+
24
+ static func beginSessionInvalidation(
25
+ callback: @escaping RNNfcResponseSenderBlock
26
+ ) -> Bool {
27
+ guard runtimeSessionInvalidationCallback == nil else {
28
+ callback(["Duplicated registration", NSNull()])
29
+ return false
30
+ }
31
+
32
+ runtimeSessionInvalidationCallback = callback
33
+ return true
34
+ }
35
+
36
+ static func takeSessionInvalidationCallback() -> RNNfcResponseSenderBlock? {
37
+ let callback = runtimeSessionInvalidationCallback
38
+ runtimeSessionInvalidationCallback = nil
39
+ return callback
40
+ }
41
+
42
+ static func isCurrentTagSession(_ session: NFCTagReaderSession) -> Bool {
43
+ return runtimeTagSession === session
44
+ }
45
+
46
+ static func isCurrentNdefSession(_ session: NFCNDEFReaderSession) -> Bool {
47
+ return runtimeSession === session
48
+ }
49
+
50
+ static func pendingTechnologyRequestTypes(for session: NFCTagReaderSession) -> [String]? {
51
+ guard isCurrentTagSession(session), runtimeTechRequestCallback != nil else {
52
+ return nil
53
+ }
54
+ return runtimeTechRequestTypes
55
+ }
56
+
57
+ static func takeTechnologyRequestCallback(
58
+ for session: NFCTagReaderSession
59
+ ) -> RNNfcResponseSenderBlock? {
60
+ guard isCurrentTagSession(session) else {
61
+ return nil
62
+ }
63
+
64
+ let callback = runtimeTechRequestCallback
65
+ runtimeTechRequestCallback = nil
66
+ return callback
67
+ }
68
+
69
+ @objc(isTagSessionSupported)
70
+ public static func isTagSessionSupported() -> Bool {
71
+ if #available(iOS 13.0, *) {
72
+ return true
73
+ }
74
+ return false
75
+ }
76
+
77
+ @objc(isIso15693Supported)
78
+ public static func isIso15693Supported() -> Bool {
79
+ if #available(iOS 14.0, *) {
80
+ return true
81
+ }
82
+ return false
83
+ }
84
+
85
+ static func forwardWithTagSessionSupport(
86
+ _ isSupported: Bool,
87
+ callback: @escaping RNNfcResponseSenderBlock,
88
+ operation: @escaping (NFCTagReaderSession) -> Void
89
+ ) {
90
+ forwardWithTagSessionSupport(
91
+ isSupported,
92
+ callback: callback,
93
+ noSessionMessage: "Not even registered",
94
+ operation: operation
95
+ )
96
+ }
97
+
98
+ static func forwardWithTagSessionSupport(
99
+ _ isSupported: Bool,
100
+ callback: @escaping RNNfcResponseSenderBlock,
101
+ noSessionMessage: String,
102
+ operation: @escaping (NFCTagReaderSession) -> Void
103
+ ) {
104
+ if !isSupported {
105
+ callback(["Not support in this device", NSNull()])
106
+ return
107
+ }
108
+
109
+ guard let tagSession = runtimeTagSession else {
110
+ callback([noSessionMessage, NSNull()])
111
+ return
112
+ }
113
+
114
+ guard tagSession.connectedTag != nil else {
115
+ callback(["Not connected", NSNull()])
116
+ return
117
+ }
118
+
119
+ operation(tagSession)
120
+ }
121
+ }
122
+
123
+ public extension RNNfcManager {
124
+ @objc(convertNdefMessage:)
125
+ static func convertNdefMessage(_ message: NFCNDEFMessage) -> NSArray {
126
+ return message.records.map { record in
127
+ [
128
+ "id": RNNfcSwiftUtil.numberArray(from: record.identifier),
129
+ "payload": RNNfcSwiftUtil.numberArray(from: record.payload),
130
+ "type": RNNfcSwiftUtil.numberArray(from: record.type),
131
+ "tnf": NSNumber(value: Int(record.typeNameFormat.rawValue)),
132
+ ]
133
+ } as NSArray
134
+ }
135
+
136
+ @objc(getTagFromTagSession:callback:)
137
+ static func getTag(
138
+ from tagSession: NFCTagReaderSession?,
139
+ callback: @escaping RNNfcResponseSenderBlock
140
+ ) {
141
+ guard let tagSession else {
142
+ callback(["No session available", NSNull()])
143
+ return
144
+ }
145
+
146
+ guard let connectedTag = tagSession.connectedTag else {
147
+ callback([NSNull(), [:]])
148
+ return
149
+ }
150
+
151
+ var tagInfo = rnTag(from: connectedTag)
152
+ guard let ndefTag = ndefTagHandle(from: connectedTag) else {
153
+ callback([NSNull(), tagInfo])
154
+ return
155
+ }
156
+
157
+ ndefTag.readNDEF { ndefMessage, _ in
158
+ if let ndefMessage {
159
+ tagInfo["ndefMessage"] = convertNdefMessage(ndefMessage)
160
+ }
161
+ callback([NSNull(), tagInfo])
162
+ }
163
+ }
164
+
165
+ @objc(getTagWithCallback:)
166
+ static func getTag(
167
+ callback: @escaping RNNfcResponseSenderBlock
168
+ ) {
169
+ if #available(iOS 13.0, *) {
170
+ getTag(from: runtimeTagSession, callback: callback)
171
+ return
172
+ }
173
+
174
+ callback(["Not support in this device", NSNull()])
175
+ }
176
+
177
+ private static func rnTechName(for tag: NFCTag) -> String {
178
+ switch tag {
179
+ case .miFare:
180
+ return "mifare"
181
+ case .feliCa:
182
+ return "felica"
183
+ case .iso15693:
184
+ return "iso15693"
185
+ case .iso7816:
186
+ return "IsoDep"
187
+ @unknown default:
188
+ return "unknown"
189
+ }
190
+ }
191
+
192
+ private static func rnTag(from tag: NFCTag) -> [String: Any] {
193
+ var tagInfo: [String: Any] = ["tech": rnTechName(for: tag)]
194
+
195
+ switch tag {
196
+ case .miFare(let mifareTag):
197
+ tagInfo["id"] = RNNfcSwiftUtil.hexString(from: mifareTag.identifier)
198
+ case .iso7816(let iso7816Tag):
199
+ tagInfo["id"] = RNNfcSwiftUtil.hexString(from: iso7816Tag.identifier)
200
+ tagInfo["initialSelectedAID"] = iso7816Tag.initialSelectedAID
201
+ if let historicalBytes = iso7816Tag.historicalBytes {
202
+ tagInfo["historicalBytes"] = RNNfcSwiftUtil.numberArray(from: historicalBytes)
203
+ }
204
+ if let applicationData = iso7816Tag.applicationData {
205
+ tagInfo["applicationData"] = RNNfcSwiftUtil.numberArray(from: applicationData)
206
+ }
207
+ case .iso15693(let iso15693Tag):
208
+ tagInfo["id"] = RNNfcSwiftUtil.hexString(from: iso15693Tag.identifier)
209
+ tagInfo["icManufacturerCode"] = NSNumber(value: Int(iso15693Tag.icManufacturerCode))
210
+ tagInfo["icSerialNumber"] = RNNfcSwiftUtil.numberArray(from: iso15693Tag.icSerialNumber)
211
+ case .feliCa(let felicaTag):
212
+ tagInfo["idm"] = RNNfcSwiftUtil.hexString(from: felicaTag.currentIDm)
213
+ tagInfo["systemCode"] = RNNfcSwiftUtil.hexString(from: felicaTag.currentSystemCode)
214
+ @unknown default:
215
+ break
216
+ }
217
+
218
+ return tagInfo
219
+ }
220
+
221
+ private static func ndefTagHandle(from tag: NFCTag) -> NFCNDEFTag? {
222
+ switch tag {
223
+ case .miFare(let mifareTag):
224
+ return mifareTag
225
+ case .iso7816(let iso7816Tag):
226
+ return iso7816Tag
227
+ case .feliCa(let felicaTag):
228
+ return felicaTag
229
+ case .iso15693(let iso15693Tag):
230
+ return iso15693Tag
231
+ @unknown default:
232
+ return nil
233
+ }
234
+ }
235
+ }
236
+
237
+ public extension RNNfcManager {
238
+ @objc(resetRuntimeState)
239
+ static func resetRuntimeState() {
240
+ resetSessionsState()
241
+ resetRequestState()
242
+ runtimeSessionInvalidationCallback = nil
243
+ }
244
+
245
+ @objc(invalidateRuntimeState)
246
+ static func invalidateRuntimeState() {
247
+ var invalidatedSession = false
248
+
249
+ if #available(iOS 11.0, *), let ndefSession = runtimeSession {
250
+ ndefSession.invalidate()
251
+ invalidatedSession = true
252
+ }
253
+
254
+ if #available(iOS 13.0, *), let tagSession = runtimeTagSession {
255
+ tagSession.invalidate()
256
+ invalidatedSession = true
257
+ }
258
+
259
+ if !invalidatedSession {
260
+ resetRuntimeState()
261
+ }
262
+ }
263
+
264
+ @objc(isSupported:callback:)
265
+ static func isSupported(
266
+ _ tech: String,
267
+ callback: @escaping RNNfcResponseSenderBlock
268
+ ) {
269
+ if tech.isEmpty || tech == "Ndef" {
270
+ if #available(iOS 11.0, *) {
271
+ callback([NSNull(), NFCNDEFReaderSession.readingAvailable ? NSNumber(value: true) : NSNumber(value: false)])
272
+ return
273
+ }
274
+ } else if tech == "mifare" || tech == "felica" || tech == "iso15693" || tech == "IsoDep" {
275
+ if #available(iOS 13.0, *) {
276
+ callback([NSNull(), NFCTagReaderSession.readingAvailable ? NSNumber(value: true) : NSNumber(value: false)])
277
+ return
278
+ }
279
+ }
280
+
281
+ callback([NSNull(), NSNumber(value: false)])
282
+ }
283
+
284
+ @objc(startWithCallback:)
285
+ static func start(
286
+ callback: @escaping RNNfcResponseSenderBlock
287
+ ) {
288
+ if #available(iOS 11.0, *) {
289
+ if NFCNDEFReaderSession.readingAvailable {
290
+ NSLog("NfcManager initialized")
291
+ callback([])
292
+ return
293
+ }
294
+ }
295
+
296
+ callback(["Not support in this device", NSNull()])
297
+ }
298
+
299
+ @objc(createSessionDelegateProxy)
300
+ static func createSessionDelegateProxy() -> NSObject {
301
+ return RNNfcSessionDelegateProxy()
302
+ }
303
+
304
+ @objc(ensureNoActiveSessionForCallback:)
305
+ static func ensureNoActiveSession(
306
+ for callback: @escaping RNNfcResponseSenderBlock
307
+ ) -> Bool {
308
+ if runtimeSession == nil && runtimeTagSession == nil {
309
+ return true
310
+ }
311
+
312
+ callback(["Duplicated registration", NSNull()])
313
+ return false
314
+ }
315
+
316
+ @objc(createAndBeginTagSessionWithTechs:options:callback:)
317
+ static func createAndBeginTagSession(
318
+ with techs: [String],
319
+ options: NSDictionary,
320
+ callback: @escaping RNNfcResponseSenderBlock
321
+ ) {
322
+ if #available(iOS 13.0, *) {
323
+ if !ensureNoActiveSession(for: callback) {
324
+ return
325
+ }
326
+
327
+ var pollFlags: NFCTagReaderSession.PollingOption = [.iso14443, .iso15693]
328
+ if techs.contains("felica") {
329
+ pollFlags.insert(.iso18092)
330
+ }
331
+
332
+ let delegate = RNNfcSessionDelegateProxy()
333
+ guard let tagSession = NFCTagReaderSession(pollingOption: pollFlags, delegate: delegate, queue: .main) else {
334
+ callback(["Failed to create NFC session", NSNull()])
335
+ return
336
+ }
337
+ if let alertMessage = options["alertMessage"] as? String {
338
+ tagSession.alertMessage = alertMessage
339
+ }
340
+
341
+ runtimeSessionDelegateProxy = delegate
342
+ runtimeTagSession = tagSession
343
+ runtimeTechRequestTypes = techs
344
+ runtimeTechRequestCallback = callback
345
+
346
+ tagSession.begin()
347
+ return
348
+ }
349
+
350
+ callback(["Not support in this device", NSNull()])
351
+ }
352
+
353
+ @objc(createAndBeginNdefSessionWithOptions:callback:)
354
+ static func createAndBeginNdefSession(
355
+ with options: NSDictionary,
356
+ callback: @escaping RNNfcResponseSenderBlock
357
+ ) {
358
+ if #available(iOS 11.0, *) {
359
+ if !ensureNoActiveSession(for: callback) {
360
+ return
361
+ }
362
+
363
+ let invalidateAfterFirstRead = options["invalidateAfterFirstRead"] as? Bool ?? false
364
+ let delegate = RNNfcSessionDelegateProxy()
365
+ let ndefSession = NFCNDEFReaderSession(delegate: delegate, queue: .main, invalidateAfterFirstRead: invalidateAfterFirstRead)
366
+
367
+ if let alertMessage = options["alertMessage"] as? String {
368
+ ndefSession.alertMessage = alertMessage
369
+ }
370
+
371
+ runtimeSessionDelegateProxy = delegate
372
+ runtimeSession = ndefSession
373
+
374
+ ndefSession.begin()
375
+ callback([])
376
+ return
377
+ }
378
+
379
+ callback(["Not support in this device", NSNull()])
380
+ }
381
+
382
+ @objc(requireTagSessionRegisteredWithCallback:noSessionMessage:)
383
+ static func requireTagSessionRegistered(
384
+ callback: @escaping RNNfcResponseSenderBlock,
385
+ noSessionMessage: String
386
+ ) -> NFCTagReaderSession? {
387
+ guard let tagSession = runtimeTagSession else {
388
+ callback([noSessionMessage, NSNull()])
389
+ return nil
390
+ }
391
+
392
+ return tagSession
393
+ }
394
+
395
+ @objc(requireNdefSessionRegisteredWithCallback:noSessionMessage:)
396
+ static func requireNdefSessionRegistered(
397
+ callback: @escaping RNNfcResponseSenderBlock,
398
+ noSessionMessage: String
399
+ ) -> NFCNDEFReaderSession? {
400
+ guard let ndefSession = runtimeSession else {
401
+ callback([noSessionMessage, NSNull()])
402
+ return nil
403
+ }
404
+
405
+ return ndefSession
406
+ }
407
+
408
+ @objc(invalidateActiveSessionWithCallback:)
409
+ static func invalidateActiveSession(
410
+ callback: @escaping RNNfcResponseSenderBlock
411
+ ) {
412
+ if let ndefSession = runtimeSession {
413
+ guard beginSessionInvalidation(callback: callback) else {
414
+ return
415
+ }
416
+ ndefSession.invalidate()
417
+ return
418
+ }
419
+
420
+ if #available(iOS 13.0, *), let tagSession = runtimeTagSession {
421
+ guard beginSessionInvalidation(callback: callback) else {
422
+ return
423
+ }
424
+ tagSession.invalidate()
425
+ return
426
+ }
427
+
428
+ callback(["No active session", NSNull()])
429
+ }
430
+
431
+ @objc(invalidateSessionWithCallback:)
432
+ static func invalidateSession(
433
+ callback: @escaping RNNfcResponseSenderBlock
434
+ ) {
435
+ if #available(iOS 11.0, *) {
436
+ invalidateActiveSession(callback: callback)
437
+ return
438
+ }
439
+
440
+ callback(["Not support in this device", NSNull()])
441
+ }
442
+
443
+ @objc(invalidateActiveSessionWithErrorMessage:callback:)
444
+ static func invalidateActiveSession(
445
+ withErrorMessage errorMessage: String,
446
+ callback: @escaping RNNfcResponseSenderBlock
447
+ ) {
448
+ if let ndefSession = runtimeSession {
449
+ guard beginSessionInvalidation(callback: callback) else {
450
+ return
451
+ }
452
+ ndefSession.invalidate(errorMessage: errorMessage)
453
+ return
454
+ }
455
+
456
+ if #available(iOS 13.0, *), let tagSession = runtimeTagSession {
457
+ guard beginSessionInvalidation(callback: callback) else {
458
+ return
459
+ }
460
+ tagSession.invalidate(errorMessage: errorMessage)
461
+ return
462
+ }
463
+
464
+ callback(["No active session", NSNull()])
465
+ }
466
+
467
+ @objc(invalidateSessionWithErrorMessage:callback:)
468
+ static func invalidateSession(
469
+ withErrorMessage errorMessage: String,
470
+ callback: @escaping RNNfcResponseSenderBlock
471
+ ) {
472
+ if #available(iOS 11.0, *) {
473
+ invalidateActiveSession(withErrorMessage: errorMessage, callback: callback)
474
+ return
475
+ }
476
+
477
+ callback(["Not support in this device", NSNull()])
478
+ }
479
+
480
+ @objc(restartTechnologyRequestWithCallback:)
481
+ static func restartTechnologyRequest(
482
+ callback: @escaping RNNfcResponseSenderBlock
483
+ ) {
484
+ if #available(iOS 13.0, *) {
485
+ guard let tagSession = requireTagSessionRegistered(
486
+ callback: callback,
487
+ noSessionMessage: "No active registration"
488
+ ) else {
489
+ return
490
+ }
491
+
492
+ guard runtimeTechRequestCallback == nil else {
493
+ callback(["Duplicated registration", NSNull()])
494
+ return
495
+ }
496
+
497
+ NSLog("NfcManager restarting polling")
498
+ tagSession.restartPolling()
499
+ runtimeTechRequestCallback = callback
500
+ return
501
+ }
502
+
503
+ callback(["Not support in this device", NSNull()])
504
+ }
505
+
506
+ @objc(cancelTechnologyRequestWithCallback:)
507
+ static func cancelTechnologyRequest(
508
+ callback: @escaping RNNfcResponseSenderBlock
509
+ ) {
510
+ if #available(iOS 13.0, *) {
511
+ guard let tagSession = requireTagSessionRegistered(
512
+ callback: callback,
513
+ noSessionMessage: "Not even registered"
514
+ ) else {
515
+ return
516
+ }
517
+
518
+ guard beginSessionInvalidation(callback: callback) else {
519
+ return
520
+ }
521
+ tagSession.invalidate()
522
+ return
523
+ }
524
+
525
+ callback(["Not support in this device", NSNull()])
526
+ }
527
+
528
+ @objc(unregisterTagEventWithCallback:)
529
+ static func unregisterTagEvent(
530
+ callback: @escaping RNNfcResponseSenderBlock
531
+ ) {
532
+ if #available(iOS 11.0, *) {
533
+ guard let ndefSession = requireNdefSessionRegistered(
534
+ callback: callback,
535
+ noSessionMessage: "Not even registered"
536
+ ) else {
537
+ return
538
+ }
539
+
540
+ guard beginSessionInvalidation(callback: callback) else {
541
+ return
542
+ }
543
+ ndefSession.invalidate()
544
+ return
545
+ }
546
+
547
+ callback(["Not support in this device", NSNull()])
548
+ }
549
+
550
+ @objc(setAlertMessage:callback:)
551
+ static func setAlertMessage(
552
+ _ alertMessage: String,
553
+ callback: @escaping RNNfcResponseSenderBlock
554
+ ) {
555
+ if #available(iOS 11.0, *) {
556
+ if let ndefSession = runtimeSession {
557
+ ndefSession.alertMessage = alertMessage
558
+ callback([])
559
+ return
560
+ }
561
+
562
+ if #available(iOS 13.0, *), let tagSession = runtimeTagSession {
563
+ tagSession.alertMessage = alertMessage
564
+ callback([])
565
+ return
566
+ }
567
+
568
+ callback(["Not even registered", NSNull()])
569
+ return
570
+ }
571
+
572
+ callback(["Not support in this device", NSNull()])
573
+ }
574
+
575
+ @objc(isSessionAvailableWithCallback:)
576
+ static func isSessionAvailable(
577
+ callback: @escaping RNNfcResponseSenderBlock
578
+ ) {
579
+ if #available(iOS 11.0, *) {
580
+ callback([NSNull(), runtimeSession != nil ? NSNumber(value: true) : NSNumber(value: false)])
581
+ return
582
+ }
583
+
584
+ callback(["Not support in this device", NSNull()])
585
+ }
586
+
587
+ @objc(isTagSessionAvailableWithCallback:)
588
+ static func isTagSessionAvailable(
589
+ callback: @escaping RNNfcResponseSenderBlock
590
+ ) {
591
+ if #available(iOS 11.0, *) {
592
+ callback([NSNull(), runtimeTagSession != nil ? NSNumber(value: true) : NSNumber(value: false)])
593
+ return
594
+ }
595
+
596
+ callback(["Not support in this device", NSNull()])
597
+ }
598
+
599
+ @objc(getNdefMessageWithCallback:)
600
+ static func getNdefMessage(
601
+ callback: @escaping RNNfcResponseSenderBlock
602
+ ) {
603
+ if #available(iOS 13.0, *) {
604
+ getNdefMessage(from: runtimeTagSession, callback: callback)
605
+ return
606
+ }
607
+
608
+ callback(["Not support in this device", NSNull()])
609
+ }
610
+
611
+ @objc(writeNdefMessage:options:callback:)
612
+ static func writeNdefMessage(
613
+ _ bytes: [NSNumber],
614
+ options _: NSDictionary,
615
+ callback: @escaping RNNfcResponseSenderBlock
616
+ ) {
617
+ if #available(iOS 13.0, *) {
618
+ writeNdefMessage(bytes, to: runtimeTagSession, callback: callback)
619
+ return
620
+ }
621
+
622
+ callback(["Not support in this device", NSNull()])
623
+ }
624
+
625
+ @objc(makeReadOnlyWithCallback:)
626
+ static func makeReadOnly(
627
+ callback: @escaping RNNfcResponseSenderBlock
628
+ ) {
629
+ if #available(iOS 13.0, *) {
630
+ makeTagReadOnly(from: runtimeTagSession, callback: callback)
631
+ return
632
+ }
633
+
634
+ callback(["Not support in this device", NSNull()])
635
+ }
636
+
637
+ @objc(queryNdefStatusWithCallback:)
638
+ static func queryNdefStatus(
639
+ callback: @escaping RNNfcResponseSenderBlock
640
+ ) {
641
+ if #available(iOS 13.0, *) {
642
+ queryNdefStatus(from: runtimeTagSession, callback: callback)
643
+ return
644
+ }
645
+
646
+ callback(["Not support in this device", NSNull()])
647
+ }
648
+ }