react-native-nfc-manager 3.11.2 → 3.12.0

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,9 +32,9 @@ 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
- ### Android 12
35
+ ### **Android 12**
36
36
 
37
- To support Android 12, you will need to update `compileSdkVersion` in your `android/build.gradle` like this:
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
39
  ```
40
40
  buildscript {
@@ -47,17 +47,15 @@ buildscript {
47
47
  }
48
48
  ```
49
49
 
50
- The reason for this is because Android puts new limitation on [PendingIntent](https://developer.android.com/reference/android/app/PendingIntent#FLAG_MUTABLE):
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
51
 
52
- > Starting with Build.VERSION_CODES.S, it will be required to explicitly specify the mutability of PendingIntents
52
+ > The original issue is [here](https://github.com/revtel/react-native-nfc-manager/issues/469)
53
53
 
54
- The original issue is [here](https://github.com/revtel/react-native-nfc-manager/issues/469)
54
+ BTW, if you don't care about **Android 12** for now, you can use **`v3.11.0`** as a short term solution.
55
55
 
56
- ## Also See
56
+ ### **[Demo App] NfcOpenReWriter**
57
57
 
58
- ### [Demo App] NfcOpenReWriter
59
-
60
- We have a full featured NFC utility app available for download.
58
+ We have a full featured NFC utility app using this library available for download.
61
59
 
62
60
  <a href='https://apps.apple.com/tw/app/nfc-rewriter/id1551243964' target='_blank'>
63
61
  <img alt="react-native-nfc-rewriter" src="./images/Apple-App-Store-Icon.png" width="250">
@@ -71,19 +69,73 @@ We have a full featured NFC utility app available for download.
71
69
 
72
70
  It also open sourced in this repo: [React Native NFC ReWriter App](https://github.com/revtel/react-native-nfc-rewriter)
73
71
 
74
- ## Basic Usage
72
+ ## Usage
75
73
 
76
- 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:
77
75
 
78
76
  ```javascript
79
- 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';
80
80
 
81
81
  // Pre-step, call this before any NFC operations
82
- async function initNfc() {
83
- 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
+ );
84
107
  }
85
108
 
86
- 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() {
87
139
  const cleanUp = () => {
88
140
  NfcManager.setEventListener(NfcEvents.DiscoverTag, null);
89
141
  NfcManager.setEventListener(NfcEvents.SessionClosed, null);
@@ -95,8 +147,7 @@ function readNdef() {
95
147
  NfcManager.setEventListener(NfcEvents.DiscoverTag, (tag) => {
96
148
  tagFound = tag;
97
149
  resolve(tagFound);
98
- NfcManager.setAlertMessageIOS('NDEF tag found');
99
- NfcManager.unregisterTagEvent().catch(() => 0);
150
+ NfcManager.unregisterTagEvent();
100
151
  });
101
152
 
102
153
  NfcManager.setEventListener(NfcEvents.SessionClosed, () => {
@@ -111,120 +162,102 @@ function readNdef() {
111
162
  }
112
163
  ```
113
164
 
114
- 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
168
+
169
+ In higher level, there're 4 steps to use this library:
170
+
171
+ 1. request your particular NFC technologies through `NfcManager.requestTechnology`, for example:
172
+
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:
115
186
 
116
- ## Advanced Usage
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
117
194
 
118
- In high level, there're 3 steps to perform advanced NFC operations:
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)
119
196
 
120
- 1. request your specific NFC technology
121
- 2. select the proper NFC technology handler, which is implemented as getter in main `NfcManager` object, including:
122
- - ndefHandler
123
- - nfcAHandler
124
- - isoDepHandler
125
- - iso15693HandlerIOS
126
- - mifareClassicHandlerAndroid
127
- - mifareUltralightHandlerAndroid
128
- 3. call specific methods on the NFC technology handler
129
- 4. clean up your tech registration
197
+ 4. clean up your tech registration through `NfcManager.cancelTechnology`
198
+
199
+ ## Advanced Usage Example: NDEF-Writing
130
200
 
131
201
  For example, here's an example to write NDEF:
132
202
 
133
203
  ```javascript
134
204
  import NfcManager, {NfcTech, Ndef} from 'react-native-nfc-manager';
135
205
 
136
- // Pre-step, call this before any NFC operations
137
- async function initNfc() {
138
- await NfcManager.start();
139
- }
140
-
141
206
  async function writeNdef({type, value}) {
142
207
  let result = false;
143
208
 
144
209
  try {
145
- // Step 1
146
- await NfcManager.requestTechnology(NfcTech.Ndef, {
147
- alertMessage: 'Ready to write some NDEF',
148
- });
210
+ // STEP 1
211
+ await NfcManager.requestTechnology(NfcTech.Ndef);
149
212
 
150
213
  const bytes = Ndef.encodeMessage([Ndef.textRecord('Hello NFC')]);
151
214
 
152
215
  if (bytes) {
153
- await NfcManager.ndefHandler // Step2
154
- .writeNdefMessage(bytes); // Step3
155
-
156
- if (Platform.OS === 'ios') {
157
- await NfcManager.setAlertMessageIOS('Successfully write NDEF');
158
- }
216
+ await NfcManager.ndefHandler // STEP 2
217
+ .writeNdefMessage(bytes); // STEP 3
218
+ result = true;
159
219
  }
160
-
161
- result = true;
162
220
  } catch (ex) {
163
221
  console.warn(ex);
222
+ } finally {
223
+ // STEP 4
224
+ NfcManager.cancelTechnologyRequest();
164
225
  }
165
226
 
166
- // Step 4
167
- NfcManager.cancelTechnologyRequest().catch(() => 0);
168
227
  return result;
169
228
  }
170
229
  ```
171
230
 
172
- ## Advanced: Mifare Ultralight usage
231
+ ## Advanced Usage Example: Mifare Ultralight
173
232
 
174
- Here's an example to read a Mifare Ultralight tag:
233
+ Here's another example to read a Mifare Ultralight tag:
175
234
 
176
235
  ```javascript
177
- import NfcManager, {NfcTech} from 'react-native-nfc-manager';
178
-
179
- // Pre-step, call this before any NFC operations
180
- async function initNfc() {
181
- await NfcManager.start();
182
- }
183
-
184
236
  async function readMifare() {
237
+ let mifarePages = [];
238
+
185
239
  try {
186
- // 0. Request Mifare technology
240
+ // STEP 1
187
241
  let reqMifare = await NfcManager.requestTechnology(
188
242
  NfcTech.MifareUltralight,
189
243
  );
190
- if (reqMifare !== 'MifareUltralight') {
191
- throw new Error(
192
- '[NFC Read] [ERR] Mifare technology could not be requested',
193
- );
194
- }
195
-
196
- // 1. Get NFC Tag information
197
- const nfcTag = await NfcManager.getTag();
198
- console.log('[NFC Read] [INFO] Tag: ', nfcTag);
199
244
 
200
- // 2. Read pages
201
245
  const readLength = 60;
202
- let mifarePages = [];
203
246
  const mifarePagesRead = await Promise.all(
204
247
  [...Array(readLength).keys()].map(async (_, i) => {
205
- const pageOffset = i * 4; // 4 Pages are read at once, so offset should be in steps with length 4
206
- let pages = await NfcManager.mifareUltralightHandlerAndroid.mifareUltralightReadPages(
207
- pageOffset,
208
- );
248
+ const pages = await NfcManager.mifareUltralightHandlerAndroid // STEP 2
249
+ .mifareUltralightReadPages(i * 4); // STEP 3
209
250
  mifarePages.push(pages);
210
- console.log(`[NFC Read] [INFO] Mifare Page: ${pageOffset}`, pages);
211
- //await wait(500); // If Mifare Chip is to slow
212
251
  }),
213
252
  );
214
-
215
- // 3. Success
216
- console.log('[NFC Read] [INFO] Success reading Mifare');
217
-
218
- // 4. Cleanup
219
- _cleanup();
220
253
  } catch (ex) {
221
- console.warn('[NFC Read] [ERR] Failed Reading Mifare: ', ex);
222
- _cleanup();
254
+ console.warn(ex);
255
+ } finally {
256
+ // STEP 4
257
+ NfcManager.cancelTechnologyRequest();
223
258
  }
224
- }
225
259
 
226
- function _cleanup() {
227
- NfcManager.cancelTechnologyRequest().catch(() => 0);
260
+ return mifarePages;
228
261
  }
229
262
  ```
230
263
 
@@ -254,6 +287,8 @@ After installing this npm package, add the [config plugin](https://docs.expo.io/
254
287
 
255
288
  Next, rebuild your app as described in the ["Adding custom native code"](https://docs.expo.io/workflow/customizing/) guide.
256
289
 
290
+ > Notice: This Config Plugin will ensure the minimum Android SDK version is 31.
291
+
257
292
  #### Props
258
293
 
259
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.
@@ -280,4 +315,3 @@ The plugin provides props for extra customization. Every time you change the pro
280
315
  }
281
316
  }
282
317
  ```
283
-
@@ -266,6 +266,36 @@ class NfcManager extends ReactContextBaseJavaModule implements ActivityEventList
266
266
  }
267
267
  }
268
268
 
269
+ @ReactMethod
270
+ public void formatNdef(ReadableArray rnArray, ReadableMap options, Callback callback) {
271
+ boolean readOnly = options.getBoolean("readOnly");
272
+
273
+ synchronized(this) {
274
+ if (techRequest != null) {
275
+ try {
276
+ NdefFormatable ndef = (NdefFormatable)techRequest.getTechHandle();
277
+ if (ndef == null) {
278
+ callback.invoke(ERR_API_NOT_SUPPORT);
279
+ } else {
280
+ byte[] bytes = rnArrayToBytes(rnArray);
281
+ NdefMessage msg = new NdefMessage(bytes);
282
+ if (readOnly) {
283
+ ndef.formatReadOnly(msg);
284
+ } else {
285
+ ndef.format(msg);
286
+ }
287
+ callback.invoke();
288
+ }
289
+ } catch (Exception ex) {
290
+ Log.d(LOG_TAG, ex.toString());
291
+ callback.invoke(ex.toString());
292
+ }
293
+ } else {
294
+ callback.invoke(ERR_NO_TECH_REQ);
295
+ }
296
+ }
297
+ }
298
+
269
299
  private void mifareClassicAuthenticate(char type, int sector, ReadableArray key, Callback callback) {
270
300
  if (techRequest != null) {
271
301
  try {
@@ -987,6 +1017,16 @@ class NfcManager extends ReactContextBaseJavaModule implements ActivityEventList
987
1017
  callback.invoke(null, isForegroundEnabled);
988
1018
  }
989
1019
 
1020
+ @ReactMethod
1021
+ public void addListener(String eventName) {
1022
+ // Keep: Required for RN built in Event Emitter Calls.
1023
+ }
1024
+
1025
+ @ReactMethod
1026
+ public void removeListeners(Integer count) {
1027
+ // Keep: Required for RN built in Event Emitter Calls.
1028
+ }
1029
+
990
1030
  @Override
991
1031
  public void onHostResume() {
992
1032
  Log.d(LOG_TAG, "onResume");
@@ -11,6 +11,7 @@ import android.nfc.tech.NfcV;
11
11
  import android.nfc.tech.NfcF;
12
12
  import android.nfc.tech.MifareClassic;
13
13
  import android.nfc.tech.MifareUltralight;
14
+ import android.nfc.tech.NdefFormatable;
14
15
  import android.nfc.tech.IsoDep;
15
16
  import android.util.Log;
16
17
  import com.facebook.react.bridge.*;
@@ -76,6 +77,8 @@ class TagTechnologyRequest {
76
77
  mTech = MifareClassic.get(tag);
77
78
  } else if (techType.equals("MifareUltralight")) {
78
79
  mTech = MifareUltralight.get(tag);
80
+ } else if (techType.equals("NdefFormatable")) {
81
+ mTech = NdefFormatable.get(tag);
79
82
  }
80
83
 
81
84
  if (mTech == null) {
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
@@ -22,6 +22,7 @@ declare module 'react-native-nfc-manager' {
22
22
  MifareIOS = 'mifare',
23
23
  Iso15693IOS = 'iso15693',
24
24
  FelicaIOS = 'felica',
25
+ NdefFormatable = 'NdefFormatable',
25
26
  }
26
27
 
27
28
  export enum NdefStatus {
@@ -63,7 +64,7 @@ declare module 'react-native-nfc-manager' {
63
64
  maxSize?: number;
64
65
  type?: string;
65
66
  techTypes?: string[];
66
- id?: number[];
67
+ id?: string;
67
68
  }
68
69
 
69
70
  export interface RegisterTagEventOpts {
@@ -121,6 +122,10 @@ declare module 'react-native-nfc-manager' {
121
122
  ) => Promise<void>;
122
123
  }
123
124
 
125
+ interface NdefFormatableHandlerAndroid {
126
+ formatNdef: (bytes: number[], options?: { readOnly: boolean }) => Promise<void>;
127
+ }
128
+
124
129
  /** [iOS ONLY] */
125
130
  interface Iso15693HandlerIOS {
126
131
  getSystemInfo: (
@@ -236,6 +241,7 @@ declare module 'react-native-nfc-manager' {
236
241
  setTimeout(timeout: number): Promise<void>;
237
242
  mifareClassicHandlerAndroid: MifareClassicHandlerAndroid;
238
243
  mifareUltralightHandlerAndroid: MifareUltralightHandlerAndroid;
244
+ ndefFormatableHandlerAndroid: NdefFormatableHandlerAndroid;
239
245
  }
240
246
 
241
247
  const nfcManager: NfcManager;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-nfc-manager",
3
- "version": "3.11.2",
3
+ "version": "3.12.0",
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/src/NfcManager.js CHANGED
@@ -33,6 +33,7 @@ const NfcTech = {
33
33
  MifareIOS: 'mifare',
34
34
  Iso15693IOS: 'iso15693',
35
35
  FelicaIOS: 'felica',
36
+ NdefFormatable: 'NdefFormatable',
36
37
  };
37
38
 
38
39
  const DEFAULT_REGISTER_TAG_EVENT_OPTIONS = {
@@ -2,6 +2,7 @@ import {callNative} from './NativeNfcManager';
2
2
  import {NfcManagerBase} from './NfcManager';
3
3
  import {MifareClassicHandlerAndroid} from './NfcTech/MifareClassicHandlerAndroid';
4
4
  import {MifareUltralightHandlerAndroid} from './NfcTech/MifareUltralightHandlerAndroid';
5
+ import {NdefFormatableHandlerAndroid} from './NfcTech/NdefFormatableHandlerAndroid';
5
6
  import {handleNativeException, buildNfcExceptionAndroid} from './NfcError';
6
7
 
7
8
  const NfcAdapter = {
@@ -111,6 +112,16 @@ class NfcManagerAndroid extends NfcManagerBase {
111
112
  return this._mifareUltralightHandlerAndroid;
112
113
  }
113
114
 
115
+ // -------------------------------------
116
+ // (android) NfcTech.NdefFormatable API
117
+ // -------------------------------------
118
+ get ndefFormatableHandlerAndroid() {
119
+ if (!this._ndefFormatableHandlerAndroid) {
120
+ this._ndefFormatableHandlerAndroid = new NdefFormatableHandlerAndroid(this);
121
+ }
122
+ return this._ndefFormatableHandlerAndroid;
123
+ }
124
+
114
125
  // -------------------------------------
115
126
  // Android private
116
127
  // -------------------------------------
@@ -0,0 +1,16 @@
1
+ import {callNative} from '../NativeNfcManager';
2
+ import {handleNativeException} from '../NfcError';
3
+
4
+ class NdefFormatableHandlerAndroid {
5
+ async formatNdef(bytes, options={}) {
6
+ const defaultOptions = { readOnly: false };
7
+ return handleNativeException(
8
+ callNative('formatNdef', [
9
+ bytes,
10
+ {...defaultOptions, ...options}
11
+ ])
12
+ );
13
+ }
14
+ }
15
+
16
+ export {NdefFormatableHandlerAndroid};
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
-