react-native-nfc-manager 3.11.1 → 3.11.5

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 CHANGED
@@ -32,11 +32,30 @@ For Android, it should be properly auto-linked, so you don't need to do anything
32
32
 
33
33
  Please see [here](setup.md)
34
34
 
35
- ## Also See
35
+ ### **Android 12**
36
36
 
37
- ### [Demo App] NfcOpenReWriter
37
+ We start to support Android 12 from `v3.11.1`, and you will need to update `compileSdkVersion` to `31`, otherwise the build will fail:
38
38
 
39
- We have a full featured NFC utility app available for download.
39
+ ```
40
+ buildscript {
41
+ ext {
42
+ ...
43
+ compileSdkVersion = 31
44
+ ...
45
+ }
46
+ ...
47
+ }
48
+ ```
49
+
50
+ The reason for this is because Android puts new limitation on [PendingIntent](https://developer.android.com/reference/android/app/PendingIntent#FLAG_MUTABLE) which says `Starting with Build.VERSION_CODES.S, it will be required to explicitly specify the mutability of PendingIntents`
51
+
52
+ > The original issue is [here](https://github.com/revtel/react-native-nfc-manager/issues/469)
53
+
54
+ BTW, if you don't care about **Android 12** for now, you can use **`v3.11.0`** as a short term solution.
55
+
56
+ ### **[Demo App] NfcOpenReWriter**
57
+
58
+ We have a full featured NFC utility app using this library available for download.
40
59
 
41
60
  <a href='https://apps.apple.com/tw/app/nfc-rewriter/id1551243964' target='_blank'>
42
61
  <img alt="react-native-nfc-rewriter" src="./images/Apple-App-Store-Icon.png" width="250">
@@ -50,19 +69,73 @@ We have a full featured NFC utility app available for download.
50
69
 
51
70
  It also open sourced in this repo: [React Native NFC ReWriter App](https://github.com/revtel/react-native-nfc-rewriter)
52
71
 
53
- ## Basic Usage
72
+ ## Usage
54
73
 
55
- If all you want to do is to read `NDEF` data, you can use this example:
74
+ The simplest (and most common) use case for this library is to read `NFC` tags containing `NDEF`, which can be achieved via the following codes:
56
75
 
57
76
  ```javascript
58
- import NfcManager, {NfcEvents} from 'react-native-nfc-manager';
77
+ import React from 'react';
78
+ import {View, Text, TouchableOpacity, StyleSheet} from 'react-native';
79
+ import NfcManager, {NfcTech} from 'react-native-nfc-manager';
59
80
 
60
81
  // Pre-step, call this before any NFC operations
61
- async function initNfc() {
62
- await NfcManager.start();
82
+ NfcManager.start();
83
+
84
+ function App() {
85
+ async function readNdef() {
86
+ try {
87
+ // register for the NFC tag with NDEF in it
88
+ await NfcManager.requestTechnology(NfcTech.Ndef);
89
+ // the resolved tag object will contain `ndefMessage` property
90
+ const tag = await NfcManager.getTag();
91
+ console.warn('Tag found', tag);
92
+ } catch (ex) {
93
+ console.warn('Oops!', ex);
94
+ } finally {
95
+ // stop the nfc scanning
96
+ NfcManager.cancelTechnologyRequest();
97
+ }
98
+ }
99
+
100
+ return (
101
+ <View style={styles.wrapper}>
102
+ <TouchableOpacity onPress={readNdef}>
103
+ <Text>Scan a Tag</Text>
104
+ </TouchableOpacity>
105
+ </View>
106
+ );
63
107
  }
64
108
 
65
- function readNdef() {
109
+ const styles = StyleSheet.create({
110
+ wrapper: {
111
+ flex: 1,
112
+ justifyContent: 'center',
113
+ alignItems: 'center',
114
+ },
115
+ });
116
+
117
+ export default App;
118
+ ```
119
+
120
+ Pleaes notice when running above codes, iOS and Android has different behaviors:
121
+
122
+ - iOS will pop up a system scanning UI
123
+ - Android provides **NO** system scanning UI
124
+
125
+ Regarding the system scannning UI, both platforms should be able to scan your NFC tags succesfully and print out its content.
126
+
127
+ ### Old Style (registerTagEvent) To Scan NFC Tags
128
+
129
+ There's an alterntaive style to scan NFC tags through `NfcManager.registerTagEvent`, like this:
130
+
131
+ ```javascript
132
+ import NfcManager, {NfcTech} from 'react-native-nfc-manager';
133
+
134
+ // The following function resolves to a NFC Tag object using old event listener approach.
135
+ // You can call it like this:
136
+ // `const nfcTag = await listenToNfcEventOnce()`
137
+
138
+ function listenToNfcEventOnce() {
66
139
  const cleanUp = () => {
67
140
  NfcManager.setEventListener(NfcEvents.DiscoverTag, null);
68
141
  NfcManager.setEventListener(NfcEvents.SessionClosed, null);
@@ -74,8 +147,7 @@ function readNdef() {
74
147
  NfcManager.setEventListener(NfcEvents.DiscoverTag, (tag) => {
75
148
  tagFound = tag;
76
149
  resolve(tagFound);
77
- NfcManager.setAlertMessageIOS('NDEF tag found');
78
- NfcManager.unregisterTagEvent().catch(() => 0);
150
+ NfcManager.unregisterTagEvent();
79
151
  });
80
152
 
81
153
  NfcManager.setEventListener(NfcEvents.SessionClosed, () => {
@@ -90,120 +162,102 @@ function readNdef() {
90
162
  }
91
163
  ```
92
164
 
93
- Anything else, ex: write NDEF, send custom command, please read next section.
165
+ As you can see, the above approach is more verbose and hard-to-read, so we recommend using `NfcManager.requestTechnology` instead of `NfcManager.registerTagEvent` in your application.
166
+
167
+ ## Advanced Usage Concept
94
168
 
95
- ## Advanced Usage
169
+ In higher level, there're 4 steps to use this library:
96
170
 
97
- In high level, there're 3 steps to perform advanced NFC operations:
171
+ 1. request your particular NFC technologies through `NfcManager.requestTechnology`, for example:
98
172
 
99
- 1. request your specific NFC technology
100
- 2. select the proper NFC technology handler, which is implemented as getter in main `NfcManager` object, including:
101
- - ndefHandler
102
- - nfcAHandler
103
- - isoDepHandler
104
- - iso15693HandlerIOS
105
- - mifareClassicHandlerAndroid
106
- - mifareUltralightHandlerAndroid
107
- 3. call specific methods on the NFC technology handler
108
- 4. clean up your tech registration
173
+ - `Ndef`
174
+ - `NfcA`
175
+ - `NfcB` (Android-only)
176
+ - `NfcF` (Android-only)
177
+ - `NfcV` (Android-only)
178
+ - `IsoDep`
179
+ - `MifareClassic` (Android-only)
180
+ - `MifareUltralight` (Android-only)
181
+ - `MifareIOS` (ios-only)
182
+ - `Iso15693IOS` (ios-only)
183
+ - `FelicaIOS` (ios-only)
184
+
185
+ 2. select the proper NFC technology handler, which is implemented as getter in main `NfcManager` object, for example:
186
+
187
+ - `ndefHandler` (for `Ndef` tech)
188
+ - `nfcAHandler` (for `NfcA` tech)
189
+ - `isoDepHandler` (for `IsoDep` tech)
190
+ - `iso15693HandlerIOS` (for `Iso15693IOS` tech)
191
+ - `mifareClassicHandlerAndroid` (for `mifareClassic` tech)
192
+ - `mifareUltralightHandlerAndroid` (for `mifareUltralight` tech)
193
+ - ... and so on
194
+
195
+ 3. call specific methods on the NFC technology handler (for example `NfcManager.ndefHandler.writeNdefMessage`). To view all available methods for some tech handler, check out the [API List](index.d.ts)
196
+
197
+ 4. clean up your tech registration through `NfcManager.cancelTechnology`
198
+
199
+ ## Advanced Usage Example: NDEF-Writing
109
200
 
110
201
  For example, here's an example to write NDEF:
111
202
 
112
203
  ```javascript
113
204
  import NfcManager, {NfcTech, Ndef} from 'react-native-nfc-manager';
114
205
 
115
- // Pre-step, call this before any NFC operations
116
- async function initNfc() {
117
- await NfcManager.start();
118
- }
119
-
120
206
  async function writeNdef({type, value}) {
121
207
  let result = false;
122
208
 
123
209
  try {
124
- // Step 1
125
- await NfcManager.requestTechnology(NfcTech.Ndef, {
126
- alertMessage: 'Ready to write some NDEF',
127
- });
210
+ // STEP 1
211
+ await NfcManager.requestTechnology(NfcTech.Ndef);
128
212
 
129
213
  const bytes = Ndef.encodeMessage([Ndef.textRecord('Hello NFC')]);
130
214
 
131
215
  if (bytes) {
132
- await NfcManager.ndefHandler // Step2
133
- .writeNdefMessage(bytes); // Step3
134
-
135
- if (Platform.OS === 'ios') {
136
- await NfcManager.setAlertMessageIOS('Successfully write NDEF');
137
- }
216
+ await NfcManager.ndefHandler // STEP 2
217
+ .writeNdefMessage(bytes); // STEP 3
218
+ result = true;
138
219
  }
139
-
140
- result = true;
141
220
  } catch (ex) {
142
221
  console.warn(ex);
222
+ } finally {
223
+ // STEP 4
224
+ NfcManager.cancelTechnologyRequest();
143
225
  }
144
226
 
145
- // Step 4
146
- NfcManager.cancelTechnologyRequest().catch(() => 0);
147
227
  return result;
148
228
  }
149
229
  ```
150
230
 
151
- ## Advanced: Mifare Ultralight usage
231
+ ## Advanced Usage Example: Mifare Ultralight
152
232
 
153
- Here's an example to read a Mifare Ultralight tag:
233
+ Here's another example to read a Mifare Ultralight tag:
154
234
 
155
235
  ```javascript
156
- import NfcManager, {NfcTech} from 'react-native-nfc-manager';
157
-
158
- // Pre-step, call this before any NFC operations
159
- async function initNfc() {
160
- await NfcManager.start();
161
- }
162
-
163
236
  async function readMifare() {
237
+ let mifarePages = [];
238
+
164
239
  try {
165
- // 0. Request Mifare technology
240
+ // STEP 1
166
241
  let reqMifare = await NfcManager.requestTechnology(
167
242
  NfcTech.MifareUltralight,
168
243
  );
169
- if (reqMifare !== 'MifareUltralight') {
170
- throw new Error(
171
- '[NFC Read] [ERR] Mifare technology could not be requested',
172
- );
173
- }
174
-
175
- // 1. Get NFC Tag information
176
- const nfcTag = await NfcManager.getTag();
177
- console.log('[NFC Read] [INFO] Tag: ', nfcTag);
178
244
 
179
- // 2. Read pages
180
245
  const readLength = 60;
181
- let mifarePages = [];
182
246
  const mifarePagesRead = await Promise.all(
183
247
  [...Array(readLength).keys()].map(async (_, i) => {
184
- const pageOffset = i * 4; // 4 Pages are read at once, so offset should be in steps with length 4
185
- let pages = await NfcManager.mifareUltralightHandlerAndroid.mifareUltralightReadPages(
186
- pageOffset,
187
- );
248
+ const pages = await NfcManager.mifareUltralightHandlerAndroid // STEP 2
249
+ .mifareUltralightReadPages(i * 4); // STEP 3
188
250
  mifarePages.push(pages);
189
- console.log(`[NFC Read] [INFO] Mifare Page: ${pageOffset}`, pages);
190
- //await wait(500); // If Mifare Chip is to slow
191
251
  }),
192
252
  );
193
-
194
- // 3. Success
195
- console.log('[NFC Read] [INFO] Success reading Mifare');
196
-
197
- // 4. Cleanup
198
- _cleanup();
199
253
  } catch (ex) {
200
- console.warn('[NFC Read] [ERR] Failed Reading Mifare: ', ex);
201
- _cleanup();
254
+ console.warn(ex);
255
+ } finally {
256
+ // STEP 4
257
+ NfcManager.cancelTechnologyRequest();
202
258
  }
203
- }
204
259
 
205
- function _cleanup() {
206
- NfcManager.cancelTechnologyRequest().catch(() => 0);
260
+ return mifarePages;
207
261
  }
208
262
  ```
209
263
 
@@ -233,6 +287,8 @@ After installing this npm package, add the [config plugin](https://docs.expo.io/
233
287
 
234
288
  Next, rebuild your app as described in the ["Adding custom native code"](https://docs.expo.io/workflow/customizing/) guide.
235
289
 
290
+ > Notice: This Config Plugin will ensure the minimum Android SDK version is 31.
291
+
236
292
  #### Props
237
293
 
238
294
  The plugin provides props for extra customization. Every time you change the props or plugins, you'll need to rebuild (and `prebuild`) the native app. If no extra properties are added, defaults will be used.
@@ -259,4 +315,3 @@ The plugin provides props for extra customization. Every time you change the pro
259
315
  }
260
316
  }
261
317
  ```
262
-
@@ -14,7 +14,7 @@ buildscript {
14
14
  apply plugin: 'com.android.library'
15
15
 
16
16
  android {
17
- compileSdkVersion safeExtGet('compileSdkVersion', 27)
17
+ compileSdkVersion safeExtGet('compileSdkVersion', 31)
18
18
  defaultConfig {
19
19
  minSdkVersion safeExtGet('minSdkVersion', 16)
20
20
  //noinspection OldTargetApi
@@ -987,6 +987,16 @@ class NfcManager extends ReactContextBaseJavaModule implements ActivityEventList
987
987
  callback.invoke(null, isForegroundEnabled);
988
988
  }
989
989
 
990
+ @ReactMethod
991
+ public void addListener(String eventName) {
992
+ // Keep: Required for RN built in Event Emitter Calls.
993
+ }
994
+
995
+ @ReactMethod
996
+ public void removeListeners(Integer count) {
997
+ // Keep: Required for RN built in Event Emitter Calls.
998
+ }
999
+
990
1000
  @Override
991
1001
  public void onHostResume() {
992
1002
  Log.d(LOG_TAG, "onResume");
package/app.plugin.js CHANGED
@@ -85,6 +85,14 @@ function withNfc(config, props = {}) {
85
85
  config = withIosNfcEntitlement(config);
86
86
  config = withIosNfcSelectIdentifiers(config, {selectIdentifiers});
87
87
  config = withIosNfcSystemCodes(config, {systemCodes});
88
+
89
+ // We start to support Android 12 from v3.11.1, and you will need to update compileSdkVersion to 31,
90
+ // otherwise the build will fail:
91
+ config = AndroidConfig.Version.withBuildScriptExtMinimumVersion(config, {
92
+ name: 'compileSdkVersion',
93
+ minVersion: 31,
94
+ });
95
+
88
96
  if (nfcPermission !== false) {
89
97
  config = withIosPermission(config, props);
90
98
  config = AndroidConfig.Permissions.withPermissions(config, [
package/index.d.ts CHANGED
@@ -63,7 +63,7 @@ declare module 'react-native-nfc-manager' {
63
63
  maxSize?: number;
64
64
  type?: string;
65
65
  techTypes?: string[];
66
- id?: number[];
66
+ id?: string;
67
67
  }
68
68
 
69
69
  export interface RegisterTagEventOpts {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-nfc-manager",
3
- "version": "3.11.1",
3
+ "version": "3.11.5",
4
4
  "description": "A NFC module for react native.",
5
5
  "main": "src/index.js",
6
6
  "repository": {
@@ -62,7 +62,7 @@
62
62
  "typescript": "^4.1.3"
63
63
  },
64
64
  "dependencies": {
65
- "@expo/config-plugins": "^3.0.6"
65
+ "@expo/config-plugins": "^4.0.16"
66
66
  },
67
67
  "scripts": {
68
68
  "lint": "eslint .",
package/CHANGELOG.md DELETED
@@ -1,98 +0,0 @@
1
- ## [3.0.2](https://github.com/whitedogg13/react-native-nfc-manager/compare/v3.0.1...v3.0.2) (2021-02-22)
2
-
3
-
4
- ### Features
5
-
6
- * **android:** allow requestTechnology resolves to tags even when tech ([8b7f862](https://github.com/whitedogg13/react-native-nfc-manager/commit/8b7f8629a8e46304f2a68d62f01e745047fe01dc))
7
-
8
-
9
-
10
- ## [3.0.1](https://github.com/whitedogg13/react-native-nfc-manager/compare/v3.0.0...v3.0.1) (2021-02-20)
11
-
12
-
13
- ### Bug Fixes
14
-
15
- * [#371](https://github.com/whitedogg13/react-native-nfc-manager/issues/371) missing MIFARE_BLOCK_SIZE for mifareClassicHandlerAndroid ([b136419](https://github.com/whitedogg13/react-native-nfc-manager/commit/b1364197c80ab16542bbb823483a2079a896e169))
16
-
17
-
18
-
19
- # [3.0.0](https://github.com/whitedogg13/react-native-nfc-manager/compare/v3.0.0-0...v3.0.0) (2021-02-18)
20
-
21
-
22
- ### Features
23
-
24
- * expose RTD_URI_PROTOCOLS ([26516a7](https://github.com/whitedogg13/react-native-nfc-manager/commit/26516a7ce8309ade21464df13a8e5c799c0e417c))
25
-
26
-
27
-
28
- # [3.0.0-0](https://github.com/whitedogg13/react-native-nfc-manager/compare/v2.0.0-beta.1...v3.0.0-0) (2021-02-10)
29
-
30
-
31
- ### Bug Fixes
32
-
33
- * disable 18092 polling (cause iOS freeze) ([64115f8](https://github.com/whitedogg13/react-native-nfc-manager/commit/64115f80f8cd93ed5ef3b01987d6c628a5a9127b))
34
- * **ios:** add polling for iso18092 ([b7984a5](https://github.com/whitedogg13/react-native-nfc-manager/commit/b7984a59ea27076d7fd34a2614592f468c80f5e1))
35
- * add callback type null possible ([1371533](https://github.com/whitedogg13/react-native-nfc-manager/commit/13715334ea908b89654b42eba4ec902bcc6f4229))
36
- * cancelTechnology might cause exception if there's a connected tag ([af2f1f9](https://github.com/whitedogg13/react-native-nfc-manager/commit/af2f1f92bbd7bfcf8c604db48b790289c3ca4946))
37
- * cancelTechnology might cause exception if there's a connected tag ([dcb26b8](https://github.com/whitedogg13/react-native-nfc-manager/commit/dcb26b85a955ce17ae633e00f6f189a895e8adcb))
38
- * getNdefMessage should use the same structure for platforms ([73859fb](https://github.com/whitedogg13/react-native-nfc-manager/commit/73859fbac8939277f1e7fc2ad13ececee8c9d4c7))
39
- * import NfcManager from new location ([c95cc76](https://github.com/whitedogg13/react-native-nfc-manager/commit/c95cc76a0a3b52c751c1a0f00895cf1b34b66b28))
40
- * ios isSupported ([adcc966](https://github.com/whitedogg13/react-native-nfc-manager/commit/adcc966c8ed4a565c2800fabc5e5a0cad07ea376))
41
- * promise won't be rejected when calling cancelTechnologyRequest in ([64c9cbd](https://github.com/whitedogg13/react-native-nfc-manager/commit/64c9cbd05e34e975fa4744727859efd08ea610bf))
42
- * reject tech request promise when native iOS cancel button is pressed ([7915b98](https://github.com/whitedogg13/react-native-nfc-manager/commit/7915b98132cf5c6f86eb96dfe242b67bef32e8a7))
43
- * remove getNdefMessage's parameter declaration ([6fc257e](https://github.com/whitedogg13/react-native-nfc-manager/commit/6fc257e61e1da5600a7aac44d9a8a97a7ecc988c))
44
-
45
-
46
- ### Features
47
-
48
- * extract more NfcTech handlers ([0032408](https://github.com/whitedogg13/react-native-nfc-manager/commit/0032408af21cafa3f5f92c16083f914325450524))
49
- * **android:** getNdefStatus ([4cc68ce](https://github.com/whitedogg13/react-native-nfc-manager/commit/4cc68ce233d81c03760b791fc2f568fe4b8415c4))
50
- * **ios:** enhance didDetectTags and add queryNDEFStatus / makeReadOnly ([32dd3be](https://github.com/whitedogg13/react-native-nfc-manager/commit/32dd3be2968abbe095ae42fd12793a9a8c0725c6))
51
- * invalidateSessionWithErrorIOS ([c631110](https://github.com/whitedogg13/react-native-nfc-manager/commit/c631110b6454c08821607014a28b8dffb20fe8b0))
52
- * ios 13 ndef read and write ([31a3ae6](https://github.com/whitedogg13/react-native-nfc-manager/commit/31a3ae6e141e41f3f36a102d5c2bb5ce04ba78a5))
53
- * requestTechnology support multi-techs ([65e8f02](https://github.com/whitedogg13/react-native-nfc-manager/commit/65e8f02b83820cb72e65c8443a607b6dca2c8fae))
54
-
55
-
56
-
57
- # [2.0.0-beta.1](https://github.com/whitedogg13/react-native-nfc-manager/compare/0.0.9...v2.0.0-beta.1) (2019-07-13)
58
-
59
-
60
- ### Bug Fixes
61
-
62
- * call the correct method `mifareUltralightReadPages` (notice the tailing s) ([60feee8](https://github.com/whitedogg13/react-native-nfc-manager/commit/60feee88c2d20bc18af23b3abb6d8cb22fe17e16))
63
- * ios crash on registerTagEvent ([e654d93](https://github.com/whitedogg13/react-native-nfc-manager/commit/e654d9359751327284d20b3bee1139c78657dcb4))
64
- * MifareClassic should also support `transceive` ([dd4a902](https://github.com/whitedogg13/react-native-nfc-manager/commit/dd4a902257a402e5d6d3eae8bd43f9d37c03928b))
65
- * use non-cached ndef for getNdefMessage API ([49f8541](https://github.com/whitedogg13/react-native-nfc-manager/commit/49f85415a5bc6d0218992dc6ba2b9303cee8e3ac))
66
-
67
-
68
- ### Features
69
-
70
- * mifareultralight support ([4a53a13](https://github.com/whitedogg13/react-native-nfc-manager/commit/4a53a135c594ef340927ae053dfc142ebfd0b9b6))
71
- * support `getMaxTransceiveLength` and `setTimeout` ([e759c39](https://github.com/whitedogg13/react-native-nfc-manager/commit/e759c399008e9060ae6f5fe23d7b31a61b1f8037))
72
-
73
-
74
-
75
- ## [0.0.9](https://github.com/whitedogg13/react-native-nfc-manager/compare/0.0.8...0.0.9) (2018-01-02)
76
-
77
-
78
-
79
- ## [0.0.8](https://github.com/whitedogg13/react-native-nfc-manager/compare/0.0.7...0.0.8) (2017-12-09)
80
-
81
-
82
-
83
- ## [0.0.7](https://github.com/whitedogg13/react-native-nfc-manager/compare/0.0.6...0.0.7) (2017-12-04)
84
-
85
-
86
-
87
- ## [0.0.6](https://github.com/whitedogg13/react-native-nfc-manager/compare/0.0.3...0.0.6) (2017-11-17)
88
-
89
-
90
-
91
- ## [0.0.3](https://github.com/whitedogg13/react-native-nfc-manager/compare/0.0.2...0.0.3) (2017-09-27)
92
-
93
-
94
-
95
- ## 0.0.2 (2017-08-01)
96
-
97
-
98
-