@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.
- package/README.md +28 -112
- package/package/src/bridges/facetec.js +16 -8
- package/package/src/bridges/facetec.js.map +1 -1
- package/package.json +9 -7
- package/android/build.gradle +0 -57
- package/android/libs/facetec-sdk-9.7.114.aar +0 -0
- package/android/src/main/AndroidManifest.xml +0 -8
- package/android/src/main/java/com/soyio/soyiorndk/AndroidFacetecSdkModule.kt +0 -224
- package/android/src/main/java/com/soyio/soyiorndk/AndroidFacetecSdkPackage.kt +0 -16
- package/android/src/main/java/com/soyio/soyiorndk/ApiDate.kt +0 -5
- package/android/src/main/java/com/soyio/soyiorndk/BaseFaceTecProcessor.kt +0 -75
- package/android/src/main/java/com/soyio/soyiorndk/FaceTecRequestService.kt +0 -115
- package/android/src/main/java/com/soyio/soyiorndk/FacetecConfig.kt +0 -311
- package/android/src/main/java/com/soyio/soyiorndk/SoyioIdOnlyProcessor.kt +0 -81
- package/android/src/main/java/com/soyio/soyiorndk/SoyioValidationProcessor.kt +0 -136
- package/android/src/main/res/drawable-nodpi/soyio_facetec_close.png +0 -0
- package/android/src/main/res/drawable-nodpi/soyio_facetec_id_front.png +0 -0
- package/android/src/main/res/values/strings.xml +0 -134
- package/assets/adaptive-icon.png +0 -0
- package/assets/favicon.png +0 -0
- package/assets/fonts/RobotoFlex.ttf +0 -0
- package/assets/icon.png +0 -0
- package/assets/images/SoyioRnSdk.xcassets/facetec-close.imageset/Contents.json +0 -23
- package/assets/images/SoyioRnSdk.xcassets/facetec-close.imageset/facetec-close@1x.png +0 -0
- package/assets/images/SoyioRnSdk.xcassets/facetec-close.imageset/facetec-close@2x.png +0 -0
- package/assets/images/SoyioRnSdk.xcassets/facetec-close.imageset/facetec-close@3x.png +0 -0
- package/assets/images/SoyioRnSdk.xcassets/facetec-id-front.imageset/Contents.json +0 -23
- package/assets/images/SoyioRnSdk.xcassets/facetec-id-front.imageset/facetec-id-front@1x.png +0 -0
- package/assets/images/SoyioRnSdk.xcassets/facetec-id-front.imageset/facetec-id-front@2x.png +0 -0
- package/assets/images/SoyioRnSdk.xcassets/facetec-id-front.imageset/facetec-id-front@3x.png +0 -0
- package/assets/splash.png +0 -0
- package/ios/ApiDate.swift +0 -5
- package/ios/FacetecConfig.swift +0 -217
- package/ios/FacetecStrings.swift +0 -139
- package/ios/Frameworks/FaceTecSDK.xcframework/Info.plist +0 -44
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Assets.car +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/FaceTecSDK +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/GenericGuidanceContentLayout.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Headers/FaceTecPublicApi.h +0 -1935
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Headers/FaceTecPublicStringKeys.h +0 -109
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Headers/FaceTecSDK.h +0 -16
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Info.plist +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Modules/module.modulemap +0 -6
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/PrivacyInfo.xcprivacy +0 -29
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/ReadyScreenGuidanceContentLayout.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/RetryScreenGuidanceContentLayout.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/SharedGuidanceLayout.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/9Uo-4b-JiE-view-Ae0-rb-UqS.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/CJ6-MX-bJp-view-8JL-Rc-0g1.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/FaceScanViewController.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/FaceTecAdditionalReviewViewController.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/FaceTecIDFeedbackViewController.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/FaceTecOCRConfirmationViewController.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/IDCaptureViewController.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/IDSelectionViewController.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/Info.plist +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/Pyw-6G-JSY-view-Zue-Eo-Q2U.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/QWA-8Y-vUM-view-wJB-Z5-eD2.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/alz-Ia-X3d-view-IKu-EI-Hug.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/Storyboard.storyboardc/l2Q-cc-kD8-view-UUy-6c-meu.nib +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/_CodeSignature/CodeResources +0 -729
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/af.lproj/FaceTec.strings +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/ar.lproj/FaceTec.strings +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/attributions.txt +0 -462
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/1f5b84f51ce0fcfbb76e904b7bcaa7560f601e1394a0b29367a09385312287eb +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/2b075ac1a6132b5b8a4c9ef0ba6b0cd84db7838aca9a000e50d907f40770a4ab +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/59cc2a9af81aaca2376702c2490650f4da2775fa673274db98aad41b7ef101c0 +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/5b63e98b991aedabb60665503384f30bffd939decf9433883b30b78011ee501a +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/66388dc76dc16bc6b76b682edd218a575bf45b9b +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/6b3133f0f39ff89a2a169d61176ee17cafacc5e288f334e2b64ee82892d11ccd +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/9077d16225f9314163ef1e7db6fc7d4088bb903d134bd95f23d5591ca4dfbfca +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/a74f2afb9d20f2375ccbd14e67c094b85c89ceb608f7cf8ae04f3f646a6c5672 +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/b501893e75f62ee1707643e35b21109927b07ed5b202321c961b424cbc2e4695 +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/dbd7a353f0130bb983d6ba05917e9be991d70e8f028df4b74e30bc6497ef7f71 +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/f2.xml +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/fd6d368a5658496536e2bfae170d1b823a3629b242cafc09784bfba4e56d8c80 +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/marker +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/vu0ilin6we3lrzo5f83f7qs2jul4aq7v4aoynrmch8zfvpi8ezrfyafa4t0fx87l +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/de.lproj/FaceTec.strings +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/el.lproj/FaceTec.strings +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/en.lproj/FaceTec.strings +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/es.lproj/FaceTec.strings +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/fr.lproj/FaceTec.strings +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/kk.lproj/FaceTec.strings +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/nb.lproj/FaceTec.strings +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/pt-BR.lproj/FaceTec.strings +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/ru.lproj/FaceTec.strings +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64/FaceTecSDK.framework/strip-unused-architectures-from-target.sh +0 -62
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/FaceTecSDK +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/Headers/FaceTecPublicApi.h +0 -1935
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/Headers/FaceTecPublicStringKeys.h +0 -109
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/Headers/FaceTecSDK.h +0 -16
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/Info.plist +0 -0
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/Modules/module.modulemap +0 -6
- package/ios/Frameworks/FaceTecSDK.xcframework/ios-arm64_x86_64-simulator/FaceTecSDK.framework/_CodeSignature/CodeResources +0 -146
- package/ios/IOSFacetecSdk.m +0 -22
- package/ios/IOSFacetecSdk.swift +0 -221
- package/ios/ProcessorProtocol.swift +0 -6
- package/ios/SoyioIDOnlyProcessor.swift +0 -170
- package/ios/SoyioPhotoIDMatchProcessor.swift +0 -264
- package/package/package.json +0 -68
- package/react-native.config.js +0 -12
- package/scripts/prepare-facetec-xcframework.sh +0 -38
- 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
|
-
}
|
package/package/package.json
DELETED
|
@@ -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
|
-
}
|
package/react-native.config.js
DELETED
|
@@ -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
|
package/soyio_rn_sdk.podspec
DELETED
|
@@ -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
|