@soyio/soyio-rn-sdk 5.0.0 → 6.0.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.
Files changed (104) hide show
  1. package/README.md +28 -112
  2. package/package/src/bridges/facetec.js +16 -8
  3. package/package/src/bridges/facetec.js.map +1 -1
  4. package/package.json +9 -7
  5. package/android/build.gradle +0 -57
  6. package/android/libs/facetec-sdk-9.7.114.aar +0 -0
  7. package/android/src/main/AndroidManifest.xml +0 -8
  8. package/android/src/main/java/com/soyio/soyiorndk/AndroidFacetecSdkModule.kt +0 -224
  9. package/android/src/main/java/com/soyio/soyiorndk/AndroidFacetecSdkPackage.kt +0 -16
  10. package/android/src/main/java/com/soyio/soyiorndk/ApiDate.kt +0 -5
  11. package/android/src/main/java/com/soyio/soyiorndk/BaseFaceTecProcessor.kt +0 -75
  12. package/android/src/main/java/com/soyio/soyiorndk/FaceTecRequestService.kt +0 -115
  13. package/android/src/main/java/com/soyio/soyiorndk/FacetecConfig.kt +0 -311
  14. package/android/src/main/java/com/soyio/soyiorndk/SoyioIdOnlyProcessor.kt +0 -81
  15. package/android/src/main/java/com/soyio/soyiorndk/SoyioValidationProcessor.kt +0 -136
  16. package/android/src/main/res/drawable-nodpi/soyio_facetec_close.png +0 -0
  17. package/android/src/main/res/drawable-nodpi/soyio_facetec_id_front.png +0 -0
  18. package/android/src/main/res/values/strings.xml +0 -134
  19. package/assets/adaptive-icon.png +0 -0
  20. package/assets/favicon.png +0 -0
  21. package/assets/fonts/RobotoFlex.ttf +0 -0
  22. package/assets/icon.png +0 -0
  23. package/assets/images/SoyioRnSdk.xcassets/facetec-close.imageset/Contents.json +0 -23
  24. package/assets/images/SoyioRnSdk.xcassets/facetec-close.imageset/facetec-close@1x.png +0 -0
  25. package/assets/images/SoyioRnSdk.xcassets/facetec-close.imageset/facetec-close@2x.png +0 -0
  26. package/assets/images/SoyioRnSdk.xcassets/facetec-close.imageset/facetec-close@3x.png +0 -0
  27. package/assets/images/SoyioRnSdk.xcassets/facetec-id-front.imageset/Contents.json +0 -23
  28. package/assets/images/SoyioRnSdk.xcassets/facetec-id-front.imageset/facetec-id-front@1x.png +0 -0
  29. package/assets/images/SoyioRnSdk.xcassets/facetec-id-front.imageset/facetec-id-front@2x.png +0 -0
  30. package/assets/images/SoyioRnSdk.xcassets/facetec-id-front.imageset/facetec-id-front@3x.png +0 -0
  31. package/assets/splash.png +0 -0
  32. package/ios/ApiDate.swift +0 -5
  33. package/ios/FacetecConfig.swift +0 -217
  34. package/ios/FacetecStrings.swift +0 -139
  35. package/ios/Frameworks/FaceTecSDK.xcframework/Info.plist +0 -44
  36. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Assets.car +0 -0
  37. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/FaceTecSDK +0 -0
  38. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/GenericGuidanceContentLayout.nib +0 -0
  39. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Headers/FaceTecPublicApi.h +0 -1935
  40. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Headers/FaceTecPublicStringKeys.h +0 -109
  41. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Headers/FaceTecSDK.h +0 -16
  42. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Info.plist +0 -0
  43. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Modules/module.modulemap +0 -6
  44. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/PrivacyInfo.xcprivacy +0 -29
  45. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/ReadyScreenGuidanceContentLayout.nib +0 -0
  46. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/RetryScreenGuidanceContentLayout.nib +0 -0
  47. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/SharedGuidanceLayout.nib +0 -0
  48. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/9Uo-4b-JiE-view-Ae0-rb-UqS.nib +0 -0
  49. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/CJ6-MX-bJp-view-8JL-Rc-0g1.nib +0 -0
  50. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/FaceScanViewController.nib +0 -0
  51. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/FaceTecAdditionalReviewViewController.nib +0 -0
  52. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/FaceTecIDFeedbackViewController.nib +0 -0
  53. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/FaceTecOCRConfirmationViewController.nib +0 -0
  54. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/IDCaptureViewController.nib +0 -0
  55. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/IDSelectionViewController.nib +0 -0
  56. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/Info.plist +0 -0
  57. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/Pyw-6G-JSY-view-Zue-Eo-Q2U.nib +0 -0
  58. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/QWA-8Y-vUM-view-wJB-Z5-eD2.nib +0 -0
  59. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/alz-Ia-X3d-view-IKu-EI-Hug.nib +0 -0
  60. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/l2Q-cc-kD8-view-UUy-6c-meu.nib +0 -0
  61. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/_CodeSignature/CodeResources +0 -729
  62. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/af.lproj/FaceTec.strings +0 -0
  63. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/ar.lproj/FaceTec.strings +0 -0
  64. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/attributions.txt +0 -462
  65. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/1f5b84f51ce0fcfbb76e904b7bcaa7560f601e1394a0b29367a09385312287eb +0 -0
  66. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/2b075ac1a6132b5b8a4c9ef0ba6b0cd84db7838aca9a000e50d907f40770a4ab +0 -0
  67. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/59cc2a9af81aaca2376702c2490650f4da2775fa673274db98aad41b7ef101c0 +0 -0
  68. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/5b63e98b991aedabb60665503384f30bffd939decf9433883b30b78011ee501a +0 -0
  69. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/66388dc76dc16bc6b76b682edd218a575bf45b9b +0 -0
  70. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/6b3133f0f39ff89a2a169d61176ee17cafacc5e288f334e2b64ee82892d11ccd +0 -0
  71. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/9077d16225f9314163ef1e7db6fc7d4088bb903d134bd95f23d5591ca4dfbfca +0 -0
  72. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/a74f2afb9d20f2375ccbd14e67c094b85c89ceb608f7cf8ae04f3f646a6c5672 +0 -0
  73. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/b501893e75f62ee1707643e35b21109927b07ed5b202321c961b424cbc2e4695 +0 -0
  74. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/dbd7a353f0130bb983d6ba05917e9be991d70e8f028df4b74e30bc6497ef7f71 +0 -0
  75. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/f2.xml +0 -0
  76. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/fd6d368a5658496536e2bfae170d1b823a3629b242cafc09784bfba4e56d8c80 +0 -0
  77. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/marker +0 -0
  78. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/vu0ilin6we3lrzo5f83f7qs2jul4aq7v4aoynrmch8zfvpi8ezrfyafa4t0fx87l +0 -0
  79. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/de.lproj/FaceTec.strings +0 -0
  80. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/el.lproj/FaceTec.strings +0 -0
  81. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/en.lproj/FaceTec.strings +0 -0
  82. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/es.lproj/FaceTec.strings +0 -0
  83. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/fr.lproj/FaceTec.strings +0 -0
  84. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/kk.lproj/FaceTec.strings +0 -0
  85. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/nb.lproj/FaceTec.strings +0 -0
  86. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/pt-BR.lproj/FaceTec.strings +0 -0
  87. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/ru.lproj/FaceTec.strings +0 -0
  88. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/strip-unused-architectures-from-target.sh +0 -62
  89. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/FaceTecSDK +0 -0
  90. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/Headers/FaceTecPublicApi.h +0 -1935
  91. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/Headers/FaceTecPublicStringKeys.h +0 -109
  92. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/Headers/FaceTecSDK.h +0 -16
  93. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/Info.plist +0 -0
  94. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/Modules/module.modulemap +0 -6
  95. package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/_CodeSignature/CodeResources +0 -146
  96. package/ios/IOSFacetecSdk.m +0 -22
  97. package/ios/IOSFacetecSdk.swift +0 -221
  98. package/ios/ProcessorProtocol.swift +0 -6
  99. package/ios/SoyioIDOnlyProcessor.swift +0 -170
  100. package/ios/SoyioPhotoIDMatchProcessor.swift +0 -264
  101. package/package/package.json +0 -68
  102. package/react-native.config.js +0 -12
  103. package/scripts/prepare-facetec-xcframework.sh +0 -38
  104. package/soyio_rn_sdk.podspec +0 -52
