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
@@ -2,8 +2,11 @@ import {Platform} from 'react-native';
2
2
  import {callNative, NativeNfcManager} from '../NativeNfcManager';
3
3
  import {handleNativeException} from '../NfcError';
4
4
 
5
+ type Byte = number;
6
+ type ByteArray = Byte[];
7
+
5
8
  class NfcVHandler {
6
- async transceive(bytes) {
9
+ async transceive(bytes: ByteArray): Promise<ByteArray> {
7
10
  if (!Array.isArray(bytes)) {
8
11
  throw new Error(
9
12
  'IsoDepHandler.transceive only takes input as a byte array',
@@ -13,14 +16,14 @@ class NfcVHandler {
13
16
  if (Platform.OS === 'ios') {
14
17
  const [flags, commandCode, ...data] = bytes;
15
18
  return handleNativeException(
16
- new Promise((resolve, reject) => {
19
+ new Promise<ByteArray>((resolve, reject) => {
17
20
  NativeNfcManager.iso15693_sendRequest(
18
21
  {
19
22
  flags,
20
23
  commandCode,
21
24
  data,
22
25
  },
23
- (err, responseFlag, response) => {
26
+ (err: string | null, responseFlag: number, response: ByteArray) => {
24
27
  if (err) {
25
28
  reject(err);
26
29
  } else {
@@ -29,10 +32,10 @@ class NfcVHandler {
29
32
  },
30
33
  );
31
34
  }),
32
- );
35
+ ) as Promise<ByteArray>;
33
36
  }
34
37
 
35
- return handleNativeException(callNative('transceive', [bytes]));
38
+ return handleNativeException(callNative('transceive', [bytes])) as Promise<ByteArray>;
36
39
  }
37
40
  }
38
41
 
@@ -4,6 +4,9 @@ let _nextErrorMethod = null;
4
4
  const NativeNfcManager = {
5
5
  MIFARE_BLOCK_SIZE: 16,
6
6
  MIFARE_ULTRALIGHT_PAGE_SIZE: 4,
7
+ MIFARE_ULTRALIGHT_TYPE: 1,
8
+ MIFARE_ULTRALIGHT_TYPE_C: 2,
9
+ MIFARE_ULTRALIGHT_TYPE_UNKNOWN: -1,
7
10
  setNextError: (err, nativeMethodName = null) => {
8
11
  _nextError = err;
9
12
  _nextErrorMethod = nativeMethodName;
@@ -22,7 +25,7 @@ const NfcManagerEmitter = {
22
25
  };
23
26
 
24
27
  const callNative = jest.fn((...args) => {
25
- const [methodName, ...rest] = args;
28
+ const [methodName] = args;
26
29
  if (_nextError && (!methodName || methodName === _nextErrorMethod)) {
27
30
  const err = _nextError;
28
31
  _nextError = null;
@@ -1,5 +1,5 @@
1
1
  import {Platform} from 'react-native';
2
- import Ndef from '../ndef-lib';
2
+ const Ndef = require('../ndef-lib');
3
3
  import {NfcEvents, NfcTech, NdefStatus} from './NfcManager';
4
4
  import {NfcAdapter, NfcManagerAndroid} from './NfcManagerAndroid';
5
5
  import {
@@ -1,141 +0,0 @@
1
- /**
2
- * Written by Andrzej Porebski Nov 14/2015
3
- * Copyright (c) 2015, Andrzej Porebski
4
- *
5
- * Modified by YunJiang.Fang
6
- * Copyright (c) 2015, YunJiang.Fang
7
- */
8
-
9
- package community.revteltech.nfc;
10
-
11
- import com.facebook.react.bridge.Arguments;
12
- import com.facebook.react.bridge.ReadableArray;
13
- import com.facebook.react.bridge.ReadableMap;
14
- import com.facebook.react.bridge.ReadableMapKeySetIterator;
15
- import com.facebook.react.bridge.ReadableType;
16
- import com.facebook.react.bridge.WritableArray;
17
- import com.facebook.react.bridge.WritableMap;
18
-
19
- import org.json.JSONArray;
20
- import org.json.JSONException;
21
- import org.json.JSONObject;
22
-
23
- import java.util.Iterator;
24
-
25
- public abstract class JsonConvert {
26
- public static JSONObject reactToJSON(ReadableMap readableMap) throws JSONException {
27
- JSONObject jsonObject = new JSONObject();
28
- ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
29
- while(iterator.hasNextKey()){
30
- String key = iterator.nextKey();
31
- ReadableType valueType = readableMap.getType(key);
32
- switch (valueType){
33
- case Null:
34
- jsonObject.put(key,JSONObject.NULL);
35
- break;
36
- case Boolean:
37
- jsonObject.put(key, readableMap.getBoolean(key));
38
- break;
39
- case Number:
40
- try {
41
- jsonObject.put(key, readableMap.getInt(key));
42
- } catch(Exception e) {
43
- jsonObject.put(key, readableMap.getDouble(key));
44
- }
45
- break;
46
- case String:
47
- jsonObject.put(key, readableMap.getString(key));
48
- break;
49
- case Map:
50
- jsonObject.put(key, reactToJSON(readableMap.getMap(key)));
51
- break;
52
- case Array:
53
- jsonObject.put(key, reactToJSON(readableMap.getArray(key)));
54
- break;
55
- }
56
- }
57
-
58
- return jsonObject;
59
- }
60
-
61
- public static JSONArray reactToJSON(ReadableArray readableArray) throws JSONException {
62
- JSONArray jsonArray = new JSONArray();
63
- for(int i=0; i < readableArray.size(); i++) {
64
- ReadableType valueType = readableArray.getType(i);
65
- switch (valueType){
66
- case Null:
67
- jsonArray.put(JSONObject.NULL);
68
- break;
69
- case Boolean:
70
- jsonArray.put(readableArray.getBoolean(i));
71
- break;
72
- case Number:
73
- try {
74
- jsonArray.put(readableArray.getInt(i));
75
- } catch(Exception e) {
76
- jsonArray.put(readableArray.getDouble(i));
77
- }
78
- break;
79
- case String:
80
- jsonArray.put(readableArray.getString(i));
81
- break;
82
- case Map:
83
- jsonArray.put(reactToJSON(readableArray.getMap(i)));
84
- break;
85
- case Array:
86
- jsonArray.put(reactToJSON(readableArray.getArray(i)));
87
- break;
88
- }
89
- }
90
- return jsonArray;
91
- }
92
-
93
- public static WritableMap jsonToReact(JSONObject jsonObject) throws JSONException {
94
- WritableMap writableMap = Arguments.createMap();
95
- Iterator iterator = jsonObject.keys();
96
- while(iterator.hasNext()) {
97
- String key = (String) iterator.next();
98
- Object value = jsonObject.get(key);
99
- if (value instanceof Float || value instanceof Double) {
100
- writableMap.putDouble(key, jsonObject.getDouble(key));
101
- } else if (value instanceof Number) {
102
- writableMap.putInt(key, jsonObject.getInt(key));
103
- } else if (value instanceof String) {
104
- writableMap.putString(key, jsonObject.getString(key));
105
- } else if (value instanceof JSONObject) {
106
- writableMap.putMap(key,jsonToReact(jsonObject.getJSONObject(key)));
107
- } else if (value instanceof JSONArray){
108
- writableMap.putArray(key, jsonToReact(jsonObject.getJSONArray(key)));
109
- } else if ("true".equals(value.toString()) || "false".equals(value.toString())){
110
- writableMap.putBoolean(key, "true".equals(value.toString()));
111
- } else if (value == JSONObject.NULL){
112
- writableMap.putNull(key);
113
- }
114
- }
115
-
116
- return writableMap;
117
- }
118
-
119
- public static WritableArray jsonToReact(JSONArray jsonArray) throws JSONException {
120
- WritableArray writableArray = Arguments.createArray();
121
- for(int i=0; i < jsonArray.length(); i++) {
122
- Object value = jsonArray.get(i);
123
- if (value instanceof Float || value instanceof Double) {
124
- writableArray.pushDouble(jsonArray.getDouble(i));
125
- } else if (value instanceof Number) {
126
- writableArray.pushInt(jsonArray.getInt(i));
127
- } else if (value instanceof String) {
128
- writableArray.pushString(jsonArray.getString(i));
129
- } else if (value instanceof JSONObject) {
130
- writableArray.pushMap(jsonToReact(jsonArray.getJSONObject(i)));
131
- } else if (value instanceof JSONArray){
132
- writableArray.pushArray(jsonToReact(jsonArray.getJSONArray(i)));
133
- } else if ("true".equals(value.toString()) || "false".equals(value.toString())){
134
- writableArray.pushBoolean("true".equals(value.toString()));
135
- } else if (value == JSONObject.NULL){
136
- writableArray.pushNull();
137
- }
138
- }
139
- return writableArray;
140
- }
141
- }
@@ -1,84 +0,0 @@
1
- package community.revteltech.nfc;
2
-
3
- import android.app.Activity;
4
- import android.content.pm.PackageManager;
5
- import android.os.Build;
6
-
7
- import java.io.File;
8
- import java.util.*;
9
- import java.nio.charset.Charset;
10
-
11
- class MifareUtil {
12
- /**
13
- * Checks if Mifare is supported on a device with some heuristics.
14
- * Will _try_ to detect if Mifare is supported on a device or not. Please note that it's not fool-proof: I've
15
- * seen on some older devices (Samsung Galaxy S4) the method returning true, while we can only detect it fails
16
- * when a tag is scanned. Unfortunately there's nothing to do about it. But still it's a good effort and a
17
- * better approach than blacklisting devices imho.
18
- *
19
- * Credits: ikarus23 (https://github.com/ikarus23/MifareClassicTool)
20
- * @see https://github.com/ikarus23/MifareClassicTool/blob/master/Mifare%20Classic%20Tool/app/src/main/java/de/syss/MifareClassicTool/Common.java#L588
21
- * @see https://github.com/ikarus23/MifareClassicTool/blob/master/INCOMPATIBLE_DEVICES.md
22
- *
23
- * @param currentActivity The activity (should be passed since this is a static utility method).
24
- * @return The fact if a device is supported or not.
25
- */
26
- public static boolean isDeviceSupported(Activity currentActivity) {
27
- if (currentActivity == null) {
28
- return false;
29
- }
30
-
31
- if (!currentActivity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC)) {
32
- return false;
33
- }
34
-
35
- boolean foundViaFeatures = currentActivity.getPackageManager().hasSystemFeature("com.nxp.mifare");
36
- if (!foundViaFeatures) {
37
- return false;
38
- }
39
-
40
- // The following code is thanks to ikarus23's MifareClassicTool (https://github.com/ikarus23/MifareClassicTool)
41
- // @see https://github.com/ikarus23/MifareClassicTool/blob/3eb37b0afa3f57f0d18f2fcdfcee2435b47886d8/Mifare%20Classic%20Tool/app/src/main/java/de/syss/MifareClassicTool/Common.java#L588
42
-
43
- // Check if there is the NFC device "bcm2079x-i2c".
44
- // Chips by Broadcom don't support MIFARE Classic.
45
- // This could fail because on a lot of devices apps don't have
46
- // the sufficient permissions.
47
- // Another exception:
48
- // The Lenovo P2 has a device at "/dev/bcm2079x-i2c" but is still
49
- // able of reading/writing MIFARE Classic tags. I don't know why...
50
- // https://github.com/ikarus23/MifareClassicTool/issues/152
51
- boolean isLenovoP2 = Build.MANUFACTURER.equals("LENOVO")
52
- && Build.MODEL.equals("Lenovo P2a42");
53
- File device = new File("/dev/bcm2079x-i2c");
54
- if (!isLenovoP2 && device.exists()) {
55
- return false;
56
- }
57
-
58
- // Check if there is the NFC device "pn544".
59
- // The PN544 NFC chip is manufactured by NXP.
60
- // Chips by NXP support MIFARE Classic.
61
- device = new File("/dev/pn544");
62
- if (device.exists()) {
63
- return true;
64
- }
65
-
66
- // Check if there are NFC libs with "brcm" in their names.
67
- // "brcm" libs are for devices with Broadcom chips. Broadcom chips
68
- // don't support MIFARE Classic.
69
- File libsFolder = new File("/system/lib");
70
- File[] libs = libsFolder.listFiles();
71
- for (File lib : libs) {
72
- if (lib.isFile()
73
- && lib.getName().startsWith("libnfc")
74
- && lib.getName().contains("brcm")
75
- // Add here other non NXP NFC libraries.
76
- ) {
77
- return false;
78
- }
79
- }
80
-
81
- // We don't have reason to believe that it's not supported, or we can't detect it right now (we should wait when a tag is connected and do then some heuristics)
82
- return true;
83
- }
84
- }
@@ -1,43 +0,0 @@
1
- #import "NfcManager.h"
2
- #import "React/RCTBridge.h"
3
- #import "React/RCTConvert.h"
4
- #import "React/RCTEventDispatcher.h"
5
- #import "React/RCTLog.h"
6
-
7
- @interface NfcManager (Felica)
8
- @end
9
-
10
- @implementation NfcManager (Felica)
11
-
12
- - (void)sendFelicaCommand:(NSArray *)bytes callback: (nonnull RCTResponseSenderBlock)callback
13
- {
14
- if (@available(iOS 13.0, *)) {
15
- if ([self tagSession] != nil) {
16
- if ([self tagSession].connectedTag) {
17
- id<NFCFeliCaTag> felicaTag = [[self tagSession].connectedTag asNFCFeliCaTag];
18
- NSData *data = arrayToData(bytes);
19
- NSLog(@"input bytes: %@", getHexString(data));
20
- if (felicaTag) {
21
- [felicaTag sendFeliCaCommandPacket:data
22
- completionHandler:^(NSData *response, NSError *error) {
23
- if (error) {
24
- callback(@[getErrorMessage(error), [NSNull null]]);
25
- } else {
26
- callback(@[[NSNull null], dataToArray(response)]);
27
- }
28
- }];
29
- return;
30
- } else {
31
- callback(@[@"not a felica tag", [NSNull null]]);
32
- }
33
- }
34
- callback(@[@"Not connected", [NSNull null]]);
35
- } else {
36
- callback(@[@"Not even registered", [NSNull null]]);
37
- }
38
- } else {
39
- callback(@[@"Not support in this device", [NSNull null]]);
40
- }
41
- }
42
-
43
- @end