react-native-nfc-manager 4.0.0-beta.0 → 4.0.0-beta.10

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 (106) 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 +373 -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 +126 -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} +13 -8
  81. package/package.json +44 -13
  82. package/react-native-nfc-manager.podspec +3 -2
  83. package/specs/NativeNfcManager.ts +95 -0
  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/src/NativeNfcManager.js +0 -37
@@ -0,0 +1,895 @@
1
+ import CoreNFC
2
+ import Foundation
3
+
4
+ public extension RNNfcManager {
5
+ @objc(iso15693GetSystemInfo:callback:)
6
+ static func iso15693GetSystemInfo(
7
+ _ flags: NSNumber,
8
+ callback: @escaping RNNfcResponseSenderBlock
9
+ ) {
10
+ forwardWithTagSessionSupport(
11
+ isIso15693Supported(),
12
+ callback: callback,
13
+ noSessionMessage: "Not connected",
14
+ operation: { tagSession in
15
+ iso15693GetSystemInfo(with: tagSession, flags: flags) { systemInfo, error in
16
+ if let error {
17
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
18
+ return
19
+ }
20
+
21
+ callback([NSNull(), systemInfo ?? [:]])
22
+ }
23
+ }
24
+ )
25
+ }
26
+
27
+ @objc(iso15693ReadSingleBlock:callback:)
28
+ static func iso15693ReadSingleBlock(
29
+ _ options: NSDictionary,
30
+ callback: @escaping RNNfcResponseSenderBlock
31
+ ) {
32
+ forwardWithTagSessionSupport(
33
+ isIso15693Supported(),
34
+ callback: callback,
35
+ noSessionMessage: "Not connected",
36
+ operation: { tagSession in
37
+ iso15693ReadSingleBlock(with: tagSession, options: options) { resp, error in
38
+ if let error {
39
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
40
+ return
41
+ }
42
+
43
+ callback([NSNull(), resp ?? []])
44
+ }
45
+ }
46
+ )
47
+ }
48
+
49
+ @objc(iso15693ReadMultipleBlocks:callback:)
50
+ static func iso15693ReadMultipleBlocks(
51
+ _ options: NSDictionary,
52
+ callback: @escaping RNNfcResponseSenderBlock
53
+ ) {
54
+ forwardWithTagSessionSupport(
55
+ isIso15693Supported(),
56
+ callback: callback,
57
+ noSessionMessage: "Not connected",
58
+ operation: { tagSession in
59
+ iso15693ReadMultipleBlocks(with: tagSession, options: options) { dataBlocks, error in
60
+ if let error {
61
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
62
+ return
63
+ }
64
+
65
+ callback([NSNull(), dataBlocks ?? []])
66
+ }
67
+ }
68
+ )
69
+ }
70
+
71
+ @objc(iso15693WriteSingleBlock:callback:)
72
+ static func iso15693WriteSingleBlock(
73
+ _ options: NSDictionary,
74
+ callback: @escaping RNNfcResponseSenderBlock
75
+ ) {
76
+ forwardWithTagSessionSupport(
77
+ isIso15693Supported(),
78
+ callback: callback,
79
+ noSessionMessage: "Not connected",
80
+ operation: { tagSession in
81
+ iso15693WriteSingleBlock(with: tagSession, options: options) { error in
82
+ if let error {
83
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
84
+ return
85
+ }
86
+
87
+ callback([])
88
+ }
89
+ }
90
+ )
91
+ }
92
+
93
+ @objc(iso15693LockBlock:callback:)
94
+ static func iso15693LockBlock(
95
+ _ options: NSDictionary,
96
+ callback: @escaping RNNfcResponseSenderBlock
97
+ ) {
98
+ forwardWithTagSessionSupport(
99
+ isIso15693Supported(),
100
+ callback: callback,
101
+ noSessionMessage: "Not connected",
102
+ operation: { tagSession in
103
+ iso15693LockBlock(with: tagSession, options: options) { error in
104
+ if let error {
105
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
106
+ return
107
+ }
108
+
109
+ callback([])
110
+ }
111
+ }
112
+ )
113
+ }
114
+
115
+ @objc(iso15693WriteAFI:callback:)
116
+ static func iso15693WriteAFI(
117
+ _ options: NSDictionary,
118
+ callback: @escaping RNNfcResponseSenderBlock
119
+ ) {
120
+ forwardWithTagSessionSupport(
121
+ isIso15693Supported(),
122
+ callback: callback,
123
+ noSessionMessage: "Not connected",
124
+ operation: { tagSession in
125
+ iso15693WriteAFI(with: tagSession, options: options) { error in
126
+ if let error {
127
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
128
+ return
129
+ }
130
+
131
+ callback([])
132
+ }
133
+ }
134
+ )
135
+ }
136
+
137
+ @objc(iso15693LockAFI:callback:)
138
+ static func iso15693LockAFI(
139
+ _ options: NSDictionary,
140
+ callback: @escaping RNNfcResponseSenderBlock
141
+ ) {
142
+ forwardWithTagSessionSupport(
143
+ isIso15693Supported(),
144
+ callback: callback,
145
+ noSessionMessage: "Not connected",
146
+ operation: { tagSession in
147
+ iso15693LockAFI(with: tagSession, options: options) { error in
148
+ if let error {
149
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
150
+ return
151
+ }
152
+
153
+ callback([])
154
+ }
155
+ }
156
+ )
157
+ }
158
+
159
+ @objc(iso15693WriteDSFID:callback:)
160
+ static func iso15693WriteDSFID(
161
+ _ options: NSDictionary,
162
+ callback: @escaping RNNfcResponseSenderBlock
163
+ ) {
164
+ forwardWithTagSessionSupport(
165
+ isIso15693Supported(),
166
+ callback: callback,
167
+ noSessionMessage: "Not connected",
168
+ operation: { tagSession in
169
+ iso15693WriteDSFID(with: tagSession, options: options) { error in
170
+ if let error {
171
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
172
+ return
173
+ }
174
+
175
+ callback([])
176
+ }
177
+ }
178
+ )
179
+ }
180
+
181
+ @objc(iso15693LockDSFID:callback:)
182
+ static func iso15693LockDSFID(
183
+ _ options: NSDictionary,
184
+ callback: @escaping RNNfcResponseSenderBlock
185
+ ) {
186
+ forwardWithTagSessionSupport(
187
+ isIso15693Supported(),
188
+ callback: callback,
189
+ noSessionMessage: "Not connected",
190
+ operation: { tagSession in
191
+ iso15693LockDSFID(with: tagSession, options: options) { error in
192
+ if let error {
193
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
194
+ return
195
+ }
196
+
197
+ callback([])
198
+ }
199
+ }
200
+ )
201
+ }
202
+
203
+ @objc(iso15693ResetToReady:callback:)
204
+ static func iso15693ResetToReady(
205
+ _ options: NSDictionary,
206
+ callback: @escaping RNNfcResponseSenderBlock
207
+ ) {
208
+ forwardWithTagSessionSupport(
209
+ isIso15693Supported(),
210
+ callback: callback,
211
+ noSessionMessage: "Not connected",
212
+ operation: { tagSession in
213
+ iso15693ResetToReady(with: tagSession, options: options) { error in
214
+ if let error {
215
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
216
+ return
217
+ }
218
+
219
+ callback([])
220
+ }
221
+ }
222
+ )
223
+ }
224
+
225
+ @objc(iso15693Select:callback:)
226
+ static func iso15693Select(
227
+ _ options: NSDictionary,
228
+ callback: @escaping RNNfcResponseSenderBlock
229
+ ) {
230
+ forwardWithTagSessionSupport(
231
+ isIso15693Supported(),
232
+ callback: callback,
233
+ noSessionMessage: "Not connected",
234
+ operation: { tagSession in
235
+ iso15693Select(with: tagSession, options: options) { error in
236
+ if let error {
237
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
238
+ return
239
+ }
240
+
241
+ callback([])
242
+ }
243
+ }
244
+ )
245
+ }
246
+
247
+ @objc(iso15693StayQuiet:)
248
+ static func iso15693StayQuiet(
249
+ _ callback: @escaping RNNfcResponseSenderBlock
250
+ ) {
251
+ forwardWithTagSessionSupport(
252
+ isIso15693Supported(),
253
+ callback: callback,
254
+ noSessionMessage: "Not connected",
255
+ operation: { tagSession in
256
+ iso15693StayQuiet(with: tagSession) { error in
257
+ if let error {
258
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
259
+ return
260
+ }
261
+
262
+ callback([])
263
+ }
264
+ }
265
+ )
266
+ }
267
+
268
+ @objc(iso15693CustomCommand:callback:)
269
+ static func iso15693CustomCommand(
270
+ _ options: NSDictionary,
271
+ callback: @escaping RNNfcResponseSenderBlock
272
+ ) {
273
+ forwardWithTagSessionSupport(
274
+ isIso15693Supported(),
275
+ callback: callback,
276
+ operation: { tagSession in
277
+ iso15693CustomCommand(with: tagSession, options: options) { resp, error in
278
+ if let error {
279
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
280
+ return
281
+ }
282
+
283
+ callback([NSNull(), resp ?? []])
284
+ }
285
+ }
286
+ )
287
+ }
288
+
289
+ @objc(iso15693SendRequest:callback:)
290
+ static func iso15693SendRequest(
291
+ _ options: NSDictionary,
292
+ callback: @escaping RNNfcResponseSenderBlock
293
+ ) {
294
+ forwardWithTagSessionSupport(
295
+ isIso15693Supported(),
296
+ callback: callback,
297
+ noSessionMessage: "Not connected",
298
+ operation: { tagSession in
299
+ iso15693SendRequest(with: tagSession, options: options) { responseFlag, resp, error in
300
+ if let error {
301
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
302
+ return
303
+ }
304
+
305
+ callback([NSNull(), [responseFlag ?? 0, resp ?? []]])
306
+ }
307
+ }
308
+ )
309
+ }
310
+
311
+ @objc(iso15693ExtendedReadSingleBlock:callback:)
312
+ static func iso15693ExtendedReadSingleBlock(
313
+ _ options: NSDictionary,
314
+ callback: @escaping RNNfcResponseSenderBlock
315
+ ) {
316
+ forwardWithTagSessionSupport(
317
+ isIso15693Supported(),
318
+ callback: callback,
319
+ noSessionMessage: "Not connected",
320
+ operation: { tagSession in
321
+ iso15693ExtendedReadSingleBlock(with: tagSession, options: options) { resp, error in
322
+ if let error {
323
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
324
+ return
325
+ }
326
+
327
+ callback([NSNull(), resp ?? []])
328
+ }
329
+ }
330
+ )
331
+ }
332
+
333
+ @objc(iso15693ExtendedReadMultipleBlocks:callback:)
334
+ static func iso15693ExtendedReadMultipleBlocks(
335
+ _ options: NSDictionary,
336
+ callback: @escaping RNNfcResponseSenderBlock
337
+ ) {
338
+ forwardWithTagSessionSupport(
339
+ isIso15693Supported(),
340
+ callback: callback,
341
+ noSessionMessage: "Not connected",
342
+ operation: { tagSession in
343
+ iso15693ExtendedReadMultipleBlocks(with: tagSession, options: options) { dataBlocks, error in
344
+ if let error {
345
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
346
+ return
347
+ }
348
+
349
+ callback([NSNull(), dataBlocks ?? []])
350
+ }
351
+ }
352
+ )
353
+ }
354
+
355
+ @objc(iso15693ExtendedWriteSingleBlock:callback:)
356
+ static func iso15693ExtendedWriteSingleBlock(
357
+ _ options: NSDictionary,
358
+ callback: @escaping RNNfcResponseSenderBlock
359
+ ) {
360
+ forwardWithTagSessionSupport(
361
+ isIso15693Supported(),
362
+ callback: callback,
363
+ noSessionMessage: "Not connected",
364
+ operation: { tagSession in
365
+ iso15693ExtendedWriteSingleBlock(with: tagSession, options: options) { error in
366
+ if let error {
367
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
368
+ return
369
+ }
370
+
371
+ callback([])
372
+ }
373
+ }
374
+ )
375
+ }
376
+
377
+ @objc(iso15693ExtendedLockBlock:callback:)
378
+ static func iso15693ExtendedLockBlock(
379
+ _ options: NSDictionary,
380
+ callback: @escaping RNNfcResponseSenderBlock
381
+ ) {
382
+ forwardWithTagSessionSupport(
383
+ isIso15693Supported(),
384
+ callback: callback,
385
+ noSessionMessage: "Not connected",
386
+ operation: { tagSession in
387
+ iso15693ExtendedLockBlock(with: tagSession, options: options) { error in
388
+ if let error {
389
+ callback([RNNfcSwiftUtil.errorMessage(from: error as NSError), NSNull()])
390
+ return
391
+ }
392
+
393
+ callback([])
394
+ }
395
+ }
396
+ )
397
+ }
398
+
399
+ @objc(iso15693GetSystemInfoWithSession:flags:completion:)
400
+ static func iso15693GetSystemInfo(
401
+ with session: NFCTagReaderSession,
402
+ flags: NSNumber,
403
+ completion: @escaping RNNfcIso15693SystemInfoResultBlock
404
+ ) {
405
+ guard let connectedTag = session.connectedTag else {
406
+ completion(nil, NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
407
+ return
408
+ }
409
+
410
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
411
+ completion(nil, NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
412
+ return
413
+ }
414
+
415
+ let requestFlags = NFCISO15693RequestFlag(rawValue: flags.uint8Value)
416
+ tag.getSystemInfo(requestFlags: requestFlags) { dsfid, afi, blockSize, blockCount, icReference, error in
417
+ if let error {
418
+ completion(nil, error as NSError)
419
+ return
420
+ }
421
+
422
+ completion(
423
+ [
424
+ "dsfid": NSNumber(value: dsfid),
425
+ "afi": NSNumber(value: afi),
426
+ "blockSize": NSNumber(value: blockSize),
427
+ "blockCount": NSNumber(value: blockCount),
428
+ "icReference": NSNumber(value: icReference),
429
+ ],
430
+ nil
431
+ )
432
+ }
433
+ }
434
+
435
+ @objc(iso15693ReadSingleBlockWithSession:options:completion:)
436
+ static func iso15693ReadSingleBlock(
437
+ with session: NFCTagReaderSession,
438
+ options: NSDictionary,
439
+ completion: @escaping RNNfcDataResultBlock
440
+ ) {
441
+ guard let connectedTag = session.connectedTag else {
442
+ completion(nil, NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
443
+ return
444
+ }
445
+
446
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
447
+ completion(nil, NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
448
+ return
449
+ }
450
+
451
+ let flags = (options["flags"] as? NSNumber)?.uint8Value ?? 0
452
+ let blockNumber = (options["blockNumber"] as? NSNumber)?.uint8Value ?? 0
453
+ let requestFlags = NFCISO15693RequestFlag(rawValue: flags)
454
+
455
+ tag.readSingleBlock(requestFlags: requestFlags, blockNumber: blockNumber) { resp, error in
456
+ if let error {
457
+ completion(nil, error as NSError)
458
+ return
459
+ }
460
+
461
+ completion(RNNfcSwiftUtil.numberArray(from: resp), nil)
462
+ }
463
+ }
464
+
465
+ @objc(iso15693ReadMultipleBlocksWithSession:options:completion:)
466
+ static func iso15693ReadMultipleBlocks(
467
+ with session: NFCTagReaderSession,
468
+ options: NSDictionary,
469
+ completion: @escaping RNNfcIso15693BlocksResultBlock
470
+ ) {
471
+ guard let connectedTag = session.connectedTag else {
472
+ completion(nil, NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
473
+ return
474
+ }
475
+
476
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
477
+ completion(nil, NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
478
+ return
479
+ }
480
+
481
+ let flags = (options["flags"] as? NSNumber)?.uint8Value ?? 0
482
+ let blockNumber = (options["blockNumber"] as? NSNumber)?.intValue ?? 0
483
+ let blockCount = (options["blockCount"] as? NSNumber)?.intValue ?? 0
484
+ let requestFlags = NFCISO15693RequestFlag(rawValue: flags)
485
+ let blockRange = NSRange(location: blockNumber, length: blockCount)
486
+
487
+ tag.readMultipleBlocks(requestFlags: requestFlags, blockRange: blockRange) { dataBlocks, error in
488
+ if let error {
489
+ completion(nil, error as NSError)
490
+ return
491
+ }
492
+
493
+ let blocks = dataBlocks.map { RNNfcSwiftUtil.numberArray(from: $0) }
494
+ completion(blocks, nil)
495
+ }
496
+ }
497
+
498
+ @objc(iso15693WriteSingleBlockWithSession:options:completion:)
499
+ static func iso15693WriteSingleBlock(
500
+ with session: NFCTagReaderSession,
501
+ options: NSDictionary,
502
+ completion: @escaping RNNfcVoidResultBlock
503
+ ) {
504
+ guard let connectedTag = session.connectedTag else {
505
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
506
+ return
507
+ }
508
+
509
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
510
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
511
+ return
512
+ }
513
+
514
+ let requestFlags = iso15693RequestFlags(from: options)
515
+ let blockNumber = (options["blockNumber"] as? NSNumber)?.uint8Value ?? 0
516
+ let dataBlockArray = (options["dataBlock"] as? [NSNumber]) ?? []
517
+ let dataBlock = RNNfcSwiftUtil.data(from: dataBlockArray)
518
+
519
+ tag.writeSingleBlock(requestFlags: requestFlags, blockNumber: blockNumber, dataBlock: dataBlock) { error in
520
+ completion(error as NSError?)
521
+ }
522
+ }
523
+
524
+ @objc(iso15693LockBlockWithSession:options:completion:)
525
+ static func iso15693LockBlock(
526
+ with session: NFCTagReaderSession,
527
+ options: NSDictionary,
528
+ completion: @escaping RNNfcVoidResultBlock
529
+ ) {
530
+ guard let connectedTag = session.connectedTag else {
531
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
532
+ return
533
+ }
534
+
535
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
536
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
537
+ return
538
+ }
539
+
540
+ let requestFlags = iso15693RequestFlags(from: options)
541
+ let blockNumber = (options["blockNumber"] as? NSNumber)?.uint8Value ?? 0
542
+
543
+ tag.lockBlock(requestFlags: requestFlags, blockNumber: blockNumber) { error in
544
+ completion(error as NSError?)
545
+ }
546
+ }
547
+
548
+ @objc(iso15693WriteAFIWithSession:options:completion:)
549
+ static func iso15693WriteAFI(
550
+ with session: NFCTagReaderSession,
551
+ options: NSDictionary,
552
+ completion: @escaping RNNfcVoidResultBlock
553
+ ) {
554
+ guard let connectedTag = session.connectedTag else {
555
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
556
+ return
557
+ }
558
+
559
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
560
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
561
+ return
562
+ }
563
+
564
+ let requestFlags = iso15693RequestFlags(from: options)
565
+ let afi = (options["afi"] as? NSNumber)?.uint8Value ?? 0
566
+
567
+ tag.writeAFI(requestFlags: requestFlags, afi: afi) { error in
568
+ completion(error as NSError?)
569
+ }
570
+ }
571
+
572
+ @objc(iso15693LockAFIWithSession:options:completion:)
573
+ static func iso15693LockAFI(
574
+ with session: NFCTagReaderSession,
575
+ options: NSDictionary,
576
+ completion: @escaping RNNfcVoidResultBlock
577
+ ) {
578
+ guard let connectedTag = session.connectedTag else {
579
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
580
+ return
581
+ }
582
+
583
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
584
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
585
+ return
586
+ }
587
+
588
+ let requestFlags = iso15693RequestFlags(from: options)
589
+ tag.lockAFI(requestFlags: requestFlags) { error in
590
+ completion(error as NSError?)
591
+ }
592
+ }
593
+
594
+ @objc(iso15693WriteDSFIDWithSession:options:completion:)
595
+ static func iso15693WriteDSFID(
596
+ with session: NFCTagReaderSession,
597
+ options: NSDictionary,
598
+ completion: @escaping RNNfcVoidResultBlock
599
+ ) {
600
+ guard let connectedTag = session.connectedTag else {
601
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
602
+ return
603
+ }
604
+
605
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
606
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
607
+ return
608
+ }
609
+
610
+ let requestFlags = iso15693RequestFlags(from: options)
611
+ let dsfid = (options["dsfid"] as? NSNumber)?.uint8Value ?? 0
612
+
613
+ tag.writeDSFID(requestFlags: requestFlags, dsfid: dsfid) { error in
614
+ completion(error as NSError?)
615
+ }
616
+ }
617
+
618
+ @objc(iso15693LockDSFIDWithSession:options:completion:)
619
+ static func iso15693LockDSFID(
620
+ with session: NFCTagReaderSession,
621
+ options: NSDictionary,
622
+ completion: @escaping RNNfcVoidResultBlock
623
+ ) {
624
+ guard let connectedTag = session.connectedTag else {
625
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
626
+ return
627
+ }
628
+
629
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
630
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
631
+ return
632
+ }
633
+
634
+ let requestFlags = iso15693RequestFlags(from: options)
635
+ tag.lockDFSID(requestFlags: requestFlags) { error in
636
+ completion(error as NSError?)
637
+ }
638
+ }
639
+
640
+ @objc(iso15693ResetToReadyWithSession:options:completion:)
641
+ static func iso15693ResetToReady(
642
+ with session: NFCTagReaderSession,
643
+ options: NSDictionary,
644
+ completion: @escaping RNNfcVoidResultBlock
645
+ ) {
646
+ guard let connectedTag = session.connectedTag else {
647
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
648
+ return
649
+ }
650
+
651
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
652
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
653
+ return
654
+ }
655
+
656
+ let requestFlags = iso15693RequestFlags(from: options)
657
+ tag.resetToReady(requestFlags: requestFlags) { error in
658
+ completion(error as NSError?)
659
+ }
660
+ }
661
+
662
+ @objc(iso15693SelectWithSession:options:completion:)
663
+ static func iso15693Select(
664
+ with session: NFCTagReaderSession,
665
+ options: NSDictionary,
666
+ completion: @escaping RNNfcVoidResultBlock
667
+ ) {
668
+ guard let connectedTag = session.connectedTag else {
669
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
670
+ return
671
+ }
672
+
673
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
674
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
675
+ return
676
+ }
677
+
678
+ let requestFlags = iso15693RequestFlags(from: options)
679
+ tag.select(requestFlags: requestFlags) { error in
680
+ completion(error as NSError?)
681
+ }
682
+ }
683
+
684
+ @objc(iso15693StayQuietWithSession:completion:)
685
+ static func iso15693StayQuiet(
686
+ with session: NFCTagReaderSession,
687
+ completion: @escaping RNNfcVoidResultBlock
688
+ ) {
689
+ guard let connectedTag = session.connectedTag else {
690
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
691
+ return
692
+ }
693
+
694
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
695
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
696
+ return
697
+ }
698
+
699
+ tag.stayQuiet { error in
700
+ completion(error as NSError?)
701
+ }
702
+ }
703
+
704
+ @objc(iso15693CustomCommandWithSession:options:completion:)
705
+ static func iso15693CustomCommand(
706
+ with session: NFCTagReaderSession,
707
+ options: NSDictionary,
708
+ completion: @escaping RNNfcDataResultBlock
709
+ ) {
710
+ guard let connectedTag = session.connectedTag else {
711
+ completion(nil, NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
712
+ return
713
+ }
714
+
715
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
716
+ completion(nil, NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
717
+ return
718
+ }
719
+
720
+ let requestFlags = iso15693RequestFlags(from: options)
721
+ let customCommandCode = (options["customCommandCode"] as? NSNumber)?.intValue ?? 0
722
+ let requestParamsArray = (options["customRequestParameters"] as? [NSNumber]) ?? []
723
+ let requestParams = RNNfcSwiftUtil.data(from: requestParamsArray)
724
+
725
+ tag.customCommand(requestFlags: requestFlags, customCommandCode: customCommandCode, customRequestParameters: requestParams) { resp, error in
726
+ if let error {
727
+ completion(nil, error as NSError)
728
+ return
729
+ }
730
+
731
+ completion(RNNfcSwiftUtil.numberArray(from: resp), nil)
732
+ }
733
+ }
734
+
735
+ @objc(iso15693SendRequestWithSession:options:completion:)
736
+ static func iso15693SendRequest(
737
+ with session: NFCTagReaderSession,
738
+ options: NSDictionary,
739
+ completion: @escaping RNNfcIso15693SendRequestResultBlock
740
+ ) {
741
+ guard let connectedTag = session.connectedTag else {
742
+ completion(nil, nil, NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
743
+ return
744
+ }
745
+
746
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
747
+ completion(nil, nil, NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
748
+ return
749
+ }
750
+
751
+ let requestFlags = (options["flags"] as? NSNumber)?.intValue ?? 0
752
+ let commandCode = (options["commandCode"] as? NSNumber)?.intValue ?? 0
753
+ let dataArray = (options["data"] as? [NSNumber]) ?? []
754
+ let data = RNNfcSwiftUtil.data(from: dataArray)
755
+
756
+ tag.sendRequest(requestFlags: requestFlags, commandCode: commandCode, data: data) { result in
757
+ switch result {
758
+ case .failure(let error):
759
+ completion(nil, nil, error as NSError)
760
+ case .success(let payload):
761
+ let (responseFlag, responseData) = payload
762
+ completion(
763
+ NSNumber(value: responseFlag.rawValue),
764
+ RNNfcSwiftUtil.numberArray(from: responseData ?? Data()),
765
+ nil
766
+ )
767
+ }
768
+ }
769
+ }
770
+
771
+ @objc(iso15693ExtendedReadSingleBlockWithSession:options:completion:)
772
+ static func iso15693ExtendedReadSingleBlock(
773
+ with session: NFCTagReaderSession,
774
+ options: NSDictionary,
775
+ completion: @escaping RNNfcDataResultBlock
776
+ ) {
777
+ guard let connectedTag = session.connectedTag else {
778
+ completion(nil, NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
779
+ return
780
+ }
781
+
782
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
783
+ completion(nil, NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
784
+ return
785
+ }
786
+
787
+ let requestFlags = iso15693RequestFlags(from: options)
788
+ let blockNumber = (options["blockNumber"] as? NSNumber)?.intValue ?? 0
789
+
790
+ tag.extendedReadSingleBlock(requestFlags: requestFlags, blockNumber: blockNumber) { resp, error in
791
+ if let error {
792
+ completion(nil, error as NSError)
793
+ return
794
+ }
795
+
796
+ completion(RNNfcSwiftUtil.numberArray(from: resp), nil)
797
+ }
798
+ }
799
+
800
+ @objc(iso15693ExtendedReadMultipleBlocksWithSession:options:completion:)
801
+ static func iso15693ExtendedReadMultipleBlocks(
802
+ with session: NFCTagReaderSession,
803
+ options: NSDictionary,
804
+ completion: @escaping RNNfcIso15693BlocksResultBlock
805
+ ) {
806
+ guard let connectedTag = session.connectedTag else {
807
+ completion(nil, NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
808
+ return
809
+ }
810
+
811
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
812
+ completion(nil, NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
813
+ return
814
+ }
815
+
816
+ let requestFlags = iso15693RequestFlags(from: options)
817
+ let blockNumber = (options["blockNumber"] as? NSNumber)?.intValue ?? 0
818
+ let blockCount = (options["blockCount"] as? NSNumber)?.intValue ?? 0
819
+ let blockRange = NSRange(location: blockNumber, length: blockCount)
820
+
821
+ tag.extendedReadMultipleBlocks(requestFlags: requestFlags, blockRange: blockRange) { dataBlocks, error in
822
+ if let error {
823
+ completion(nil, error as NSError)
824
+ return
825
+ }
826
+
827
+ let blocks = dataBlocks.map { RNNfcSwiftUtil.numberArray(from: $0) }
828
+ completion(blocks, nil)
829
+ }
830
+ }
831
+
832
+ @objc(iso15693ExtendedWriteSingleBlockWithSession:options:completion:)
833
+ static func iso15693ExtendedWriteSingleBlock(
834
+ with session: NFCTagReaderSession,
835
+ options: NSDictionary,
836
+ completion: @escaping RNNfcVoidResultBlock
837
+ ) {
838
+ guard let connectedTag = session.connectedTag else {
839
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
840
+ return
841
+ }
842
+
843
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
844
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
845
+ return
846
+ }
847
+
848
+ let requestFlags = iso15693RequestFlags(from: options)
849
+ let blockNumber = (options["blockNumber"] as? NSNumber)?.intValue ?? 0
850
+ let dataBlockArray = (options["dataBlock"] as? [NSNumber]) ?? []
851
+ let dataBlock = RNNfcSwiftUtil.data(from: dataBlockArray)
852
+
853
+ tag.extendedWriteSingleBlock(requestFlags: requestFlags, blockNumber: blockNumber, dataBlock: dataBlock) { error in
854
+ completion(error as NSError?)
855
+ }
856
+ }
857
+
858
+ @objc(iso15693ExtendedLockBlockWithSession:options:completion:)
859
+ static func iso15693ExtendedLockBlock(
860
+ with session: NFCTagReaderSession,
861
+ options: NSDictionary,
862
+ completion: @escaping RNNfcVoidResultBlock
863
+ ) {
864
+ guard let connectedTag = session.connectedTag else {
865
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 1, userInfo: [NSLocalizedDescriptionKey: "Not connected"]))
866
+ return
867
+ }
868
+
869
+ guard let tag = extractIso15693Tag(from: connectedTag) else {
870
+ completion(NSError(domain: "RNNfcTechSwiftService", code: 7, userInfo: [NSLocalizedDescriptionKey: "incorrect tag type"]))
871
+ return
872
+ }
873
+
874
+ let requestFlags = iso15693RequestFlags(from: options)
875
+ let blockNumber = (options["blockNumber"] as? NSNumber)?.intValue ?? 0
876
+
877
+ tag.extendedLockBlock(requestFlags: requestFlags, blockNumber: blockNumber) { error in
878
+ completion(error as NSError?)
879
+ }
880
+ }
881
+
882
+ @available(iOS 14.0, *)
883
+ private static func extractIso15693Tag(from connectedTag: NFCTag) -> NFCISO15693Tag? {
884
+ if case let .iso15693(tag) = connectedTag {
885
+ return tag
886
+ }
887
+ return nil
888
+ }
889
+
890
+ @available(iOS 14.0, *)
891
+ private static func iso15693RequestFlags(from options: NSDictionary) -> NFCISO15693RequestFlag {
892
+ let rawValue = (options["flags"] as? NSNumber)?.uint8Value ?? 0
893
+ return NFCISO15693RequestFlag(rawValue: rawValue)
894
+ }
895
+ }