@@ -1,170 +0,0 @@
1
- import UIKit
2
- import Foundation
3
- import FaceTecSDK
4
-
5
- // This class performs ID-Only validation (skips liveness check) using the Soyio backend API
6
- class SoyioIDOnlyProcessor: NSObject, Processor, FaceTecIDScanProcessorDelegate, URLSessionTaskDelegate {
7
- var latestNetworkRequest: URLSessionTask!
8
- var success = false
9
- var fromViewController: UIViewController!
10
- var idScanResultCallback: FaceTecIDScanResultCallback!
11
- var sessionId: String = ""
12
- var flowCancelledErrorMessage: String = "FLOW_CANCELLED"
13
- var unknownErrorMessage: String = "unknown_error"
14
- var apiErrorMessage: String?
15
-
16
- // Dynamic configuration parameters
17
- var baseUrl: String
18
- var facetecSessionToken: String
19
- var soyioAuthToken: String
20
- var disclosureRequestToken: String
21
- var completionHandler: ((Bool, String?) -> Void)?
22
-
23
- init(facetecSessionToken: String, soyioAuthToken: String, disclosureRequestToken: String, baseUrl: String, fromViewController: UIViewController, completionHandler: @escaping (Bool, String?) -> Void) {
24
- self.facetecSessionToken = facetecSessionToken
25
- self.soyioAuthToken = soyioAuthToken
26
- self.disclosureRequestToken = disclosureRequestToken
27
- self.baseUrl = baseUrl
28
- self.fromViewController = fromViewController
29
- self.completionHandler = completionHandler
30
- super.init()
31
-
32
- // Create the FaceTec session - only ID scan, no liveness check
33
- let idScanViewController = FaceTec.sdk.createSessionVC(idScanProcessorDelegate: self, sessionToken: facetecSessionToken)
34
- fromViewController.present(idScanViewController, animated: true, completion: nil)
35
- }
36
-
37
- //
38
- // Handling the Result of an ID Scan
39
- //
40
- func processIDScanWhileFaceTecSDKWaits(idScanResult: FaceTecIDScanResult, idScanResultCallback: FaceTecIDScanResultCallback) {
41
- self.idScanResultCallback = idScanResultCallback
42
-
43
- // Safely unwrap sessionId
44
- guard let sessionId = idScanResult.sessionId else {
45
- idScanResultCallback.onIDScanResultCancel()
46
- return
47
- }
48
- self.sessionId = sessionId
49
-
50
- // Handle early exit scenarios
51
- if idScanResult.status != FaceTecIDScanStatus.success {
52
- if latestNetworkRequest != nil {
53
- latestNetworkRequest.cancel()
54
- }
55
- self.apiErrorMessage = self.flowCancelledErrorMessage
56
- idScanResultCallback.onIDScanResultCancel()
57
- return
58
- }
59
-
60
- // Prepare request data
61
- var parameters: [String : Any] = [:]
62
- parameters["id_scan"] = idScanResult.idScanBase64
63
- if idScanResult.frontImagesCompressedBase64?.isEmpty == false {
64
- parameters["id_scan_front_image"] = idScanResult.frontImagesCompressedBase64![0]
65
- }
66
- if idScanResult.backImagesCompressedBase64?.isEmpty == false {
67
- parameters["id_scan_back_image"] = idScanResult.backImagesCompressedBase64![0]
68
- }
69
-
70
- // Make the networking call to Soyio backend
71
- let endpoint = "\(baseUrl)/api/internal/disclosure_requests/\(disclosureRequestToken)/facetec/id_check"
72
- let request = NSMutableURLRequest(url: NSURL(string: endpoint)! as URL)
73
- request.httpMethod = "POST"
74
- request.addValue("application/json", forHTTPHeaderField: "Content-Type")
75
- request.httpBody = try! JSONSerialization.data(withJSONObject: parameters, options: JSONSerialization.WritingOptions(rawValue: 0))
76
- request.addValue(soyioAuthToken, forHTTPHeaderField: "Authorization")
77
- request.addValue(self.sessionId, forHTTPHeaderField: "X-Facetec-Session-Id")
78
- request.addValue(FaceTec.sdk.createFaceTecAPIUserAgentString(self.sessionId), forHTTPHeaderField: "X-Facetec-User-Agent")
79
- request.addValue(ApiDate.iso, forHTTPHeaderField: "X-Api-Version")
80
-
81
- let session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: OperationQueue.main)
82
- latestNetworkRequest = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
83
-
84
- guard let data = data else {
85
- idScanResultCallback.onIDScanResultCancel()
86
- return
87
- }
88
-
89
- guard let responseJSON = try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! [String: AnyObject] else {
90
- idScanResultCallback.onIDScanResultCancel()
91
- return
92
- }
93
-
94
- if let error = responseJSON["error"] as? Bool {
95
- if (error) {
96
- self.apiErrorMessage = responseJSON["errorMessage"] as? String
97
- if self.apiErrorMessage?.isEmpty ?? true {
98
- self.apiErrorMessage = self.unknownErrorMessage
99
- }
100
- idScanResultCallback.onIDScanResultCancel()
101
- return
102
- }
103
- }
104
-
105
- guard let scanResultBlob = responseJSON["scanResultBlob"] as? String,
106
- let wasProcessed = responseJSON["wasProcessed"] as? Bool else {
107
- idScanResultCallback.onIDScanResultCancel()
108
- return
109
- }
110
-
111
- if wasProcessed == true {
112
- // Configure result screen messages
113
- FaceTecCustomization.setIDScanResultScreenMessageOverrides(
114
- successFrontSide: "Frente de la cédula\ncapturado",
115
- successFrontSideBackNext: "Lado frontal de la cédula\ncapturado",
116
- successFrontSideNFCNext: "Frente de la cédula\ncapturado",
117
- successBackSide: "Ambos lados fueron\ncapturados y verificados",
118
- successBackSideNFCNext: "Ambos lados fueron\ncapturados y verificados",
119
- successPassport: "Pasaporte capturado",
120
- successPassportNFCNext: "Pasaporte capturado",
121
- successUserConfirmation: "Cédula capturada",
122
- successNFC: "Cédula capturada",
123
- successAdditionalReview: "Cédula capturada",
124
- retryFaceDidNotMatch: "El rostro no coincide\nlo suficiente",
125
- retryIDNotFullyVisible: "La cédula\nno es totalmente visible",
126
- retryOCRResultsNotGoodEnough: "El texto de la cédula no es legible",
127
- retryIDTypeNotSupported: "No se admite este tipo de identificación\nUtiliza una identificación diferente",
128
- skipOrErrorNFC: "Información de la cédula\nsubida"
129
- )
130
-
131
- self.success = idScanResultCallback.onIDScanResultProceedToNextStep(scanResultBlob: scanResultBlob)
132
- }
133
- else {
134
- idScanResultCallback.onIDScanResultCancel()
135
- }
136
- })
137
-
138
- latestNetworkRequest.resume()
139
- }
140
-
141
- //
142
- // URLSessionTaskDelegate function to get progress while performing the upload
143
- //
144
- func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
145
- let uploadProgress: Float = Float(totalBytesSent) / Float(totalBytesExpectedToSend)
146
- idScanResultCallback.onIDScanUploadProgress(uploadedPercent: uploadProgress)
147
- }
148
-
149
- //
150
- // This function gets called after the FaceTec SDK is completely done
151
- //
152
- func onFaceTecSDKCompletelyDone() {
153
- // Dismiss the view controller to return to the main UI
154
- fromViewController.dismiss(animated: true, completion: {
155
- // Notify completion — check apiErrorMessage first, since a previous step
156
- // may have set self.success = true before a later step (e.g. NFC) failed.
157
- if let errorMessage = self.apiErrorMessage {
158
- self.completionHandler?(false, errorMessage)
159
- } else if self.success {
160
- self.completionHandler?(true, nil)
161
- } else {
162
- self.completionHandler?(false, self.unknownErrorMessage)
163
- }
164
- })
165
- }
166
-
167
- func isSuccess() -> Bool {
168
- return success
169
- }
170
- }
@@ -1,264 +0,0 @@
1
- import UIKit
2
- import Foundation
3
- import FaceTecSDK
4
-
5
- // This class performs Photo ID Matches using the Soyio backend API
6
- class SoyioPhotoIDMatchProcessor: NSObject, Processor, FaceTecFaceScanProcessorDelegate, FaceTecIDScanProcessorDelegate, URLSessionTaskDelegate {
7
- var latestNetworkRequest: URLSessionTask!
8
- var success = false
9
- var faceScanWasSuccessful = false
10
- var fromViewController: UIViewController!
11
- var faceScanResultCallback: FaceTecFaceScanResultCallback!
12
- var idScanResultCallback: FaceTecIDScanResultCallback!
13
- var flowCancelledErrorMessage: String = "FLOW_CANCELLED"
14
- var unknownErrorMessage: String = "unknown_error"
15
- var sessionId: String = ""
16
- var apiErrorMessage: String?
17
-
18
- // Dynamic configuration parameters
19
- var baseUrl: String
20
- var facetecSessionToken: String
21
- var soyioAuthToken: String
22
- var disclosureRequestToken: String
23
- var livenessSuccessHandler: (() -> Void)?
24
- var completionHandler: ((Bool, String?) -> Void)?
25
-
26
- init(facetecSessionToken: String, soyioAuthToken: String, disclosureRequestToken: String, baseUrl: String, fromViewController: UIViewController, livenessSuccessHandler: @escaping () -> Void, completionHandler: @escaping (Bool, String?) -> Void) {
27
- self.facetecSessionToken = facetecSessionToken
28
- self.soyioAuthToken = soyioAuthToken
29
- self.disclosureRequestToken = disclosureRequestToken
30
- self.baseUrl = baseUrl
31
- self.fromViewController = fromViewController
32
- self.livenessSuccessHandler = livenessSuccessHandler
33
- self.completionHandler = completionHandler
34
- super.init()
35
-
36
- // Create the FaceTec session
37
- let idScanViewController = FaceTec.sdk.createSessionVC(faceScanProcessorDelegate: self, idScanProcessorDelegate: self, sessionToken: facetecSessionToken)
38
- fromViewController.present(idScanViewController, animated: true, completion: nil)
39
- }
40
-
41
- //
42
- // Part 1: Handling the Result of a FaceScan (Liveness Check)
43
- //
44
- func processSessionWhileFaceTecSDKWaits(sessionResult: FaceTecSessionResult, faceScanResultCallback: FaceTecFaceScanResultCallback) {
45
- self.faceScanResultCallback = faceScanResultCallback
46
- self.sessionId = sessionResult.sessionId
47
-
48
- // Handle early exit scenarios
49
- if sessionResult.status != FaceTecSessionStatus.sessionCompletedSuccessfully {
50
- if latestNetworkRequest != nil {
51
- latestNetworkRequest.cancel()
52
- }
53
- self.apiErrorMessage = self.flowCancelledErrorMessage
54
- faceScanResultCallback.onFaceScanResultCancel()
55
- return
56
- }
57
-
58
- // Prepare request data
59
- var parameters: [String : Any] = [:]
60
- parameters["face_scan"] = sessionResult.faceScanBase64
61
- parameters["audit_trail_image"] = sessionResult.auditTrailCompressedBase64![0]
62
- parameters["low_quality_audit_trail_image"] = sessionResult.lowQualityAuditTrailCompressedBase64![0]
63
- parameters["session_id"] = sessionResult.sessionId
64
-
65
- // Make the networking call to Soyio backend
66
- let endpoint = "\(baseUrl)/api/internal/disclosure_requests/\(disclosureRequestToken)/facetec/liveness_check"
67
- let request = NSMutableURLRequest(url: NSURL(string: endpoint)! as URL)
68
- request.httpMethod = "POST"
69
- request.addValue("application/json", forHTTPHeaderField: "Content-Type")
70
- request.httpBody = try! JSONSerialization.data(withJSONObject: parameters, options: JSONSerialization.WritingOptions(rawValue: 0))
71
- request.addValue(soyioAuthToken, forHTTPHeaderField: "Authorization")
72
- request.addValue(sessionResult.sessionId, forHTTPHeaderField: "X-Facetec-Session-Id")
73
- request.addValue(FaceTec.sdk.createFaceTecAPIUserAgentString(sessionResult.sessionId), forHTTPHeaderField: "X-Facetec-User-Agent")
74
- request.addValue(ApiDate.iso, forHTTPHeaderField: "X-Api-Version")
75
-
76
- let session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: OperationQueue.main)
77
- latestNetworkRequest = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
78
-
79
- guard let data = data else {
80
- faceScanResultCallback.onFaceScanResultCancel()
81
- return
82
- }
83
-
84
- guard let responseJSON = try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! [String: AnyObject] else {
85
- faceScanResultCallback.onFaceScanResultCancel()
86
- return
87
- }
88
-
89
- if let error = responseJSON["error"] as? Bool {
90
- if (error) {
91
- self.apiErrorMessage = responseJSON["errorMessage"] as? String
92
- if self.apiErrorMessage?.isEmpty ?? true {
93
- self.apiErrorMessage = self.unknownErrorMessage
94
- }
95
- faceScanResultCallback.onFaceScanResultCancel()
96
- return
97
- }
98
- }
99
-
100
- guard let scanResultBlob = responseJSON["scanResultBlob"] as? String,
101
- let wasProcessed = responseJSON["wasProcessed"] as? Bool else {
102
- faceScanResultCallback.onFaceScanResultCancel()
103
- return;
104
- }
105
-
106
- let success = responseJSON["success"] as? Bool ?? false
107
-
108
- if wasProcessed == true {
109
- FaceTecCustomization.setOverrideResultScreenSuccessMessage("¡Te ves bien!\nSelfie verificada\ncorrectamente")
110
- self.faceScanWasSuccessful = faceScanResultCallback.onFaceScanGoToNextStep(scanResultBlob: scanResultBlob)
111
-
112
- // Notify that liveness check was successful (only if success == true)
113
- if success {
114
- self.livenessSuccessHandler?()
115
- }
116
- }
117
- else {
118
- faceScanResultCallback.onFaceScanResultCancel()
119
- return;
120
- }
121
- })
122
-
123
- latestNetworkRequest.resume()
124
-
125
- // Update user if upload is taking a while
126
- DispatchQueue.main.asyncAfter(deadline: .now() + 6) {
127
- if self.latestNetworkRequest.state == .completed { return }
128
- let uploadMessage = NSMutableAttributedString.init(string: "Ya casi terminamos...")
129
- faceScanResultCallback.onFaceScanUploadMessageOverride(uploadMessageOverride: uploadMessage)
130
- }
131
- }
132
-
133
- //
134
- // Part 2: Handling the Result of an ID Scan
135
- //
136
- func processIDScanWhileFaceTecSDKWaits(idScanResult: FaceTecIDScanResult, idScanResultCallback: FaceTecIDScanResultCallback) {
137
- self.idScanResultCallback = idScanResultCallback
138
-
139
- // Handle early exit scenarios
140
- if idScanResult.status != FaceTecIDScanStatus.success {
141
- if latestNetworkRequest != nil {
142
- latestNetworkRequest.cancel()
143
- }
144
- self.apiErrorMessage = self.flowCancelledErrorMessage
145
- idScanResultCallback.onIDScanResultCancel()
146
- return
147
- }
148
-
149
- // Prepare request data
150
- var parameters: [String : Any] = [:]
151
- parameters["id_scan"] = idScanResult.idScanBase64
152
- parameters["session_id"] = self.sessionId
153
- if idScanResult.frontImagesCompressedBase64?.isEmpty == false {
154
- parameters["id_scan_front_image"] = idScanResult.frontImagesCompressedBase64![0]
155
- }
156
- if idScanResult.backImagesCompressedBase64?.isEmpty == false {
157
- parameters["id_scan_back_image"] = idScanResult.backImagesCompressedBase64![0]
158
- }
159
-
160
- // Make the networking call to Soyio backend
161
- let endpoint = "\(baseUrl)/api/internal/disclosure_requests/\(disclosureRequestToken)/facetec/id_check"
162
- let request = NSMutableURLRequest(url: NSURL(string: endpoint)! as URL)
163
- request.httpMethod = "POST"
164
- request.addValue("application/json", forHTTPHeaderField: "Content-Type")
165
- request.httpBody = try! JSONSerialization.data(withJSONObject: parameters, options: JSONSerialization.WritingOptions(rawValue: 0))
166
- request.addValue(soyioAuthToken, forHTTPHeaderField: "Authorization")
167
- request.addValue(FaceTec.sdk.createFaceTecAPIUserAgentString(self.sessionId), forHTTPHeaderField: "X-Facetec-User-Agent")
168
- request.addValue(ApiDate.iso, forHTTPHeaderField: "X-Api-Version")
169
-
170
- let session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: OperationQueue.main)
171
- latestNetworkRequest = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
172
-
173
- guard let data = data else {
174
- idScanResultCallback.onIDScanResultCancel()
175
- return
176
- }
177
-
178
- guard let responseJSON = try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! [String: AnyObject] else {
179
- idScanResultCallback.onIDScanResultCancel()
180
- return
181
- }
182
-
183
- if let error = responseJSON["error"] as? Bool {
184
- if (error) {
185
- self.apiErrorMessage = responseJSON["errorMessage"] as? String
186
- if self.apiErrorMessage?.isEmpty ?? true {
187
- self.apiErrorMessage = self.unknownErrorMessage
188
- }
189
- idScanResultCallback.onIDScanResultCancel()
190
- return
191
- }
192
- }
193
-
194
- guard let scanResultBlob = responseJSON["scanResultBlob"] as? String,
195
- let wasProcessed = responseJSON["wasProcessed"] as? Bool else {
196
- idScanResultCallback.onIDScanResultCancel()
197
- return
198
- }
199
-
200
- if wasProcessed == true {
201
- // Configure result screen messages
202
- FaceTecCustomization.setIDScanResultScreenMessageOverrides(
203
- successFrontSide: "Frente de la cédula\ncapturado",
204
- successFrontSideBackNext: "Lado frontal de la cédula\ncapturado",
205
- successFrontSideNFCNext: "Frente de la cédula\ncapturado",
206
- successBackSide: "Ambos lados fueron\ncapturados y verificados",
207
- successBackSideNFCNext: "Ambos lados fueron\ncapturados y verificados",
208
- successPassport: "Pasaporte capturado",
209
- successPassportNFCNext: "Pasaporte capturado",
210
- successUserConfirmation: "Cédula capturada",
211
- successNFC: "Cédula capturada",
212
- successAdditionalReview: "Cédula capturada",
213
- retryFaceDidNotMatch: "El rostro no coincide\nlo suficiente",
214
- retryIDNotFullyVisible: "La cédula\nno es totalmente visible",
215
- retryOCRResultsNotGoodEnough: "El texto de la cédula no es legible",
216
- retryIDTypeNotSupported: "No se admite este tipo de identificación\nUtiliza una identificación diferente",
217
- skipOrErrorNFC: "Información de la cédula\nsubida"
218
- )
219
-
220
- self.success = idScanResultCallback.onIDScanResultProceedToNextStep(scanResultBlob: scanResultBlob)
221
- }
222
- else {
223
- idScanResultCallback.onIDScanResultCancel()
224
- }
225
- })
226
-
227
- latestNetworkRequest.resume()
228
- }
229
-
230
- //
231
- // URLSessionTaskDelegate function to get progress while performing the upload
232
- //
233
- func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
234
- let uploadProgress: Float = Float(totalBytesSent) / Float(totalBytesExpectedToSend)
235
- if idScanResultCallback != nil {
236
- idScanResultCallback.onIDScanUploadProgress(uploadedPercent: uploadProgress)
237
- }
238
- else {
239
- faceScanResultCallback.onFaceScanUploadProgress(uploadedPercent: uploadProgress)
240
- }
241
- }
242
-
243
- //
244
- // This function gets called after the FaceTec SDK is completely done
245
- //
246
- func onFaceTecSDKCompletelyDone() {
247
- // Dismiss the view controller to return to the main UI
248
- fromViewController.dismiss(animated: true, completion: {
249
- // Notify completion — check apiErrorMessage first, since a previous step
250
- // may have set self.success = true before a later step (e.g. NFC) failed.
251
- if let errorMessage = self.apiErrorMessage {
252
- self.completionHandler?(false, errorMessage)
253
- } else if self.success {
254
- self.completionHandler?(true, nil)
255
- } else {
256
- self.completionHandler?(false, self.unknownErrorMessage)
257
- }
258
- })
259
- }
260
-
261
- func isSuccess() -> Bool {
262
- return success
263
- }
264
- }
@@ -1,68 +0,0 @@
1
- {
2
- "name": "@soyio/soyio-rn-sdk",
3
- "version": "5.0.0",
4
- "license": "MIT",
5
- "author": "Ignacio Méndez",
6
- "main": "./package/index.js",
7
- "react-native": "./package/index.js",
8
- "description": "Soyio React Native SDK",
9
- "homepage": "https://github.com/Soyio-id/soyio-rn-sdk",
10
- "repository": {
11
- "type": "git",
12
- "url": "https://github.com/Soyio-id/soyio-rn-sdk"
13
- },
14
- "types": "./package/index.d.ts",
15
- "scripts": {
16
- "bump!": "sh scripts/bump.sh",
17
- "start": "react-native start",
18
- "android": "react-native run-android",
19
- "ios": "react-native run-ios",
20
- "build": "yarn build:esm && yarn build:cjs",
21
- "build:esm": "tsc",
22
- "build:cjs": "tsc --module commonjs",
23
- "lint": "eslint src index.ts --ext .ts",
24
- "smoke:setup": "cd example/app && yarn install",
25
- "smoke:android": "./scripts/smoke-android.sh",
26
- "smoke:ios": "cd example/app && yarn ios",
27
- "version:get": "node -p \"require('./package.json').version\"",
28
- "sync:api-date": "node scripts/update-api-date.js",
29
- "pack:dev": "sh scripts/pack-dev.sh"
30
- },
31
- "peerDependencies": {
32
- "react": "*",
33
- "react-native": "*",
34
- "react-native-inappbrowser-reborn": "*",
35
- "react-native-webview": "*"
36
- },
37
- "devDependencies": {
38
- "@babel/core": "^7.20.0",
39
- "@types/react": "~18.2.45",
40
- "@typescript-eslint/eslint-plugin": "^7.4.0",
41
- "@typescript-eslint/parser": "^7.4.0",
42
- "eslint": "^8.57.0",
43
- "eslint-config-airbnb-base": "^15.0.0",
44
- "eslint-plugin-eslint-comments": "^3.2.0",
45
- "eslint-plugin-import": "^2.29.1",
46
- "eslint-plugin-tsdoc": "^0.2.17",
47
- "react": "^18.2.0",
48
- "react-native": "^0.73.6",
49
- "react-native-app-auth": "^7.2.0",
50
- "react-native-inappbrowser-reborn": "^3.7.0",
51
- "react-native-webview": "^13.16.0",
52
- "typescript": "^5.4.3"
53
- },
54
- "resolutions": {
55
- "fast-xml-parser": "^4.5.4",
56
- "**/eslint/minimatch": "^3.1.4",
57
- "**/eslint-plugin-import/minimatch": "^3.1.4",
58
- "**/@eslint/eslintrc/minimatch": "^3.1.4",
59
- "**/@humanwhocodes/config-array/minimatch": "^3.1.4",
60
- "**/rimraf/glob/minimatch": "^3.1.4",
61
- "**/node-dir/minimatch": "^3.1.4",
62
- "**/@typescript-eslint/typescript-estree/minimatch": "^9.0.7"
63
- },
64
- "overrides": {
65
- "js-yaml": "^4.1.1"
66
- },
67
- "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
68
- }
@@ -1,12 +0,0 @@
1
- module.exports = {
2
- dependency: {
3
- platforms: {
4
- ios: {},
5
- android: {
6
- sourceDir: './android',
7
- packageImportPath: 'import com.soyio.soyiorndk.AndroidFacetecSdkPackage;',
8
- },
9
- },
10
- },
11
- assets: ['./assets/fonts/'],
12
- };
@@ -1,38 +0,0 @@
1
- #!/bin/bash
2
- # ---------------------------------------------------------------------------
3
- # prepare-facetec-xcframework.sh
4
- #
5
- # CocoaPods does not fully handle vendored xcframeworks in pods that also
6
- # have source files (only aggregate-target pods like hermes-engine work
7
- # automatically). This script works around two missing pieces:
8
- # 1. Extract the correct platform slice before Swift compilation
9
- # 2. Patch the consumer's embed-frameworks script so the dynamic framework
10
- # is bundled inside the .app at runtime
11
- # ---------------------------------------------------------------------------
12
- set -e
13
-
14
- # --- 1. Extract the correct xcframework slice for the current platform -----
15
- XCFW_SRC="${PODS_TARGET_SRCROOT}/ios/Frameworks/FaceTecSDK.xcframework"
16
- XCFW_DST="${PODS_XCFRAMEWORKS_BUILD_DIR}/soyio_rn_sdk"
17
-
18
- if [[ "${PLATFORM_NAME}" == "iphonesimulator" ]]; then
19
- SLICE="ios-arm64_x86_64-simulator"
20
- else
21
- SLICE="ios-arm64"
22
- fi
23
-
24
- mkdir -p "${XCFW_DST}"
25
- rsync -a --delete "${XCFW_SRC}/${SLICE}/FaceTecSDK.framework" "${XCFW_DST}/"
26
-
27
- # --- 2. Patch consumer embed-frameworks script -----------------------------
28
- # CocoaPods generates Pods-<Target>-frameworks.sh to embed dynamic frameworks
29
- # but omits FaceTecSDK. Append the install_framework call so the framework is
30
- # copied into the .app bundle.
31
- EMBED_LINE='install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/soyio_rn_sdk/FaceTecSDK.framework"'
32
- for fw_script in "${PODS_ROOT}/Target Support Files"/Pods-*/Pods-*-frameworks.sh; do
33
- [[ -f "$fw_script" ]] || continue
34
- grep -q 'soyio_rn_sdk/FaceTecSDK' "$fw_script" && continue
35
- awk -v line="$EMBED_LINE" '/^if.*COCOAPODS_PARALLEL_CODE_SIGN/{print line}1' "$fw_script" > "${fw_script}.tmp"
36
- mv "${fw_script}.tmp" "$fw_script"
37
- chmod +x "$fw_script"
38
- done
@@ -1,52 +0,0 @@
1
- require 'json'
2
-
3
- package = JSON.parse(File.read(File.join(__dir__, 'package.json')))
4
-
5
- Pod::Spec.new do |s|
6
- s.name = 'soyio_rn_sdk'
7
- s.version = package['version']
8
- s.summary = package['description']
9
- s.homepage = package['homepage']
10
- s.license = package['license']
11
- s.authors = package['author']
12
- s.platforms = { ios: '13.0' }
13
- s.source = { git: 'https://github.com/Soyio-id/soyio-rn-sdk.git', tag: s.version.to_s }
14
-
15
- s.source_files = 'ios/**/*.{h,m,mm,swift}'
16
- s.exclude_files = 'ios/Frameworks/**/*', 'ios/Frameworks-dev/**/*'
17
-
18
- s.resource_bundles = {
19
- 'SoyioRnSdk' => [
20
- 'assets/fonts/**/*.ttf',
21
- 'assets/images/SoyioRnSdk.xcassets'
22
- ]
23
- }
24
-
25
- # FaceTecSDK is a dynamic xcframework. CocoaPods doesn't fully handle
26
- # vendored xcframeworks in pods with source files, so we use a script phase
27
- # to extract the correct slice and patch the consumer's embed script.
28
- # See scripts/prepare-facetec-xcframework.sh for details.
29
- s.vendored_frameworks = 'ios/Frameworks/FaceTecSDK.xcframework'
30
-
31
- s.script_phase = {
32
- :name => 'Extract and prepare FaceTecSDK XCFramework',
33
- :script => 'bash "${PODS_TARGET_SRCROOT}/scripts/prepare-facetec-xcframework.sh"',
34
- :execution_position => :before_compile
35
- }
36
-
37
- s.pod_target_xcconfig = {
38
- 'DEFINES_MODULE' => 'YES',
39
- 'SWIFT_VERSION' => '5.0',
40
- 'FRAMEWORK_SEARCH_PATHS' => '$(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/soyio_rn_sdk"'
41
- }
42
-
43
- # Propagate FaceTecSDK to consumer so the linker resolves symbols
44
- s.user_target_xcconfig = {
45
- 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/Headers/Public/React-Core"',
46
- 'FRAMEWORK_SEARCH_PATHS' => '$(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/soyio_rn_sdk"',
47
- 'OTHER_LDFLAGS' => '$(inherited) -framework "FaceTecSDK"'
48
- }
49
-
50
- s.swift_version = '5.0'
51
- s.dependency 'React-Core'
52
- end