react-native-nfc-manager 4.0.0-beta.7 → 4.0.0-beta.9
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.
- package/README.md +37 -3
- package/android/src/main/java/community/revteltech/nfc/MifareClassicHandler.java +419 -0
- package/android/src/main/java/community/revteltech/nfc/MifareUltralightHandler.java +84 -0
- package/android/src/main/java/community/revteltech/nfc/NdefHandler.java +373 -0
- package/android/src/main/java/community/revteltech/nfc/NfcAdapterStateChangedReceiver.java +48 -0
- package/android/src/main/java/community/revteltech/nfc/NfcErrorCodes.java +16 -0
- package/android/src/main/java/community/revteltech/nfc/NfcManager.java +333 -1119
- package/android/src/main/java/community/revteltech/nfc/NfcManagerIOSStubBase.java +130 -0
- package/android/src/main/java/community/revteltech/nfc/NfcTechIoRouter.java +258 -0
- package/android/src/main/java/community/revteltech/nfc/TagTechnologyRequest.java +19 -7
- package/android/src/main/java/community/revteltech/nfc/Util.java +201 -0
- package/dist/ndef-lib/constants.js +67 -0
- package/dist/ndef-lib/constants.js.map +1 -0
- package/dist/ndef-lib/index.js +79 -0
- package/dist/ndef-lib/index.js.map +1 -0
- package/dist/ndef-lib/ndef-text.js +29 -0
- package/dist/ndef-lib/ndef-text.js.map +1 -0
- package/dist/ndef-lib/ndef-uri.js +40 -0
- package/dist/ndef-lib/ndef-uri.js.map +1 -0
- package/dist/ndef-lib/ndef-wifi-simple.js +100 -0
- package/dist/ndef-lib/ndef-wifi-simple.js.map +1 -0
- package/dist/ndef-lib/ndef.js +153 -0
- package/dist/ndef-lib/ndef.js.map +1 -0
- package/dist/ndef-lib/stringifier.js +155 -0
- package/dist/ndef-lib/stringifier.js.map +1 -0
- package/dist/ndef-lib/util.js +126 -0
- package/dist/ndef-lib/util.js.map +1 -0
- package/dist/specs/NativeNfcManager.js +5 -0
- package/dist/specs/NativeNfcManager.js.map +1 -0
- package/dist/src/NativeNfcManager.js +55 -0
- package/dist/src/NativeNfcManager.js.map +1 -0
- package/dist/src/NfcError.js +220 -0
- package/dist/src/NfcError.js.map +1 -0
- package/dist/src/NfcManager.js +175 -0
- package/dist/src/NfcManager.js.map +1 -0
- package/dist/src/NfcManagerAndroid.js +112 -0
- package/dist/src/NfcManagerAndroid.js.map +1 -0
- package/dist/src/NfcManagerIOS.js +119 -0
- package/dist/src/NfcManagerIOS.js.map +1 -0
- package/dist/src/NfcTech/Iso15693HandlerIOS.js +99 -0
- package/dist/src/NfcTech/Iso15693HandlerIOS.js.map +1 -0
- package/dist/src/NfcTech/IsoDepHandler.js +29 -0
- package/dist/src/NfcTech/IsoDepHandler.js.map +1 -0
- package/dist/src/NfcTech/MifareClassicHandlerAndroid.js +68 -0
- package/dist/src/NfcTech/MifareClassicHandlerAndroid.js.map +1 -0
- package/dist/src/NfcTech/MifareUltralightHandlerAndroid.js +23 -0
- package/dist/src/NfcTech/MifareUltralightHandlerAndroid.js.map +1 -0
- package/dist/src/NfcTech/NdefFormatableHandlerAndroid.js +16 -0
- package/dist/src/NfcTech/NdefFormatableHandlerAndroid.js.map +1 -0
- package/dist/src/NfcTech/NdefHandler.js +54 -0
- package/dist/src/NfcTech/NdefHandler.js.map +1 -0
- package/dist/src/NfcTech/NfcAHandler.js +16 -0
- package/dist/src/NfcTech/NfcAHandler.js.map +1 -0
- package/dist/src/NfcTech/NfcVHandler.js +33 -0
- package/dist/src/NfcTech/NfcVHandler.js.map +1 -0
- package/dist/src/index.js +53 -0
- package/dist/src/index.js.map +1 -0
- package/index.d.ts +76 -43
- package/ios/NfcManager.h +2 -10
- package/ios/NfcManager.mm +176 -434
- package/ios/RNNfcBridgeUtil.h +28 -0
- package/ios/RNNfcBridgeUtil.mm +52 -0
- package/ios/RNNfcManager+Felica.swift +61 -0
- package/ios/RNNfcManager+Iso15693.swift +895 -0
- package/ios/RNNfcManager+IsoDep.swift +145 -0
- package/ios/RNNfcManager+Mifare.swift +61 -0
- package/ios/RNNfcManager+Ndef.swift +120 -0
- package/ios/RNNfcManager.h +251 -0
- package/ios/RNNfcManager.swift +648 -0
- package/ios/RNNfcSessionDelegateProxy.swift +104 -0
- package/ios/RNNfcSwiftUtil.swift +34 -0
- package/ndef-lib/{constants.js → constants.ts} +2 -0
- package/ndef-lib/{index.js → index.ts} +23 -12
- package/ndef-lib/{ndef-text.js → ndef-text.ts} +7 -2
- package/ndef-lib/{ndef-uri.js → ndef-uri.ts} +8 -3
- package/ndef-lib/{ndef-wifi-simple.js → ndef-wifi-simple.ts} +34 -11
- package/ndef-lib/{ndef.js → ndef.ts} +49 -20
- package/ndef-lib/{stringifier.js → stringifier.ts} +27 -10
- package/ndef-lib/{util.js → util.ts} +13 -8
- package/package.json +21 -7
- package/react-native-nfc-manager.podspec +3 -2
- package/specs/NativeNfcManager.ts +17 -3
- package/src/NativeNfcManager.ts +84 -0
- package/src/{NfcError.js → NfcError.ts} +6 -17
- package/src/{NfcManager.js → NfcManager.ts} +49 -34
- package/src/{NfcManagerAndroid.js → NfcManagerAndroid.ts} +25 -8
- package/src/{NfcManagerIOS.js → NfcManagerIOS.ts} +31 -10
- package/src/NfcTech/{Iso15693HandlerIOS.js → Iso15693HandlerIOS.ts} +64 -36
- package/src/NfcTech/{IsoDepHandler.js → IsoDepHandler.ts} +8 -5
- package/src/NfcTech/{MifareClassicHandlerAndroid.js → MifareClassicHandlerAndroid.ts} +33 -24
- package/src/NfcTech/{MifareUltralightHandlerAndroid.js → MifareUltralightHandlerAndroid.ts} +14 -5
- package/src/NfcTech/{NdefFormatableHandlerAndroid.js → NdefFormatableHandlerAndroid.ts} +9 -2
- package/src/NfcTech/{NdefHandler.js → NdefHandler.ts} +19 -6
- package/src/NfcTech/{NfcAHandler.js → NfcAHandler.ts} +6 -3
- package/src/NfcTech/{NfcVHandler.js → NfcVHandler.ts} +8 -5
- package/src/__mocks__/{NativeNfcManager.js → NativeNfcManager.ts} +4 -1
- package/src/{index.js → index.ts} +1 -1
- package/android/src/main/java/community/revteltech/nfc/JsonConvert.java +0 -141
- package/android/src/main/java/community/revteltech/nfc/MifareUtil.java +0 -84
- package/ios/NfcManager+Felica.mm +0 -43
- package/ios/NfcManager+Iso15693.mm +0 -600
- package/ios/NfcManager+IsoDep.mm +0 -83
- package/ios/NfcManager+Mifare.mm +0 -43
- package/ios/Util.mm +0 -55
- package/specs/NativeNfcManager.js +0 -3
- package/specs/NativeNfcManager.js.map +0 -1
- 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
|
+
}
|