react-native-nfc-manager 4.0.0-beta.1 → 4.0.0-beta.11

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 (109) 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 +397 -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 +134 -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} +23 -9
  81. package/package.json +39 -21
  82. package/react-native-nfc-manager.podspec +3 -2
  83. package/specs/NativeNfcManager.ts +18 -4
  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/specs/NativeNfcManager.d.ts +0 -6
  107. package/specs/NativeNfcManager.js +0 -3
  108. package/specs/NativeNfcManager.js.map +0 -1
  109. package/src/NativeNfcManager.js +0 -37
package/index.d.ts CHANGED
@@ -64,18 +64,48 @@ declare module 'react-native-nfc-manager' {
64
64
  type TNF = 0x0 | 0x01 | 0x02 | 0x03 | 0x04 | 0x05 | 0x06 | 0x07;
65
65
 
66
66
  export interface NdefRecord {
67
- id?: number[];
67
+ /** Android returns a hex string; iOS returns a byte array. */
68
+ id?: number[] | string;
68
69
  tnf: TNF;
69
70
  type: number[] | string;
70
- payload: any[];
71
+ payload: number[];
71
72
  }
72
73
 
73
74
  export interface TagEvent {
74
- ndefMessage: NdefRecord[];
75
+ /** Absent when no NDEF message is available; do not assume an empty array. */
76
+ ndefMessage?: NdefRecord[];
75
77
  maxSize?: number;
76
78
  type?: string;
77
79
  techTypes?: string[];
78
80
  id?: string;
81
+ /** Android NDEF tag metadata. */
82
+ isWritable?: boolean;
83
+ /** Android may return null when this capability cannot be determined. */
84
+ canMakeReadOnly?: boolean | null;
85
+ /** Android NFC-A discovery metadata; bytes are unsigned (0–255). */
86
+ atqa?: number[];
87
+ /** Android NFC-A discovery metadata. */
88
+ sak?: number;
89
+ /** Android NFC-V discovery metadata; unsigned byte (0–255). */
90
+ dsfid?: number;
91
+ /** Android NFC-V discovery metadata; unsigned byte (0–255). */
92
+ responseFlags?: number;
93
+ /** Android ISO-DEP discovery metadata; bytes are unsigned (0–255). */
94
+ hiLayerResponse?: number[];
95
+ /** iOS tag technology name. */
96
+ tech?: string;
97
+ /** iOS FeliCa metadata. */
98
+ idm?: string;
99
+ systemCode?: string;
100
+ /** iOS ISO 7816 metadata. */
101
+ initialSelectedAID?: string;
102
+ /** iOS ISO 7816 or Android ISO-DEP discovery metadata. */
103
+ historicalBytes?: number[];
104
+ /** iOS ISO 7816 metadata. */
105
+ applicationData?: number[];
106
+ /** iOS ISO 15693 metadata. */
107
+ icManufacturerCode?: number;
108
+ icSerialNumber?: number[];
79
109
  }
80
110
 
81
111
  export interface RegisterTagEventOpts {
@@ -87,12 +117,12 @@ declare module 'react-native-nfc-manager' {
87
117
  }
88
118
 
89
119
  export interface CancelTechReqOpts {
90
- throwOnError?: boolean = false;
91
- delayMsAndroid?: number = 1000;
120
+ throwOnError?: boolean;
121
+ delayMsAndroid?: number;
92
122
  }
93
123
 
94
124
  interface NdefHandler {
95
- writeNdefMessage: (bytes: number[] , options?: { reconnectAfterWrite: boolean }) => Promise<void>;
125
+ writeNdefMessage: (bytes: number[] , options?: { reconnectAfterWrite?: boolean }) => Promise<void>;
96
126
  getNdefMessage: () => Promise<TagEvent | null>;
97
127
  makeReadOnly: () => Promise<void>;
98
128
  getNdefStatus: () => Promise<{
@@ -115,38 +145,36 @@ declare module 'react-native-nfc-manager' {
115
145
  }
116
146
 
117
147
  interface MifareClassicHandlerAndroid {
118
- mifareClassicSectorToBlock: (sector: number) => Promise<ArrayLike<number>>;
119
- mifareClassicReadBlock: (
120
- block: ArrayLike<number>,
121
- ) => Promise<ArrayLike<number>>;
148
+ mifareClassicGetBlockCountInSector: (sector: number) => Promise<number>;
149
+ mifareClassicSectorToBlock: (sector: number) => Promise<number>;
150
+ mifareClassicReadBlock: (block: number) => Promise<number[]>;
151
+ mifareClassicReadSector: (sector: number) => Promise<number[]>;
122
152
  mifareClassicWriteBlock: (
123
- block: ArrayLike<number>,
124
- simpliArr: any[],
125
- ) => Promise<void>;
153
+ block: number,
154
+ data: number[],
155
+ ) => Promise<boolean>;
126
156
  mifareClassicIncrementBlock: (
127
- block: ArrayLike<number>,
128
- data: number,
129
- ) => Promise<void>;
157
+ block: number,
158
+ value: number,
159
+ ) => Promise<boolean>;
130
160
  mifareClassicDecrementBlock: (
131
- block: ArrayLike<number>,
132
- data: number,
133
- ) => Promise<void>;
134
- mifareClassicTransferBlock: (
135
- block: ArrayLike<number>,
136
- ) => Promise<void>;
161
+ block: number,
162
+ value: number,
163
+ ) => Promise<boolean>;
164
+ mifareClassicTransferBlock: (block: number) => Promise<boolean>;
137
165
  mifareClassicGetSectorCount: () => Promise<number>;
138
166
  mifareClassicAuthenticateA: (
139
167
  sector: number,
140
168
  keys: number[],
141
- ) => Promise<void>;
169
+ ) => Promise<boolean>;
142
170
  mifareClassicAuthenticateB: (
143
171
  sector: number,
144
172
  keys: number[],
145
- ) => Promise<void>;
173
+ ) => Promise<boolean>;
146
174
  }
