accurascan_kyc 1.4.3 → 1.4.4
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/accurascan-kyc.podspec +19 -13
- package/android/build.gradle +7 -6
- package/android/src/main/java/com/accurascankyc/AccuraUploadOcrActivity.java +246 -0
- package/android/src/main/java/com/accurascankyc/AccurascanKycModule.java +87 -0
- package/ios/AccuraUploadViewController.swift +627 -0
- package/ios/AccurascanKyc.m +4 -0
- package/ios/AccurascanKyc.swift +93 -3
- package/lib/commonjs/index.js +1 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +2 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/index.tsx +2 -2
package/accurascan-kyc.podspec
CHANGED
|
@@ -13,30 +13,36 @@ Pod::Spec.new do |s|
|
|
|
13
13
|
|
|
14
14
|
s.platforms = { :ios => "12.0" }
|
|
15
15
|
s.ios.deployment_target = '12.0'
|
|
16
|
-
s.source
|
|
17
|
-
|
|
16
|
+
s.source = {
|
|
17
|
+
:git => "https://git.accurascan.com/mahdi/hybrid-react-kyc.git",
|
|
18
|
+
:tag => "#{s.version}"
|
|
19
|
+
}
|
|
18
20
|
|
|
19
21
|
s.source_files = "ios/**/*.{h,m,mm,swift}"
|
|
20
22
|
s.resources = "ios/**/*.{png,jpeg,jpg,xib,xcassets,imageset,gif,mp3,storyboard}"
|
|
21
23
|
|
|
22
24
|
s.dependency "React-Core"
|
|
23
25
|
s.static_framework = true
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
s.dependency "AccuraKYC_Sim","4.2.2"
|
|
27
|
+
|
|
28
|
+
# s.dependency "AccuraKYC","4.2.9"
|
|
29
|
+
|
|
26
30
|
#s.dependency 'AccuraKYC_Enc', '4.1.3'
|
|
27
31
|
# s.dependency "AccuraKYC","4.3.8.4"
|
|
28
32
|
# Don't install the dependencies when we run `pod install` in the old architecture.
|
|
29
33
|
if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
|
|
30
34
|
s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
|
|
36
|
+
s.pod_target_xcconfig = {
|
|
37
|
+
"HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
|
|
38
|
+
"OTHER_CPLUSPLUSFLAGS" => folly_compiler_flags,
|
|
39
|
+
"CLANG_CXX_LANGUAGE_STANDARD" => "c++20"
|
|
35
40
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
|
|
42
|
+
s.dependency "React-Codegen"
|
|
43
|
+
s.dependency "RCT-Folly"
|
|
44
|
+
s.dependency "RCTRequired"
|
|
45
|
+
s.dependency "RCTTypeSafety"
|
|
46
|
+
s.dependency "ReactCommon/turbomodule/core"
|
|
41
47
|
end
|
|
42
48
|
end
|
package/android/build.gradle
CHANGED
|
@@ -12,18 +12,19 @@ buildscript {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
apply plugin: "com.facebook.react"
|
|
16
|
+
apply plugin: "com.android.library"
|
|
17
|
+
|
|
15
18
|
def isNewArchitectureEnabled() {
|
|
16
19
|
return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
|
|
17
20
|
}
|
|
18
21
|
|
|
19
|
-
apply plugin: "com.android.library"
|
|
20
|
-
|
|
21
22
|
|
|
22
23
|
def appProject = rootProject.allprojects.find { it.plugins.hasPlugin('com.android.application') }
|
|
23
24
|
|
|
24
|
-
if (isNewArchitectureEnabled()) {
|
|
25
|
-
|
|
26
|
-
}
|
|
25
|
+
// if (isNewArchitectureEnabled()) {
|
|
26
|
+
// apply plugin: "com.facebook.react"
|
|
27
|
+
// }
|
|
27
28
|
|
|
28
29
|
def getExtOrDefault(name) {
|
|
29
30
|
return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["AccurascanKyc_" + name]
|
|
@@ -107,7 +108,7 @@ dependencies {
|
|
|
107
108
|
// Update OCR
|
|
108
109
|
implementation 'com.github.accurascan:AccuraOCR:6.2.6'
|
|
109
110
|
// FaceMatch has no issue
|
|
110
|
-
implementation 'com.github.accurascan:AccuraFaceMatch:4.0.
|
|
111
|
+
implementation 'com.github.accurascan:AccuraFaceMatch:4.0.1'
|
|
111
112
|
// Update Liveness
|
|
112
113
|
implementation 'com.github.accurascan:Liveness-Android:3.7.0'
|
|
113
114
|
implementation 'com.squareup.picasso:picasso:2.71828'
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
package com.accurascankyc;
|
|
2
|
+
|
|
3
|
+
import android.content.Context;
|
|
4
|
+
import android.graphics.Bitmap;
|
|
5
|
+
import android.util.Base64;
|
|
6
|
+
|
|
7
|
+
import com.accurascan.ocr.mrz.interfaces.OcrCallback;
|
|
8
|
+
import com.accurascan.ocr.mrz.model.OcrData;
|
|
9
|
+
import com.accurascan.ocr.mrz.util.AccuraLog;
|
|
10
|
+
import com.docrecog.scan.MRZDocumentType;
|
|
11
|
+
import com.docrecog.scan.RecogEngine;
|
|
12
|
+
import com.docrecog.scan.RecogType;
|
|
13
|
+
//import com.docrecog.scan.RecogResult;
|
|
14
|
+
|
|
15
|
+
import org.json.JSONArray;
|
|
16
|
+
import org.json.JSONObject;
|
|
17
|
+
|
|
18
|
+
import java.io.File;
|
|
19
|
+
import java.io.FileOutputStream;
|
|
20
|
+
import java.util.List;
|
|
21
|
+
import org.json.JSONException;
|
|
22
|
+
// import android.os.Handler;
|
|
23
|
+
// import android.os.Looper;
|
|
24
|
+
|
|
25
|
+
public class AccuraUploadOcrActivity implements OcrCallback {
|
|
26
|
+
|
|
27
|
+
private static final String TAG = AccuraUploadOcrActivity.class.getSimpleName();
|
|
28
|
+
private Context context;
|
|
29
|
+
private com.facebook.react.bridge.Callback callback;
|
|
30
|
+
private RecogEngine recogEngine;
|
|
31
|
+
// private boolean hasReturned = false;
|
|
32
|
+
// public static JSONObject accuraErrorConfg;
|
|
33
|
+
|
|
34
|
+
public void startOCR(
|
|
35
|
+
Context ctx,
|
|
36
|
+
int countryId,
|
|
37
|
+
int cardId,
|
|
38
|
+
int cardSide,
|
|
39
|
+
Bitmap bitmap,
|
|
40
|
+
com.facebook.react.bridge.Callback cb
|
|
41
|
+
) {
|
|
42
|
+
try {
|
|
43
|
+
this.context = ctx;
|
|
44
|
+
this.callback = cb;
|
|
45
|
+
|
|
46
|
+
recogEngine = new RecogEngine();
|
|
47
|
+
recogEngine.setDialog(false);
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
recogEngine.detectOCRFromCapturedImage(
|
|
51
|
+
ctx,
|
|
52
|
+
bitmap,
|
|
53
|
+
MRZDocumentType.NONE,
|
|
54
|
+
countryId,
|
|
55
|
+
cardId,
|
|
56
|
+
cardSide,
|
|
57
|
+
this
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
} catch (Exception e) {
|
|
61
|
+
sendOnce(e.getMessage(), null);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private void sendOnce(Object error, Object result) {
|
|
66
|
+
// if (hasReturned) return;
|
|
67
|
+
// hasReturned = true;
|
|
68
|
+
callback.invoke(error, result);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// =============================
|
|
72
|
+
// OcrCallback Methods
|
|
73
|
+
// =============================
|
|
74
|
+
|
|
75
|
+
@Override
|
|
76
|
+
public void onUpdateLayout(int width, int height) {
|
|
77
|
+
// Not needed in headless
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@Override
|
|
81
|
+
public void onProcessUpdate(int titleCode, String errorMessage, boolean isFlip) {
|
|
82
|
+
// Ignore processing updates in headless mode
|
|
83
|
+
// System.out.println("onProcessUpdate called");
|
|
84
|
+
// System.out.println("titleCode " + titleCode);
|
|
85
|
+
// System.out.println("errorMessage " + errorMessage);
|
|
86
|
+
// System.out.println("isFlip " + isFlip);
|
|
87
|
+
|
|
88
|
+
AccuraLog.loge(TAG, "onProcessUpdate :-> " + titleCode + "," + errorMessage + "," + isFlip);
|
|
89
|
+
|
|
90
|
+
if (errorMessage != null) {
|
|
91
|
+
String error = getErrorMessage(errorMessage);
|
|
92
|
+
sendOnce(error, null);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
@Override
|
|
97
|
+
public void onScannedComplete(Object result) {
|
|
98
|
+
System.out.println("onScannedComplete called ");
|
|
99
|
+
try {
|
|
100
|
+
|
|
101
|
+
if (!(result instanceof OcrData)) {
|
|
102
|
+
sendOnce("Invalid OCR Result", null);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
OcrData data = (OcrData) result;
|
|
107
|
+
|
|
108
|
+
JSONObject results = new JSONObject();
|
|
109
|
+
JSONObject frontResult = new JSONObject();
|
|
110
|
+
JSONObject backResult = new JSONObject();
|
|
111
|
+
|
|
112
|
+
String fileDir = context.getFilesDir().getAbsolutePath();
|
|
113
|
+
|
|
114
|
+
String frontUri = null;
|
|
115
|
+
String backUri = null;
|
|
116
|
+
String faceUri = null;
|
|
117
|
+
|
|
118
|
+
if (data.getFaceImage() != null) {
|
|
119
|
+
faceUri = AccurascanKycModule.getImageUri(data.getFaceImage(), "face", fileDir);
|
|
120
|
+
results.put("face", faceUri);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (data.getFrontimage() != null) {
|
|
124
|
+
frontUri = AccurascanKycModule.getImageUri(data.getFrontimage(), "front", fileDir);
|
|
125
|
+
results.put("front_img", frontUri);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (data.getBackimage() != null) {
|
|
129
|
+
backUri = AccurascanKycModule.getImageUri(data.getBackimage(), "back", fileDir);
|
|
130
|
+
results.put("back_img", backUri);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// FRONT DATA
|
|
134
|
+
OcrData.MapData frontData = data.getFrontData();
|
|
135
|
+
if (frontData != null) {
|
|
136
|
+
List<OcrData.MapData.ScannedData> list = frontData.getOcr_data();
|
|
137
|
+
for (OcrData.MapData.ScannedData scan : list) {
|
|
138
|
+
if (scan.getKey() != null) {
|
|
139
|
+
frontResult.put(scan.getKey(), scan.getKey_data());
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// BACK DATA
|
|
145
|
+
OcrData.MapData backData = data.getBackData();
|
|
146
|
+
if (backData != null) {
|
|
147
|
+
List<OcrData.MapData.ScannedData> list = backData.getOcr_data();
|
|
148
|
+
for (OcrData.MapData.ScannedData scan : list) {
|
|
149
|
+
if (scan.getKey() != null) {
|
|
150
|
+
backResult.put(scan.getKey(), scan.getKey_data());
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
results.put("front_data", frontResult);
|
|
156
|
+
results.put("back_data", backResult);
|
|
157
|
+
results.put("type", "OCR");
|
|
158
|
+
|
|
159
|
+
sendOnce(null, results.toString());
|
|
160
|
+
|
|
161
|
+
} catch (Exception e) {
|
|
162
|
+
sendOnce(e.getMessage(), null);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
private String getErrorMessage(String s) {
|
|
167
|
+
switch (s) {
|
|
168
|
+
case RecogEngine.ACCURA_ERROR_CODE_MOTION:
|
|
169
|
+
|
|
170
|
+
return "Keep Document Steady";
|
|
171
|
+
|
|
172
|
+
case RecogEngine.ACCURA_ERROR_CODE_DOCUMENT_IN_FRAME:
|
|
173
|
+
|
|
174
|
+
return "Keep document in frame";
|
|
175
|
+
|
|
176
|
+
case RecogEngine.ACCURA_ERROR_CODE_BRING_DOCUMENT_IN_FRAME:
|
|
177
|
+
|
|
178
|
+
return "Bring card near to frame.";
|
|
179
|
+
|
|
180
|
+
case RecogEngine.ACCURA_ERROR_CODE_PROCESSING:
|
|
181
|
+
|
|
182
|
+
return "Processing...";
|
|
183
|
+
|
|
184
|
+
case RecogEngine.ACCURA_ERROR_CODE_BLUR_DOCUMENT:
|
|
185
|
+
|
|
186
|
+
return "Blur detect in document";
|
|
187
|
+
|
|
188
|
+
case RecogEngine.ACCURA_ERROR_CODE_FACE_BLUR:
|
|
189
|
+
|
|
190
|
+
return "Blur detected over face";
|
|
191
|
+
|
|
192
|
+
case RecogEngine.ACCURA_ERROR_CODE_GLARE_DOCUMENT:
|
|
193
|
+
|
|
194
|
+
return "Glare detect in document";
|
|
195
|
+
|
|
196
|
+
case RecogEngine.ACCURA_ERROR_CODE_HOLOGRAM:
|
|
197
|
+
|
|
198
|
+
return "Hologram Detected";
|
|
199
|
+
|
|
200
|
+
case RecogEngine.ACCURA_ERROR_CODE_DARK_DOCUMENT:
|
|
201
|
+
|
|
202
|
+
return "Low lighting detected";
|
|
203
|
+
|
|
204
|
+
case RecogEngine.ACCURA_ERROR_CODE_PHOTO_COPY_DOCUMENT:
|
|
205
|
+
|
|
206
|
+
return "Can not accept Photo Copy Document";
|
|
207
|
+
|
|
208
|
+
case RecogEngine.ACCURA_ERROR_CODE_FACE:
|
|
209
|
+
|
|
210
|
+
return "Face not detected";
|
|
211
|
+
|
|
212
|
+
case RecogEngine.ACCURA_ERROR_CODE_MRZ:
|
|
213
|
+
|
|
214
|
+
return "MRZ not detected";
|
|
215
|
+
|
|
216
|
+
case RecogEngine.ACCURA_ERROR_CODE_PASSPORT_MRZ:
|
|
217
|
+
|
|
218
|
+
return "Passport MRZ not detected";
|
|
219
|
+
|
|
220
|
+
case RecogEngine.ACCURA_ERROR_CODE_ID_MRZ:
|
|
221
|
+
|
|
222
|
+
return "ID card MRZ not detected";
|
|
223
|
+
|
|
224
|
+
case RecogEngine.ACCURA_ERROR_CODE_VISA_MRZ:
|
|
225
|
+
|
|
226
|
+
return "Visa MRZ not detected";
|
|
227
|
+
|
|
228
|
+
case RecogEngine.ACCURA_ERROR_CODE_WRONG_SIDE:
|
|
229
|
+
|
|
230
|
+
return "Scanning wrong side of document";
|
|
231
|
+
|
|
232
|
+
case RecogEngine.ACCURA_ERROR_CODE_UPSIDE_DOWN_SIDE:
|
|
233
|
+
|
|
234
|
+
return "Document is upside down. Place it properly";
|
|
235
|
+
|
|
236
|
+
default:
|
|
237
|
+
return s;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
@Override
|
|
242
|
+
public void onError(String errorMessage) {
|
|
243
|
+
// System.out.println("onError called ");
|
|
244
|
+
sendOnce(errorMessage, null);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
@@ -30,7 +30,9 @@ import android.content.pm.PackageManager;
|
|
|
30
30
|
import android.graphics.Bitmap;
|
|
31
31
|
import android.graphics.BitmapFactory;
|
|
32
32
|
import android.net.Uri;
|
|
33
|
+
import android.provider.MediaStore;
|
|
33
34
|
import android.util.Base64;
|
|
35
|
+
import android.util.Log;
|
|
34
36
|
|
|
35
37
|
import org.json.JSONArray;
|
|
36
38
|
import org.json.JSONException;
|
|
@@ -681,6 +683,91 @@ public class AccurascanKycModule extends ReactContextBaseJavaModule {
|
|
|
681
683
|
return true;
|
|
682
684
|
};
|
|
683
685
|
|
|
686
|
+
@ReactMethod
|
|
687
|
+
public void startUploadOcrWithCard(ReadableArray argsNew, Callback callbackContext) {
|
|
688
|
+
|
|
689
|
+
// System.out.println("======== startUploadOcrWithCard CALLED ========");
|
|
690
|
+
|
|
691
|
+
try {
|
|
692
|
+
|
|
693
|
+
if (argsNew == null) {
|
|
694
|
+
callbackContext.invoke("Arguments are null", null);
|
|
695
|
+
return;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
JSONArray args = ReactNativeJSON.convertArrayToJson(argsNew);
|
|
699
|
+
// System.out.println("Converted args: " + args.toString());
|
|
700
|
+
|
|
701
|
+
int countryId = args.getInt(0);
|
|
702
|
+
int cardId = args.getInt(1);
|
|
703
|
+
String cardName = args.getString(2);
|
|
704
|
+
int cardType = args.getInt(3);
|
|
705
|
+
String imagePath = args.getString(4);
|
|
706
|
+
String side = args.getString(5);
|
|
707
|
+
|
|
708
|
+
// System.out.println("countryId: " + countryId);
|
|
709
|
+
// System.out.println("cardId: " + cardId);
|
|
710
|
+
// System.out.println("cardName: " + cardName);
|
|
711
|
+
// System.out.println("cardType: " + cardType);
|
|
712
|
+
// System.out.println("imagePath (raw): " + imagePath);
|
|
713
|
+
// System.out.println("side: " + side);
|
|
714
|
+
|
|
715
|
+
int cardSide = side.equalsIgnoreCase("back") ? 1 : 0;
|
|
716
|
+
// System.out.println("cardSide int: " + cardSide);
|
|
717
|
+
|
|
718
|
+
Bitmap bitmap;
|
|
719
|
+
|
|
720
|
+
if (imagePath.startsWith("content://")) {
|
|
721
|
+
|
|
722
|
+
// System.out.println("Loading image from content URI");
|
|
723
|
+
|
|
724
|
+
bitmap = MediaStore.Images.Media.getBitmap(
|
|
725
|
+
getReactApplicationContext().getContentResolver(),
|
|
726
|
+
Uri.parse(imagePath)
|
|
727
|
+
);
|
|
728
|
+
|
|
729
|
+
} else {
|
|
730
|
+
|
|
731
|
+
String cleanPath = imagePath.replace("file://", "");
|
|
732
|
+
// System.out.println("Loading image from file path: " + cleanPath);
|
|
733
|
+
|
|
734
|
+
File file = new File(cleanPath);
|
|
735
|
+
// System.out.println("File exists? " + file.exists());
|
|
736
|
+
|
|
737
|
+
bitmap = BitmapFactory.decodeFile(cleanPath);
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
if (bitmap == null) {
|
|
741
|
+
// System.out.println("ERROR: Bitmap decoding failed");
|
|
742
|
+
callbackContext.invoke("Bitmap decoding failed", null);
|
|
743
|
+
return;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
// System.out.println("Bitmap loaded SUCCESSFULLY");
|
|
747
|
+
// System.out.println("Bitmap width: " + bitmap.getWidth());
|
|
748
|
+
// System.out.println("Bitmap height: " + bitmap.getHeight());
|
|
749
|
+
|
|
750
|
+
// System.out.println("Starting OCR now...");
|
|
751
|
+
|
|
752
|
+
AccuraUploadOcrActivity processor = new AccuraUploadOcrActivity();
|
|
753
|
+
|
|
754
|
+
processor.startOCR(
|
|
755
|
+
getReactApplicationContext(),
|
|
756
|
+
countryId,
|
|
757
|
+
cardId,
|
|
758
|
+
cardSide,
|
|
759
|
+
bitmap,
|
|
760
|
+
callbackContext
|
|
761
|
+
);
|
|
762
|
+
|
|
763
|
+
} catch (Exception e) {
|
|
764
|
+
|
|
765
|
+
// System.out.println("EXCEPTION OCCURRED:");
|
|
766
|
+
e.printStackTrace();
|
|
767
|
+
|
|
768
|
+
callbackContext.invoke(e.getMessage(), null);
|
|
769
|
+
}
|
|
770
|
+
}
|
|
684
771
|
|
|
685
772
|
|
|
686
773
|
@ReactMethod
|
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import UIKit
|
|
3
|
+
import AccuraOCR
|
|
4
|
+
|
|
5
|
+
class AccuraUploadViewController: UIViewController, VideoCameraWrapperDelegate {
|
|
6
|
+
var wrapper: AccuraCameraWrapper?
|
|
7
|
+
// var callBack: RCTResponseSenderBlock? = nil
|
|
8
|
+
var cardImage: UIImage?
|
|
9
|
+
var cardSide: String = "front"
|
|
10
|
+
// result data var
|
|
11
|
+
var dictFaceDataFront: NSMutableDictionary = [:]
|
|
12
|
+
var dictFaceDataBack: NSMutableDictionary = [:]
|
|
13
|
+
var dictOCRTypeData:NSMutableDictionary = [:]
|
|
14
|
+
var dictSecuretyData : NSMutableDictionary = [:]
|
|
15
|
+
var arrFrontResultKey : [String] = []
|
|
16
|
+
var arrFrontResultValue : [String] = []
|
|
17
|
+
var shareScanningListing: NSMutableDictionary = [:]
|
|
18
|
+
var arrBackResultKey : [String] = []
|
|
19
|
+
var arrBackResultValue : [String] = []
|
|
20
|
+
// recog_msg var
|
|
21
|
+
var accuraErrorCode:NSDictionary = [:]
|
|
22
|
+
var accuraTitleMsg:NSDictionary = [:]
|
|
23
|
+
|
|
24
|
+
private var callback: RCTResponseSenderBlock?
|
|
25
|
+
// private var hasReturnedResult = false
|
|
26
|
+
// override func viewDidLoad() {
|
|
27
|
+
// super.viewDidLoad()
|
|
28
|
+
// // view.backgroundColor = .black
|
|
29
|
+
// }
|
|
30
|
+
|
|
31
|
+
// MARK: - Start OCR
|
|
32
|
+
// MARK: - OCR
|
|
33
|
+
func startOCR(countryId: Int32,
|
|
34
|
+
cardId: Int32,
|
|
35
|
+
cardName: String,
|
|
36
|
+
cardType: Int32,
|
|
37
|
+
image: UIImage,
|
|
38
|
+
side: String,
|
|
39
|
+
callback: @escaping RCTResponseSenderBlock) {
|
|
40
|
+
|
|
41
|
+
// Reset old session
|
|
42
|
+
self.wrapper = nil
|
|
43
|
+
self.callback = nil
|
|
44
|
+
self.shareScanningListing.removeAllObjects()
|
|
45
|
+
self.dictFaceDataFront.removeAllObjects()
|
|
46
|
+
self.dictFaceDataBack.removeAllObjects()
|
|
47
|
+
self.dictSecuretyData.removeAllObjects()
|
|
48
|
+
|
|
49
|
+
// assign new callback
|
|
50
|
+
self.callback = callback
|
|
51
|
+
|
|
52
|
+
// self.hasReturnedResult = false
|
|
53
|
+
|
|
54
|
+
wrapper = AccuraCameraWrapper(
|
|
55
|
+
delegate: self,
|
|
56
|
+
cardId: cardId,
|
|
57
|
+
countryID: countryId,
|
|
58
|
+
isScanOCR: true,
|
|
59
|
+
andcardName: cardName,
|
|
60
|
+
andcardType: cardType
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
if side.lowercased() == "front" {
|
|
64
|
+
wrapper?.getOCRDetails(image, isBack: .Front)
|
|
65
|
+
} else {
|
|
66
|
+
wrapper?.getOCRDetails(image, isBack: .Back)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// MARK: - MRZ
|
|
71
|
+
func startMRZ(docType: String,
|
|
72
|
+
mrzType: Int32,
|
|
73
|
+
image: UIImage,
|
|
74
|
+
detectFace: Bool,
|
|
75
|
+
callback: @escaping RCTResponseSenderBlock) {
|
|
76
|
+
|
|
77
|
+
// Reset session
|
|
78
|
+
self.wrapper = nil
|
|
79
|
+
self.callback = nil
|
|
80
|
+
self.shareScanningListing.removeAllObjects()
|
|
81
|
+
self.dictFaceDataFront.removeAllObjects()
|
|
82
|
+
self.dictFaceDataBack.removeAllObjects()
|
|
83
|
+
self.dictSecuretyData.removeAllObjects()
|
|
84
|
+
|
|
85
|
+
self.callback = callback
|
|
86
|
+
|
|
87
|
+
wrapper = AccuraCameraWrapper(
|
|
88
|
+
delegate: self,
|
|
89
|
+
cardId: 0,
|
|
90
|
+
countryID: 0,
|
|
91
|
+
isScanOCR: false,
|
|
92
|
+
andcardName: docType,
|
|
93
|
+
andcardType: mrzType
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
wrapper?.getMRZDetails(image, isFace: detectFace)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// MARK: - Safe Callback
|
|
100
|
+
|
|
101
|
+
private func sendResultOnce(_ error: Any?, _ response: Any?) {
|
|
102
|
+
// guard !hasReturnedResult else { return }
|
|
103
|
+
// hasReturnedResult = true
|
|
104
|
+
|
|
105
|
+
callback?([error ?? NSNull(), response ?? NSNull()])
|
|
106
|
+
callback = nil
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ocr response
|
|
110
|
+
func resultData(_ resultmodel: ResultModel!) {
|
|
111
|
+
|
|
112
|
+
var results:[String: Any] = [:]
|
|
113
|
+
var frontData:[String: Any] = [:]
|
|
114
|
+
var backData:[String: Any] = [:]
|
|
115
|
+
var mrzData:[String: Any] = [:]
|
|
116
|
+
if let faceUri = AccurascanKyc.getImageUri(img: resultmodel.faceImage, name: nil) {
|
|
117
|
+
results["face"] = faceUri
|
|
118
|
+
}
|
|
119
|
+
if let frontUri = AccurascanKyc.getImageUri(img: resultmodel.frontSideImage, name: nil) {
|
|
120
|
+
results["front_img"] = frontUri
|
|
121
|
+
}
|
|
122
|
+
if let backUri = AccurascanKyc.getImageUri(img: resultmodel.backSideImage, name: nil) {
|
|
123
|
+
results["back_img"] = backUri
|
|
124
|
+
}
|
|
125
|
+
self.dictFaceDataFront = resultmodel.ocrFaceFrontData
|
|
126
|
+
for data in dictFaceDataFront {
|
|
127
|
+
if let k = data.key as? String {
|
|
128
|
+
if k == "Signature" {
|
|
129
|
+
if let base64img = data.value as? String {
|
|
130
|
+
let dataDecoded : Data = Data(base64Encoded: base64img, options: .ignoreUnknownCharacters)!
|
|
131
|
+
let decodedimage:UIImage = UIImage(data: dataDecoded)!
|
|
132
|
+
if let sigUri = AccurascanKyc.getImageUri(img: decodedimage, name: nil) {
|
|
133
|
+
frontData["signature"] = sigUri
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
} else {
|
|
137
|
+
frontData[k] = data.value as? String ?? data.value as? Int ?? ""
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
self.dictFaceDataBack = resultmodel.ocrFaceBackData
|
|
144
|
+
for data in dictFaceDataBack {
|
|
145
|
+
if let k = data.key as? String {
|
|
146
|
+
if k == "Signature" {
|
|
147
|
+
if let base64img = data.value as? String {
|
|
148
|
+
let dataDecoded : Data = Data(base64Encoded: base64img, options: .ignoreUnknownCharacters)!
|
|
149
|
+
let decodedimage:UIImage = UIImage(data: dataDecoded)!
|
|
150
|
+
if let sigUri = AccurascanKyc.getImageUri(img: decodedimage, name: nil) {
|
|
151
|
+
backData["signature"] = sigUri
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
} else {
|
|
155
|
+
backData[k] = data.value as? String ?? data.value as? Int ?? ""
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
self.dictSecuretyData = resultmodel.ocrSecurityData
|
|
162
|
+
for data in dictSecuretyData {
|
|
163
|
+
frontData[data.key as! String] = data.value as? String ?? data.value as? Int ?? ""
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
self.arrFrontResultKey = resultmodel.arrayocrFrontSideDataKey as! [String]
|
|
167
|
+
self.arrFrontResultValue = resultmodel.arrayocrFrontSideDataValue as! [String]
|
|
168
|
+
for i in arrFrontResultKey.indices {
|
|
169
|
+
if arrFrontResultKey[i] != "MRZ" {
|
|
170
|
+
frontData[arrFrontResultKey[i]] = arrFrontResultValue[i]
|
|
171
|
+
} else {
|
|
172
|
+
self.shareScanningListing = resultmodel.shareScanningMRZListing
|
|
173
|
+
let kK = shareScanningListing.allKeys
|
|
174
|
+
let vV = shareScanningListing.allValues
|
|
175
|
+
let dD : NSMutableDictionary = [:]
|
|
176
|
+
for i in (0 ..< kK.count) {
|
|
177
|
+
if (kK[i] as! String != "fontImageRotation") && (kK[i] as! String != "backImageRotation"){
|
|
178
|
+
if kK[i] as! String == "birth" || kK[i] as! String == "expirationDate" || kK[i] as! String == "issuedate" || kK[i] as! String == "issueDate"{
|
|
179
|
+
let daTE = date(toFormatedDate: (vV[i] as! String))
|
|
180
|
+
dD.setValue(daTE, forKey: (kK[i] as? String)!)
|
|
181
|
+
}else{
|
|
182
|
+
dD.setValue(vV[i] as? String, forKey: (kK[i] as? String)!)
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
mrzData = getMRZKeyValue()
|
|
187
|
+
// mrzData = dD as! [String : Any] //self.getMRZKeyValue()
|
|
188
|
+
// mrzData["Other Id2"] = shareScanningListing["personalNumber2"]
|
|
189
|
+
// mrzData["Document Type"] = shareScanningListing["passportType"]
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
self.arrBackResultKey = resultmodel.arrayocrBackSideDataKey as! [String]
|
|
194
|
+
self.arrBackResultValue = resultmodel.arrayocrBackSideDataValue as! [String]
|
|
195
|
+
for i in arrBackResultKey.indices {
|
|
196
|
+
if arrBackResultKey[i] != "MRZ" {
|
|
197
|
+
backData[arrBackResultKey[i]] = arrBackResultValue[i]
|
|
198
|
+
} else {
|
|
199
|
+
self.shareScanningListing = resultmodel.shareScanningMRZListing
|
|
200
|
+
let kK = shareScanningListing.allKeys
|
|
201
|
+
let vV = shareScanningListing.allValues
|
|
202
|
+
let dD : NSMutableDictionary = [:]
|
|
203
|
+
for i in (0 ..< kK.count) {
|
|
204
|
+
if (kK[i] as! String != "fontImageRotation") && (kK[i] as! String != "backImageRotation"){
|
|
205
|
+
if kK[i] as! String == "birth" || kK[i] as! String == "expirationDate" || kK[i] as! String == "issuedate" || kK[i] as! String == "issueDate"{
|
|
206
|
+
let daTE = date(toFormatedDate: (vV[i] as! String))
|
|
207
|
+
dD.setValue(daTE, forKey: (kK[i] as? String)!)
|
|
208
|
+
}else{
|
|
209
|
+
dD.setValue(vV[i] as? String, forKey: (kK[i] as? String)!)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
mrzData = getMRZKeyValue()
|
|
215
|
+
// mrzData = dD as! [String : Any] //self.getMRZKeyValue()
|
|
216
|
+
// mrzData["Other Id2"] = shareScanningListing["personalNumber2"]
|
|
217
|
+
// mrzData["Document Type"] = shareScanningListing["passportType"]
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
results["front_data"] = frontData
|
|
221
|
+
results["back_data"] = backData
|
|
222
|
+
results["mrz_data"] = mrzData
|
|
223
|
+
results["type"] = "OCR"
|
|
224
|
+
|
|
225
|
+
// callBack!([NSNull(),AccurascanKyc.convertJSONString(results:results)])
|
|
226
|
+
// self.dismiss(animated: true)
|
|
227
|
+
let jsonString = AccurascanKyc.convertJSONString(results: results)
|
|
228
|
+
sendResultOnce(NSNull(), jsonString)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
func reco_msg(_ message: String!) {
|
|
232
|
+
var msg = String();
|
|
233
|
+
if(message == ACCURA_ERROR_CODE_MOTION) {
|
|
234
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_MOTION"] != nil{
|
|
235
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_MOTION"] as! String
|
|
236
|
+
|
|
237
|
+
}else{
|
|
238
|
+
msg = "Keep Document Steady";
|
|
239
|
+
}
|
|
240
|
+
} else if(message == ACCURA_ERROR_CODE_DOCUMENT_IN_FRAME) {
|
|
241
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_DOCUMENT_IN_FRAME"] != nil{
|
|
242
|
+
|
|
243
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_DOCUMENT_IN_FRAME"] as! String
|
|
244
|
+
|
|
245
|
+
}else{
|
|
246
|
+
msg = "Keep document in frame";
|
|
247
|
+
}
|
|
248
|
+
} else if(message == ACCURA_ERROR_CODE_BRING_DOCUMENT_IN_FRAME) {
|
|
249
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_BRING_DOCUMENT_IN_FRAME"] != nil{
|
|
250
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_BRING_DOCUMENT_IN_FRAME"] as! String
|
|
251
|
+
|
|
252
|
+
}else{
|
|
253
|
+
msg = "Bring card near to frame";
|
|
254
|
+
}
|
|
255
|
+
} else if(message == ACCURA_ERROR_CODE_PROCESSING) {
|
|
256
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_PROCESSING"] != nil{
|
|
257
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_PROCESSING"] as! String
|
|
258
|
+
|
|
259
|
+
}else{
|
|
260
|
+
msg = "Processing...";
|
|
261
|
+
}
|
|
262
|
+
} else if(message == ACCURA_ERROR_CODE_BLUR_DOCUMENT) {
|
|
263
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_BLUR_DOCUMENT"] != nil{
|
|
264
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_BLUR_DOCUMENT"] as! String
|
|
265
|
+
|
|
266
|
+
}else{
|
|
267
|
+
msg = "Blur detect in document";
|
|
268
|
+
}
|
|
269
|
+
} else if(message == ACCURA_ERROR_CODE_FACE_BLUR) {
|
|
270
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_FACE_BLUR"] != nil{
|
|
271
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_FACE_BLUR"] as! String
|
|
272
|
+
|
|
273
|
+
}else{
|
|
274
|
+
msg = "Blur detected over face";
|
|
275
|
+
}
|
|
276
|
+
} else if(message == ACCURA_ERROR_CODE_GLARE_DOCUMENT) {
|
|
277
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_GLARE_DOCUMENT"] != nil{
|
|
278
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_GLARE_DOCUMENT"] as! String
|
|
279
|
+
|
|
280
|
+
}else{
|
|
281
|
+
msg = "Glare detect in document";
|
|
282
|
+
}
|
|
283
|
+
} else if(message == ACCURA_ERROR_CODE_HOLOGRAM) {
|
|
284
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_HOLOGRAM"] != nil{
|
|
285
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_HOLOGRAM"] as! String
|
|
286
|
+
|
|
287
|
+
}else{
|
|
288
|
+
msg = "Hologram Detected";
|
|
289
|
+
}
|
|
290
|
+
} else if(message == ACCURA_ERROR_CODE_DARK_DOCUMENT) {
|
|
291
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_DARK_DOCUMENT"] != nil{
|
|
292
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_DARK_DOCUMENT"] as! String
|
|
293
|
+
|
|
294
|
+
}else{
|
|
295
|
+
msg = "Low lighting detected";
|
|
296
|
+
}
|
|
297
|
+
} else if(message == ACCURA_ERROR_CODE_PHOTO_COPY_DOCUMENT) {
|
|
298
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_PHOTO_COPY_DOCUMENT"] != nil{
|
|
299
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_PHOTO_COPY_DOCUMENT"] as! String
|
|
300
|
+
|
|
301
|
+
}else{
|
|
302
|
+
msg = "Can not accept Photo Copy Document";
|
|
303
|
+
}
|
|
304
|
+
} else if(message == ACCURA_ERROR_CODE_FACE) {
|
|
305
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_FACE"] != nil{
|
|
306
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_FACE"] as! String
|
|
307
|
+
|
|
308
|
+
}else{
|
|
309
|
+
msg = "Face not detected";
|
|
310
|
+
}
|
|
311
|
+
} else if(message == ACCURA_ERROR_CODE_MRZ) {
|
|
312
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_MRZ"] != nil{
|
|
313
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_MRZ"] as! String
|
|
314
|
+
|
|
315
|
+
}else{
|
|
316
|
+
msg = "MRZ not detected";
|
|
317
|
+
}
|
|
318
|
+
} else if(message == ACCURA_ERROR_CODE_PASSPORT_MRZ) {
|
|
319
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_PASSPORT_MRZ"] != nil{
|
|
320
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_PASSPORT_MRZ"] as! String
|
|
321
|
+
|
|
322
|
+
}else{
|
|
323
|
+
msg = "Passport MRZ not detected";
|
|
324
|
+
}
|
|
325
|
+
} else if(message == ACCURA_ERROR_CODE_ID_MRZ) {
|
|
326
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_ID_MRZ"] != nil{
|
|
327
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_ID_MRZ"] as! String
|
|
328
|
+
|
|
329
|
+
}else{
|
|
330
|
+
msg = "ID MRZ not detected"
|
|
331
|
+
}
|
|
332
|
+
} else if(message == ACCURA_ERROR_CODE_VISA_MRZ) {
|
|
333
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_VISA_MRZ"] != nil{
|
|
334
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_VISA_MRZ"] as! String
|
|
335
|
+
|
|
336
|
+
}else{
|
|
337
|
+
msg = "Visa MRZ not detected"
|
|
338
|
+
}
|
|
339
|
+
}else if(message == ACCURA_ERROR_CODE_UPSIDE_DOWN_SIDE) {
|
|
340
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_UPSIDE_DOWN_SIDE"] != nil{
|
|
341
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_UPSIDE_DOWN_SIDE"] as! String
|
|
342
|
+
|
|
343
|
+
}else{
|
|
344
|
+
msg = "Document is upside down. Place it properly"
|
|
345
|
+
}
|
|
346
|
+
}else if(message == ACCURA_ERROR_CODE_WRONG_SIDE) {
|
|
347
|
+
if accuraErrorCode["ACCURA_ERROR_CODE_WRONG_SIDE"] != nil{
|
|
348
|
+
msg = accuraErrorCode["ACCURA_ERROR_CODE_WRONG_SIDE"] as! String
|
|
349
|
+
|
|
350
|
+
}else{
|
|
351
|
+
msg = "Scanning wrong side of Document"
|
|
352
|
+
}
|
|
353
|
+
}else {
|
|
354
|
+
msg = message;
|
|
355
|
+
}
|
|
356
|
+
// lblOCRMsg.text = msg
|
|
357
|
+
sendResultOnce(msg, NSNull())
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
func recognizeFailed(_ message: String!) {
|
|
361
|
+
// print("MRZ Failed:", message ?? "")
|
|
362
|
+
let alert = UIAlertController(title: "AccuraSDK", message: message, preferredStyle: .alert)
|
|
363
|
+
let yesButton = UIAlertAction(title: "OK", style: .default) { _ in
|
|
364
|
+
}
|
|
365
|
+
alert.addAction(yesButton)
|
|
366
|
+
self.present(alert, animated: true, completion: nil)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
func recognizeSucceed(_ scanedInfo: NSMutableDictionary!, recType: RecType, bRecDone: Bool, bFaceReplace: Bool, bMrzFirst: Bool, photoImage: UIImage, docFrontImage: UIImage!, docbackImage: UIImage!) {
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
var results:[String: Any] = [:]
|
|
373
|
+
var mrzData:[String: String] = [:]
|
|
374
|
+
// print("----------- MRZ recognizeSucceed -----------")
|
|
375
|
+
// print("bMrzFirst:", bMrzFirst)
|
|
376
|
+
// print("scanedInfo:")
|
|
377
|
+
// if let info = scanedInfo {
|
|
378
|
+
// print(info)
|
|
379
|
+
// } else {
|
|
380
|
+
// print("scanedInfo = nil")
|
|
381
|
+
// }
|
|
382
|
+
//
|
|
383
|
+
// print("recType:", recType.rawValue)
|
|
384
|
+
//
|
|
385
|
+
// print("bRecDone:", bRecDone)
|
|
386
|
+
// print("bFaceReplace:", bFaceReplace)
|
|
387
|
+
//
|
|
388
|
+
//
|
|
389
|
+
// if let photo = photoImage.cgImage {
|
|
390
|
+
// print("photoImage size:", photo.width, "x", photo.height)
|
|
391
|
+
// } else {
|
|
392
|
+
// print("photoImage exists but no CGImage")
|
|
393
|
+
// }
|
|
394
|
+
//
|
|
395
|
+
// if let front = docFrontImage {
|
|
396
|
+
// print("docFrontImage size:", front.size)
|
|
397
|
+
// } else {
|
|
398
|
+
// print("docFrontImage = nil")
|
|
399
|
+
// }
|
|
400
|
+
//
|
|
401
|
+
// if let back = docbackImage {
|
|
402
|
+
// print("docBackImage size:", back.size)
|
|
403
|
+
// } else {
|
|
404
|
+
// print("docBackImage = nil")
|
|
405
|
+
// }
|
|
406
|
+
//
|
|
407
|
+
// print("---------------------------------------------")
|
|
408
|
+
//
|
|
409
|
+
//
|
|
410
|
+
|
|
411
|
+
if let frontUri = AccurascanKyc.getImageUri(img: docFrontImage, name: nil) {
|
|
412
|
+
results["front_img"] = frontUri
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
if let backUri = AccurascanKyc.getImageUri(img: docbackImage, name: nil) {
|
|
416
|
+
results["back_img"] = backUri
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
if let faceUri = AccurascanKyc.getImageUri(img: photoImage, name: nil) {
|
|
420
|
+
results["face"] = faceUri
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// MRZ values
|
|
424
|
+
self.shareScanningListing = scanedInfo
|
|
425
|
+
mrzData = getMRZKeyValue()
|
|
426
|
+
|
|
427
|
+
results["mrz_data"] = mrzData
|
|
428
|
+
results["type"] = "MRZ"
|
|
429
|
+
|
|
430
|
+
let jsonString = AccurascanKyc.convertJSONString(results: results)
|
|
431
|
+
|
|
432
|
+
sendResultOnce(NSNull(), jsonString)
|
|
433
|
+
// }
|
|
434
|
+
}
|
|
435
|
+
// MARK: - Helper function
|
|
436
|
+
func getMRZKeyValue() -> [String: String] {
|
|
437
|
+
var mrzData:[String: String] = [:]
|
|
438
|
+
// print("\(shareScanningListing)")
|
|
439
|
+
if let line = shareScanningListing["lines"] as? String {
|
|
440
|
+
mrzData["MRZ"] = line
|
|
441
|
+
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
if let docLivenessFront = shareScanningListing["Document Liveness"] as? String {
|
|
445
|
+
mrzData["Document Liveness Front"] = docLivenessFront
|
|
446
|
+
}
|
|
447
|
+
if let docLivenessBack = shareScanningListing["Document Back Liveness"] as? String {
|
|
448
|
+
mrzData["Document Liveness Back"] = docLivenessBack
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
if let givenname = shareScanningListing["givenname"] as? String {
|
|
452
|
+
mrzData["First Name"] = givenname
|
|
453
|
+
} else if let givenname = shareScanningListing["givenNames"] as? String {
|
|
454
|
+
mrzData["First Name"] = givenname
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
if let surname = shareScanningListing["surname"] as? String {
|
|
458
|
+
mrzData["Last Name"] = surname
|
|
459
|
+
|
|
460
|
+
} else if let surname = shareScanningListing["surName"] as? String {
|
|
461
|
+
mrzData["Last Name"] = surname
|
|
462
|
+
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
if let docnumber = shareScanningListing["passportNumber"] as? String {
|
|
466
|
+
mrzData["Document No."] = docnumber
|
|
467
|
+
|
|
468
|
+
} else if let docnumber = shareScanningListing["docNumber"] as? String {
|
|
469
|
+
mrzData["Document No."] = docnumber
|
|
470
|
+
|
|
471
|
+
}
|
|
472
|
+
if let documentType = shareScanningListing["passportType"] as? String {
|
|
473
|
+
mrzData["Document Type"] = documentType
|
|
474
|
+
|
|
475
|
+
} else if let docnumber = shareScanningListing["docNumber"] as? String {
|
|
476
|
+
mrzData["Document No."] = docnumber
|
|
477
|
+
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
if let docchecksum = shareScanningListing["docchecksum"] as? String {
|
|
481
|
+
mrzData["Document check No."] = docchecksum
|
|
482
|
+
} else if let docchecksum = shareScanningListing["passportNumberChecksum"] as? String {
|
|
483
|
+
mrzData["Document check No."] = docchecksum
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
if let correctdocchecksum = shareScanningListing["correctdocchecksum"] as? String {
|
|
487
|
+
mrzData["Correct Document check No."] = correctdocchecksum
|
|
488
|
+
|
|
489
|
+
} else if let correctdocchecksum = shareScanningListing["correctPassportChecksum"] as? String {
|
|
490
|
+
mrzData["Correct Document check No."] = correctdocchecksum
|
|
491
|
+
|
|
492
|
+
}
|
|
493
|
+
if let contri = shareScanningListing["country"] as? String {
|
|
494
|
+
mrzData["Country"] = contri
|
|
495
|
+
|
|
496
|
+
}
|
|
497
|
+
if let nationality = shareScanningListing["nationality"] as? String {
|
|
498
|
+
mrzData["Nationality"] = nationality
|
|
499
|
+
|
|
500
|
+
}
|
|
501
|
+
if let birth = shareScanningListing["birth"] as? String {
|
|
502
|
+
mrzData["Date of Birth"] = date(toFormatedDate: birth)
|
|
503
|
+
|
|
504
|
+
}
|
|
505
|
+
if let birthchecksum = shareScanningListing["birthchecksum"] as? String {
|
|
506
|
+
mrzData["Birth Check No."] = birthchecksum
|
|
507
|
+
|
|
508
|
+
} else if let birthchecksum = shareScanningListing["BirthChecksum"] as? String {
|
|
509
|
+
mrzData["Birth Check No."] = birthchecksum
|
|
510
|
+
|
|
511
|
+
}
|
|
512
|
+
if let correctbirthchecksum = shareScanningListing["correctbirthchecksum"] as? String {
|
|
513
|
+
mrzData["Correct Birth Check No."] = correctbirthchecksum
|
|
514
|
+
|
|
515
|
+
} else if let correctbirthchecksum = shareScanningListing["correctBirthChecksum"] as? String {
|
|
516
|
+
mrzData["Correct Birth Check No."] = correctbirthchecksum
|
|
517
|
+
|
|
518
|
+
}
|
|
519
|
+
if let expirationdate = shareScanningListing["expirationDate"] as? String {
|
|
520
|
+
mrzData["Date of Expiry"] = date(toFormatedDate: expirationdate)
|
|
521
|
+
|
|
522
|
+
}
|
|
523
|
+
if let expirationchecksum = shareScanningListing["expirationchecksum"] as? String {
|
|
524
|
+
mrzData["Expiration Check No."] = expirationchecksum
|
|
525
|
+
|
|
526
|
+
} else if let expirationchecksum = shareScanningListing["expirationDateChecksum"] as? String {
|
|
527
|
+
mrzData["Expiration Check No."] = expirationchecksum
|
|
528
|
+
|
|
529
|
+
}
|
|
530
|
+
if let correctexpirationchecksum = shareScanningListing["correctexpirationchecksum"] as? String {
|
|
531
|
+
mrzData["Correct Expiration Check No."] = correctexpirationchecksum
|
|
532
|
+
|
|
533
|
+
} else if let correctexpirationchecksum = shareScanningListing["correctExpirationChecksum"] as? String {
|
|
534
|
+
mrzData["Correct Expiration Check No."] = correctexpirationchecksum
|
|
535
|
+
|
|
536
|
+
}
|
|
537
|
+
if let issuedate = shareScanningListing["issuedate"] as? String {
|
|
538
|
+
mrzData["Date Of Issue"] = date(toFormatedDate: issuedate)
|
|
539
|
+
|
|
540
|
+
} else if let issuedate = shareScanningListing["issueDate"] as? String {
|
|
541
|
+
mrzData["Date Of Issue"] = date(toFormatedDate: issuedate)
|
|
542
|
+
|
|
543
|
+
}
|
|
544
|
+
if let departmentnumber = shareScanningListing["departmentnumber"] as? String {
|
|
545
|
+
mrzData["Department No."] = departmentnumber
|
|
546
|
+
|
|
547
|
+
}else if let departmentnumber = shareScanningListing["departmentNumber"] as? String {
|
|
548
|
+
mrzData["Department No."] = departmentnumber
|
|
549
|
+
|
|
550
|
+
}
|
|
551
|
+
if let otherid = shareScanningListing["otherid"] as? String {
|
|
552
|
+
mrzData["Other ID"] = otherid
|
|
553
|
+
|
|
554
|
+
} else if let otherid = shareScanningListing["personalNumber"] as? String {
|
|
555
|
+
mrzData["Other ID"] = otherid
|
|
556
|
+
|
|
557
|
+
}
|
|
558
|
+
if let otherid = shareScanningListing["otherid"] as? String {
|
|
559
|
+
mrzData["Other ID2"] = otherid
|
|
560
|
+
|
|
561
|
+
} else if let otherid = shareScanningListing["personalNumber2"] as? String {
|
|
562
|
+
if otherid != "" {
|
|
563
|
+
mrzData["Other ID2"] = otherid
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
if let otheridchecksum = shareScanningListing["personalNumberChecksum"] as? String {
|
|
569
|
+
mrzData["Other ID Check"] = otheridchecksum
|
|
570
|
+
|
|
571
|
+
} else if let otheridchecksum = shareScanningListing["otherIdChecksum"] as? String {
|
|
572
|
+
mrzData["Other ID Check"] = otheridchecksum
|
|
573
|
+
|
|
574
|
+
}
|
|
575
|
+
if let secondrowchecksum = shareScanningListing["secondrowchecksum"] as? String {
|
|
576
|
+
mrzData["Second Row Check No."] = secondrowchecksum
|
|
577
|
+
|
|
578
|
+
} else if let secondrowchecksum = shareScanningListing["secondRowChecksum"] as? String {
|
|
579
|
+
mrzData["Second Row Check No."] = secondrowchecksum
|
|
580
|
+
|
|
581
|
+
}
|
|
582
|
+
if let correctsecondrowchecksum = shareScanningListing["correctsecondrowchecksum"] as? String {
|
|
583
|
+
mrzData["Correct Second Row Check No."] = correctsecondrowchecksum
|
|
584
|
+
|
|
585
|
+
} else if let correctsecondrowchecksum = shareScanningListing["correctSecondrowChecksum"] as? String {
|
|
586
|
+
mrzData["Correct Second Row Check No."] = correctsecondrowchecksum
|
|
587
|
+
|
|
588
|
+
}
|
|
589
|
+
mrzData["sex"] = ""
|
|
590
|
+
if let sx = shareScanningListing["sex"] as? String {
|
|
591
|
+
if sx == "F" {
|
|
592
|
+
mrzData["sex"] = "FEMALE"
|
|
593
|
+
} else if sx == "M" {
|
|
594
|
+
mrzData["sex"] = "MALE"
|
|
595
|
+
} else if sx == "X"{
|
|
596
|
+
mrzData["sex"] = "OTHER"
|
|
597
|
+
}else{
|
|
598
|
+
mrzData["sex"] = sx
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
return mrzData
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
func date(toFormatedDate dateStr: String?) -> String? {
|
|
606
|
+
let dateFormatter = DateFormatter()
|
|
607
|
+
dateFormatter.dateFormat = "yyMMdd"
|
|
608
|
+
let date: Date? = dateFormatter.date(from: dateStr ?? "")
|
|
609
|
+
dateFormatter.dateFormat = "dd-MM-yy"
|
|
610
|
+
if let date = date {
|
|
611
|
+
return dateFormatter.string(from: date)
|
|
612
|
+
}
|
|
613
|
+
return nil
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
func date(to dateStr: String?) -> String? {
|
|
617
|
+
// Convert string to date object
|
|
618
|
+
let dateFormat = DateFormatter()
|
|
619
|
+
dateFormat.dateFormat = "yyMMdd"
|
|
620
|
+
let date: Date? = dateFormat.date(from: dateStr ?? "")
|
|
621
|
+
dateFormat.dateFormat = "yy-MM-dd"
|
|
622
|
+
if let date = date {
|
|
623
|
+
return dateFormat.string(from: date)
|
|
624
|
+
}
|
|
625
|
+
return nil
|
|
626
|
+
}
|
|
627
|
+
}
|
package/ios/AccurascanKyc.m
CHANGED
|
@@ -28,6 +28,10 @@ RCT_EXTERN_METHOD(openGallery1:(NSArray *)argsNew callback:(RCTResponseSenderBlo
|
|
|
28
28
|
|
|
29
29
|
RCT_EXTERN_METHOD(openGallery2:(NSArray *)argsNew callback:(RCTResponseSenderBlock)callback)
|
|
30
30
|
|
|
31
|
+
RCT_EXTERN_METHOD(startUploadOcrWithCard:(NSArray *)argsNew callback:(RCTResponseSenderBlock)callback)
|
|
32
|
+
|
|
33
|
+
//RCT_EXTERN_METHOD(startUploadMRZ:(NSArray *)argsNew callback:(RCTResponseSenderBlock)callback)
|
|
34
|
+
|
|
31
35
|
+ (BOOL)requiresMainQueueSetup
|
|
32
36
|
{
|
|
33
37
|
return NO;
|
package/ios/AccurascanKyc.swift
CHANGED
|
@@ -792,9 +792,99 @@ class AccurascanKyc: NSObject {
|
|
|
792
792
|
// }
|
|
793
793
|
}
|
|
794
794
|
}
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
795
|
+
// MARK: - Static OCR and MRZ
|
|
796
|
+
@objc(startUploadOcrWithCard:callback:)
|
|
797
|
+
func startUploadOcrWithCard(_ argsNew: NSArray,
|
|
798
|
+
callback: @escaping RCTResponseSenderBlock) {
|
|
799
|
+
|
|
800
|
+
guard
|
|
801
|
+
let countryId = argsNew[0] as? Int,
|
|
802
|
+
let cardId = argsNew[1] as? Int,
|
|
803
|
+
let cardName = argsNew[2] as? String,
|
|
804
|
+
let cardType = argsNew[3] as? Int,
|
|
805
|
+
let imagePath = argsNew[4] as? String,
|
|
806
|
+
let side = argsNew[5] as? String
|
|
807
|
+
else {
|
|
808
|
+
callback(["Invalid parameters", NSNull()])
|
|
809
|
+
return
|
|
810
|
+
}
|
|
811
|
+
// print("imagePath: \(imagePath)")
|
|
812
|
+
let cleanedPath = imagePath.replacingOccurrences(of: "file://", with: "")
|
|
813
|
+
let imageURL = URL(fileURLWithPath: cleanedPath)
|
|
814
|
+
// print("imageURL: \(imageURL)")
|
|
815
|
+
guard
|
|
816
|
+
let data = try? Data(contentsOf: imageURL),
|
|
817
|
+
let image = UIImage(data: data)
|
|
818
|
+
else {
|
|
819
|
+
callback(["Invalid image path", NSNull()])
|
|
820
|
+
return
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
DispatchQueue.main.async {
|
|
824
|
+
let processor = AccuraUploadViewController()
|
|
825
|
+
processor.startOCR(
|
|
826
|
+
countryId: Int32(countryId),
|
|
827
|
+
cardId: Int32(cardId),
|
|
828
|
+
cardName: cardName,
|
|
829
|
+
cardType: Int32(cardType),
|
|
830
|
+
image: image,
|
|
831
|
+
side: side,
|
|
832
|
+
callback: callback
|
|
833
|
+
)
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
// @objc(startUploadMRZ:callback:)
|
|
838
|
+
// func startUploadMRZ(_ argsNew: NSArray, callback: @escaping RCTResponseSenderBlock) {
|
|
839
|
+
//
|
|
840
|
+
// guard
|
|
841
|
+
// let docType = argsNew[0] as? String,
|
|
842
|
+
// let imagePath = argsNew[1] as? String,
|
|
843
|
+
// let detectFace = argsNew[2] as? Bool
|
|
844
|
+
// else {
|
|
845
|
+
// callback(["Invalid parameters", NSNull()])
|
|
846
|
+
// return
|
|
847
|
+
// }
|
|
848
|
+
//
|
|
849
|
+
// print("MRZ imagePath: \(imagePath)")
|
|
850
|
+
//
|
|
851
|
+
// let cleanedPath = imagePath.replacingOccurrences(of: "file://", with: "")
|
|
852
|
+
// let imageURL = URL(fileURLWithPath: cleanedPath)
|
|
853
|
+
//
|
|
854
|
+
// guard
|
|
855
|
+
// let data = try? Data(contentsOf: imageURL),
|
|
856
|
+
// let image = UIImage(data: data)
|
|
857
|
+
// else {
|
|
858
|
+
// callback(["Invalid image path", NSNull()])
|
|
859
|
+
// return
|
|
860
|
+
// }
|
|
861
|
+
//
|
|
862
|
+
// DispatchQueue.main.async {
|
|
863
|
+
//
|
|
864
|
+
//
|
|
865
|
+
// let processor = AccuraUploadViewController()
|
|
866
|
+
//
|
|
867
|
+
// var mrzType:Int32 = 0
|
|
868
|
+
//
|
|
869
|
+
// if docType == "passport_mrz" {
|
|
870
|
+
// mrzType = 1
|
|
871
|
+
// } else if docType == "id_mrz" {
|
|
872
|
+
// mrzType = 2
|
|
873
|
+
// } else if docType == "visa_card" {
|
|
874
|
+
// mrzType = 3
|
|
875
|
+
// }
|
|
876
|
+
//
|
|
877
|
+
// processor.startMRZ(
|
|
878
|
+
// docType: docType,
|
|
879
|
+
// mrzType: mrzType,
|
|
880
|
+
// image: image,
|
|
881
|
+
// detectFace: detectFace,
|
|
882
|
+
// callback: callback
|
|
883
|
+
// )
|
|
884
|
+
//
|
|
885
|
+
// }
|
|
886
|
+
// }
|
|
887
|
+
// MARK: - Helper method
|
|
798
888
|
static func convertJSONString(results: [String: Any]) -> String {
|
|
799
889
|
|
|
800
890
|
if let theJSONData = try? JSONSerialization.data( withJSONObject: results, options: .prettyPrinted ),
|
package/lib/commonjs/index.js
CHANGED
|
@@ -8,5 +8,6 @@ var _reactNative = require("react-native");
|
|
|
8
8
|
const {
|
|
9
9
|
AccurascanKyc
|
|
10
10
|
} = _reactNative.NativeModules;
|
|
11
|
+
// const AccurascanKyc = TurboModuleRegistry.get('AccurascanKyc') ?? NativeModules.AccurascanKyc;
|
|
11
12
|
var _default = exports.default = AccurascanKyc;
|
|
12
13
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","AccurascanKyc","NativeModules","_default","exports","default"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;
|
|
1
|
+
{"version":3,"names":["_reactNative","require","AccurascanKyc","NativeModules","_default","exports","default"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,MAAM;EAAEC;AAAc,CAAC,GAAGC,0BAAa;AACvC;AAAA,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEeJ,aAAa","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeModules","AccurascanKyc"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,SAASA,aAAa,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":["NativeModules","AccurascanKyc"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,SAASA,aAAa,QAAQ,cAAc;AAC5C,MAAM;EAAEC;AAAc,CAAC,GAAGD,aAAa;AACvC;;AAEA,eAAeC,aAAa","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AACA,QAAA,MAAQ,aAAa,KAAkB,CAAC;AAGxC,eAAe,aAAa,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "accurascan_kyc",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.4",
|
|
4
4
|
"description": "Accura Scan",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"@react-native-community/bob": "^0.17.1",
|
|
58
58
|
"@react-native-community/eslint-config": "^3.0.2",
|
|
59
59
|
"@release-it/conventional-changelog": "^5.0.0",
|
|
60
|
-
"@types/jest": "^29.5.
|
|
60
|
+
"@types/jest": "^29.5.13",
|
|
61
61
|
"@types/react": "~18.2.64",
|
|
62
62
|
"@types/react-native": "0.73.0",
|
|
63
63
|
"commitlint": "^17.0.2",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"pod-install": "^0.1.0",
|
|
70
70
|
"prettier": "^3.3.3",
|
|
71
71
|
"react": "18.2.0",
|
|
72
|
-
"react-native": "0.
|
|
72
|
+
"react-native": "0.77.3",
|
|
73
73
|
"react-native-builder-bob": "^0.20.0",
|
|
74
74
|
"release-it": "^17.10.0",
|
|
75
75
|
"typescript": "^5.4.5"
|
package/src/index.tsx
CHANGED