147
175
 
148
176
  interface MifareUltralightHandlerAndroid {
149
- mifareUltralightReadPages: (offset: number) => Promise<ArrayLike<number>>;
177
+ mifareUltralightReadPages: (offset: number) => Promise<number[]>;
150
178
  mifareUltralightWritePage: (
151
179
  offset: number,
152
180
  data: number[],
@@ -154,13 +182,13 @@ declare module 'react-native-nfc-manager' {
154
182
  }
155
183
 
156
184
  interface NdefFormatableHandlerAndroid {
157
- formatNdef: (bytes: number[], options?: { readOnly: boolean }) => Promise<void>;
185
+ formatNdef: (bytes: number[], options?: {readOnly?: boolean}) => Promise<void>;
158
186
  }
159
187
 
160
188
  /** [iOS ONLY] */
161
189
  interface Iso15693HandlerIOS {
162
190
  getSystemInfo: (
163
- requestFloags: number,
191
+ requestFlags: number,
164
192
  ) => Promise<{
165
193
  dsfid: number;
166
194
  afi: number;
@@ -189,6 +217,8 @@ declare module 'react-native-nfc-manager' {
189
217
  lockDSFID: (params: {flags: number}) => Promise<void>;
190
218
  resetToReady: (params: {flags: number}) => Promise<void>;
191
219
  select: (params: {flags: number}) => Promise<void>;
220
+ stayQuiet: () => Promise<void>;
221
+ /** @deprecated Use stayQuiet instead. */
192
222
  stayQuite: () => Promise<void>;
193
223
  customCommand: (params: {
194
224
  flags: number;
@@ -223,15 +253,17 @@ declare module 'react-native-nfc-manager' {
223
253
  type OnDiscoverTag = (evt: TagEvent) => void;
224
254
  type OnSessionClosed = (error?: NfcError.NfcErrorBase) => void;
225
255
  type OnStateChanged = (evt: {state: string}) => void;
226
- type OnNfcEvents = OnDiscoverTag | OnSessionClosed | OnStateChanged;
227
256
 
228
257
  interface NfcManager {
229
258
  start(): Promise<void>;
230
- isSupported(): Promise<boolean>;
259
+ isSupported(tech?: NfcTech | ''): Promise<boolean>;
231
260
  isEnabled(): Promise<boolean>;
232
261
  registerTagEvent(options?: RegisterTagEventOpts): Promise<void>;
233
262
  unregisterTagEvent(): Promise<void>;
234
- setEventListener(name: NfcEvents, callback: OnNfcEvents | null): void;
263
+ setEventListener(name: NfcEvents.DiscoverTag, callback: OnDiscoverTag | null): void;
264
+ setEventListener(name: NfcEvents.DiscoverBackgroundTag, callback: OnDiscoverTag | null): void;
265
+ setEventListener(name: NfcEvents.SessionClosed, callback: OnSessionClosed | null): void;
266
+ setEventListener(name: NfcEvents.StateChanged, callback: OnStateChanged | null): void;
235
267
  requestTechnology(
236
268
  tech: NfcTech | NfcTech[],
237
269
  options?: RegisterTagEventOpts,
@@ -241,6 +273,17 @@ declare module 'react-native-nfc-manager' {
241
273
  getBackgroundTag: () => Promise<TagEvent | null>;
242
274
  clearBackgroundTag: () => Promise<void>;
243
275
  setAlertMessage: (alertMessage: string) => Promise<void>;
276
+ writeNdefMessage: (
277
+ bytes: number[],
278
+ options?: {reconnectAfterWrite?: boolean},
279
+ ) => Promise<void>;
280
+ getNdefMessage: () => Promise<TagEvent | null>;
281
+
282
+ readonly MIFARE_BLOCK_SIZE: number;
283
+ readonly MIFARE_ULTRALIGHT_PAGE_SIZE: number;
284
+ readonly MIFARE_ULTRALIGHT_TYPE: number;
285
+ readonly MIFARE_ULTRALIGHT_TYPE_C: number;
286
+ readonly MIFARE_ULTRALIGHT_TYPE_UNKNOWN: number;
244
287
 
245
288
  /**
246
289
  * common tech handler getters for both iOS / Android
@@ -253,12 +296,13 @@ declare module 'react-native-nfc-manager' {
253
296
  /**
254
297
  * iOS only
255
298
  */
299
+ /** @deprecated Use getBackgroundTag instead. */
256
300
  getBackgroundNdef: () => Promise<NdefRecord[] | null>;
257
301
  setAlertMessageIOS: (alertMessage: string) => Promise<void>;
258
302
  invalidateSessionIOS: () => Promise<void>;
259
- invalidateSessionWithErrorIOS: (errorMessage: string) => Promise<void>;
260
- isSessionAvailableIOS: () => Promise<Boolean>;
261
- isTagSessionAvailableIOS: () => Promise<Boolean>;
303
+ invalidateSessionWithErrorIOS: (errorMessage?: string) => Promise<void>;
304
+ isSessionAvailableIOS: () => Promise<boolean>;
305
+ isTagSessionAvailableIOS: () => Promise<boolean>;
262
306
  sendMifareCommandIOS: (bytes: number[]) => Promise<number[]>;
263
307
  sendFelicaCommandIOS: (bytes: number[]) => Promise<number[]>;
264
308
  sendCommandAPDUIOS: (
@@ -284,6 +328,9 @@ declare module 'react-native-nfc-manager' {
284
328
  transceive(bytes: number[]): Promise<number[]>;
285
329
  getMaxTransceiveLength(): Promise<number>;
286
330
  setTimeout(timeout: number): Promise<void>;
331
+ getTimeout(): Promise<number|void>;
332
+ /** @deprecated Android Beam is no longer supported. */
333
+ setNdefPushMessage(bytes: number[]): Promise<never>;
287
334
  connect: (techs: NfcTech[]) => Promise<void>;
288
335
  close: () => Promise<void>;
289
336
  mifareClassicHandlerAndroid: MifareClassicHandlerAndroid;
@@ -373,7 +420,7 @@ declare module 'react-native-nfc-manager' {
373
420
  encodePayload: (
374
421
  text: string,
375
422
  lang?: ISOLangCode,
376
- encoding?: any,
423
+ encoding?: unknown,
377
424
  ) => NdefRecord;
378
425
  decodePayload: (data: Uint8Array) => string;
379
426
  };
@@ -386,38 +433,55 @@ declare module 'react-native-nfc-manager' {
386
433
  decodePayload: (data: Uint8Array) => WifiSimpleCredentials;
387
434
  };
388
435
  util: {
389
- stringToBytes: (string: string) => any[];
390
- bytesToString: (bytes: any) => string;
391
- bytesToHexString: (bytes: any) => string;
392
- toHex: (i: any) => any;
393
- toPrintable: (i: any) => string;
436
+ stringToBytes: (string: string) => number[];
437
+ bytesToString: (bytes: string | number[]) => string;
438
+ bytesToHexString: (bytes: number[]) => string;
439
+ toHex: (i: number) => string;
440
+ toPrintable: (i: number) => string;
394
441
  };
395
442
  isType(record: NdefRecord, tnf: TNF, type: string): boolean;
396
443
  stringify(data: number[], separator: string): string;
397
444
  encodeMessage(records: NdefRecord[]): number[];
398
- decodeMessage(bytes: number[]): NdefRecord[];
399
- textRecord(text: string, lang?: ISOLangCode, encoding?: any): NdefRecord;
400
- uriRecord(uri: URI, id?: any): NdefRecord;
401
- wifiSimpleRecord(credentials: WifiSimpleCredentials, id?: any): NdefRecord;
445
+ decodeMessage(bytes: number[] | Uint8Array): NdefRecord[];
446
+ textRecord(text: string, lang?: ISOLangCode, encoding?: unknown): NdefRecord;
447
+ uriRecord(uri: URI, id?: string | number[]): NdefRecord;
448
+ wifiSimpleRecord(credentials: WifiSimpleCredentials, id?: string | number[]): NdefRecord;
402
449
  androidApplicationRecord(pkgName: string): NdefRecord;
403
450
  record(
404
451
  tnf: TNF,
405
452
  type: string,
406
- id: string | any[],
407
- payload: string | any[],
453
+ id: string | number[],
454
+ payload: string | number[],
408
455
  ): NdefRecord;
409
456
  };
410
457
 
411
458
  export const NfcErrorIOS: {
412
459
  errCodes: {
413
460
  unknown: -1;
461
+ unsupportedFeature: 1;
462
+ securityViolation: 2;
463
+ invalidParameter: 3;
464
+ invalidParameterLength: 4;
465
+ parameterOutOfBound: 5;
466
+ radioDisabled: 6;
467
+ tagConnectionLost: 100;
468
+ retryExceeded: 101;
469
+ tagResponseError: 102;
470
+ sessionInvalidated: 103;
471
+ tagNotConnected: 104;
472
+ packetTooLong: 105;
414
473
  userCancel: 200;
415
474
  timeout: 201;
416
475
  unexpected: 202;
417
476
  systemBusy: 203;
418
477
  firstNdefInvalid: 204;
478
+ invalidConfiguration: 300;
479
+ tagNotWritable: 400;
480
+ tagUpdateFailure: 401;
481
+ tagSizeTooSmall: 402;
482
+ zeroLengthMessage: 403;
419
483
  };
420
- parse(errorString: string): number;
484
+ parse(error: string | NfcError.UserCancel): number;
421
485
  }
422
486
 
423
487
  export namespace NfcError {
package/ios/NfcManager.h CHANGED
@@ -15,19 +15,15 @@
15
15
 
16
16
  #ifdef RCT_NEW_ARCH_ENABLED
17
17
  #import <NativeNfcManagerSpec/NativeNfcManagerSpec.h>
18
- // @interface NfcManager : NSObject <NativeNfcManagerSpec, NFCNDEFReaderSessionDelegate, NFCTagReaderSessionDelegate> {
19
- @interface NfcManager : RCTEventEmitter <NativeNfcManagerSpec, RCTBridgeModule, NFCNDEFReaderSessionDelegate, NFCTagReaderSessionDelegate> {
18
+ @interface NfcManager : NativeNfcManagerSpecBase <NativeNfcManagerSpec> {
20
19
 
21
20
  }
22
21
  #else
23
- @interface NfcManager : RCTEventEmitter <RCTBridgeModule, NFCNDEFReaderSessionDelegate, NFCTagReaderSessionDelegate> {
22
+ @interface NfcManager : RCTEventEmitter <RCTBridgeModule> {
24
23
 
25
24
  }
26
25
  #endif
27
26
 
28
- @property (strong, nonatomic) NFCNDEFReaderSession * _Nullable session;
29
- @property (strong, nonatomic) NFCTagReaderSession * _Nullable tagSession;
30
-
31
27
  + (BOOL)application:(nonnull UIApplication *)application
32
28
  continueUserActivity:(nonnull NSUserActivity *)userActivity
33
29
  restorationHandler:
@@ -38,8 +34,3 @@
38
34
  #endif
39
35
 
40
36
  @end
41
-
42
- extern NSString* _Nonnull getHexString(NSData * _Nonnull);
43
- extern NSString* _Nonnull getErrorMessage(NSError * _Nonnull);
44
- extern NSData * _Nonnull arrayToData(NSArray * _Nonnull);
45
- extern NSArray * _Nonnull dataToArray(NSData * _Nonnull);