@regulaforensics/face-sdk 8.2.919-rc → 8.2.923-beta
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/RNFaceSDK.podspec +3 -3
- package/android/{CVDFaceSDK.kt → CDVFaceSDK.kt} +1 -1
- package/android/build.gradle +1 -1
- package/android/cordova.gradle +1 -1
- package/android/src/main/java/com/regula/plugin/facesdk/Config.kt +4 -0
- package/android/src/main/java/com/regula/plugin/facesdk/JSONConstructor.kt +12 -7
- package/android/src/main/java/com/regula/plugin/facesdk/Utils.kt +2 -3
- package/examples/capacitor/android/app/build.gradle +2 -2
- package/examples/capacitor/android/app/capacitor.build.gradle +2 -3
- package/examples/capacitor/android/app/src/main/AndroidManifest.xml +1 -1
- package/examples/capacitor/android/build.gradle +3 -3
- package/examples/capacitor/android/capacitor.settings.gradle +2 -5
- package/examples/capacitor/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/examples/capacitor/android/gradle/wrapper/gradle-wrapper.properties +1 -1
- package/examples/capacitor/android/gradlew +4 -5
- package/examples/capacitor/android/gradlew.bat +2 -2
- package/examples/capacitor/android/variables.gradle +10 -10
- package/examples/capacitor/ios/App/App.xcodeproj/project.pbxproj +20 -4
- package/examples/capacitor/ios/App/Podfile +5 -1
- package/examples/capacitor/ios/App/Podfile.lock +14 -14
- package/examples/capacitor/package-lock.json +817 -853
- package/examples/capacitor/package.json +17 -17
- package/examples/ionic/images/icon.png +0 -0
- package/examples/ionic/package-lock.json +8477 -8064
- package/examples/ionic/package.json +23 -14
- package/examples/ionic/patches/cordova-plugin-ionic-webview+5.0.1.patch +23 -0
- package/examples/ionic/scripts/ios.sh +1 -1
- package/examples/react_native/package-lock.json +1191 -1473
- package/examples/react_native/package.json +2 -2
- package/ios/CDVFaceSDK.swift +42 -0
- package/ios/Config.swift +245 -0
- package/ios/Decoder.swift +934 -0
- package/ios/Main.swift +191 -0
- package/ios/RNFaceSDK.m +7 -39
- package/ios/RNFaceSDK.swift +42 -0
- package/ios/Utils.swift +82 -0
- package/package.json +1 -1
- package/plugin.xml +10 -12
- package/test/json.tsx +16 -13
- package/test/package-lock.json +1 -1
- package/www/capacitor/customization/customization_images.js +47 -39
- package/www/capacitor/face_capture/face_capture_config.js +4 -0
- package/www/capacitor/liveness/liveness_config.js +4 -0
- package/www/cordova.js +55 -39
- package/www/react-native/customization/customization_images.js +47 -39
- package/www/react-native/face_capture/face_capture_config.js +4 -0
- package/www/react-native/liveness/liveness_config.js +4 -0
- package/www/types/customization/customization_images.d.ts +1 -0
- package/www/types/face_capture/face_capture_config.d.ts +6 -0
- package/www/types/liveness/liveness_config.d.ts +7 -0
- package/ios/CVDFaceSDK.h +0 -7
- package/ios/CVDFaceSDK.m +0 -43
- package/ios/RFSWConfig.h +0 -27
- package/ios/RFSWConfig.m +0 -199
- package/ios/RFSWJSONConstructor.h +0 -135
- package/ios/RFSWJSONConstructor.m +0 -985
- package/ios/RFSWMain.h +0 -24
- package/ios/RFSWMain.m +0 -381
- package/ios/RNFaceSDK.h +0 -8
package/ios/Main.swift
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import FaceSDK
|
|
2
|
+
|
|
3
|
+
let face = FaceSDK.service
|
|
4
|
+
let db = face.personDatabase
|
|
5
|
+
|
|
6
|
+
let cameraSwitchEvent = "cameraSwitchEvent"
|
|
7
|
+
let livenessNotificationEvent = "livenessNotificationEvent"
|
|
8
|
+
let videoEncoderCompletionEvent = "video_encoder_completion"
|
|
9
|
+
let onCustomButtonTappedEvent = "onCustomButtonTappedEvent"
|
|
10
|
+
|
|
11
|
+
func methodCall(_ method: String, _ callback: @escaping Callback) {
|
|
12
|
+
switch method {
|
|
13
|
+
case("getVersion"): callback(face.version?.encode())
|
|
14
|
+
case("getServiceUrl"): callback(face.serviceURL)
|
|
15
|
+
case("setServiceUrl"): face.serviceURL = argsNullable(0)
|
|
16
|
+
case("getTenant"): callback(face.tenant)
|
|
17
|
+
case("setTenant"): face.tenant = argsNullable(0)
|
|
18
|
+
case("getEnv"): callback(face.env)
|
|
19
|
+
case("setEnv"): face.env = argsNullable(0)
|
|
20
|
+
case("getLocale"): callback(face.languageLocaleCode)
|
|
21
|
+
case("setLocale"): face.languageLocaleCode = argsNullable(0)
|
|
22
|
+
case("setLocalizationDictionary"):
|
|
23
|
+
face.localizationHandler = { (argsNullable(0) as [String : String?]?)?[$0] ?? nil }
|
|
24
|
+
case("setRequestHeaders"):
|
|
25
|
+
headers = argsNullable(0)
|
|
26
|
+
face.requestInterceptingDelegate = headersDelegate
|
|
27
|
+
case("setCustomization"): setCustomization(args(0))
|
|
28
|
+
case("isInitialized"): callback(face.isInitialized)
|
|
29
|
+
case("initialize"): face.initialize(
|
|
30
|
+
configuration: InitializationConfiguration.decode(argsNullable(0)),
|
|
31
|
+
completion: { success, error in
|
|
32
|
+
if success {
|
|
33
|
+
face.customization.configuration = UIConfiguration.default()
|
|
34
|
+
face.videoUploadingDelegate = videoUploadingDelegate
|
|
35
|
+
face.faceCaptureDelegate = faceCaptureDelegate
|
|
36
|
+
face.livenessDelegate = livenessDelegate
|
|
37
|
+
face.customization.actionDelegate = actionDelegate
|
|
38
|
+
}
|
|
39
|
+
callback(generateInitCompletion(success, error))
|
|
40
|
+
})
|
|
41
|
+
case("deinitialize"): face.deinitialize()
|
|
42
|
+
case("startFaceCapture"): DispatchQueue.main.async {
|
|
43
|
+
face.presentFaceCaptureViewController(
|
|
44
|
+
from: rootViewController()!,
|
|
45
|
+
animated: true,
|
|
46
|
+
configuration: FaceCaptureConfiguration.decode(argsNullable(0)),
|
|
47
|
+
onCapture: { callback($0.encode()) },
|
|
48
|
+
completion: nil)
|
|
49
|
+
}
|
|
50
|
+
case("stopFaceCapture"): face.stopFaceCaptureViewController()
|
|
51
|
+
case("startLiveness"): DispatchQueue.main.async {
|
|
52
|
+
face.startLiveness(
|
|
53
|
+
from: rootViewController()!,
|
|
54
|
+
animated: true,
|
|
55
|
+
configuration: LivenessConfiguration.decode(argsNullable(0)),
|
|
56
|
+
onLiveness: { callback($0.encode()) },
|
|
57
|
+
completion: nil)
|
|
58
|
+
}
|
|
59
|
+
case("stopLiveness"): face.stopLivenessProcessing()
|
|
60
|
+
case("matchFaces"): face.matchFaces(
|
|
61
|
+
MatchFacesRequest.decode(args(0)),
|
|
62
|
+
configuration: MatchFacesConfiguration.decode(argsNullable(0)),
|
|
63
|
+
completion: { callback($0.encode()) })
|
|
64
|
+
case("splitComparedFaces"): callback(MatchFacesSimilarityThresholdSplit(
|
|
65
|
+
pairs: (args(0) as [[String: Any?]]).compactMap { MatchFacesComparedFacesPair.decode($0) },
|
|
66
|
+
bySimilarityThreshold: args(1)).encode())
|
|
67
|
+
case("detectFaces"): face.detectFaces(
|
|
68
|
+
by: DetectFacesRequest.decode(args(0)),
|
|
69
|
+
completion: { callback($0.encode()) })
|
|
70
|
+
|
|
71
|
+
// MARK: - PersonDatabase
|
|
72
|
+
|
|
73
|
+
case("createPerson"): db.createPerson(
|
|
74
|
+
name: args(0),
|
|
75
|
+
metadata: argsNullable(1),
|
|
76
|
+
groupIds: argsNullable(2),
|
|
77
|
+
completion: { callback($0.encode()) }
|
|
78
|
+
)
|
|
79
|
+
case("updatePerson"): let json = args(0) as [String: Any]
|
|
80
|
+
db.getPerson(
|
|
81
|
+
personId: json["id"] as! String,
|
|
82
|
+
completion: {
|
|
83
|
+
guard let person = $0.item else { callback($0.encode()); return }
|
|
84
|
+
db.updatePerson(person: person.update(json), completion: { callback($0.encode()) })
|
|
85
|
+
})
|
|
86
|
+
case("deletePerson"): db.deletePerson(personId: args(0), completion: { callback($0.encode()) })
|
|
87
|
+
case("getPerson"): db.getPerson(personId: args(0), completion: { callback($0.encode()) })
|
|
88
|
+
case("addPersonImage"): db.addPersonImage(
|
|
89
|
+
personId: args(0),
|
|
90
|
+
imageUpload: PersonDatabase.ImageUpload.decode(args(1))!,
|
|
91
|
+
completion: { callback($0.encode()) })
|
|
92
|
+
case("deletePersonImage"): db.deletePersonImage(
|
|
93
|
+
personId: args(0),
|
|
94
|
+
imageId: args(1),
|
|
95
|
+
completion: { callback($0.encode()) })
|
|
96
|
+
case("getPersonImage"): db.getPersonImage(
|
|
97
|
+
personId: args(0),
|
|
98
|
+
imageId: args(1),
|
|
99
|
+
completion: { callback(encodeDBItemResponse($0.data?.encode(), $0.error)) })
|
|
100
|
+
case("getPersonImages"): db.getPersonImages(personId: args(0), completion: { callback($0.encode())})
|
|
101
|
+
case("getPersonImagesForPage"): db.getPersonImages(
|
|
102
|
+
personId: args(0),
|
|
103
|
+
page: args(1),
|
|
104
|
+
size: args(2),
|
|
105
|
+
completion: { callback($0.encode()) })
|
|
106
|
+
case("createGroup"): db.createGroup(
|
|
107
|
+
name: args(0),
|
|
108
|
+
metadata: argsNullable(1) as [String: Any]?,
|
|
109
|
+
completion: { callback($0.encode()) })
|
|
110
|
+
case("updateGroup"): let json = args(0) as [String: Any]
|
|
111
|
+
db.getGroups(
|
|
112
|
+
groupId: json["id"] as! String,
|
|
113
|
+
completion: {
|
|
114
|
+
guard let group = $0.item else { callback($0.encode()); return }
|
|
115
|
+
db.updateGroup(group: group.update(json), completion: { callback($0.encode()) })
|
|
116
|
+
})
|
|
117
|
+
case("editPersonsInGroup"): db.editGroupPersons(
|
|
118
|
+
groupId: args(0),
|
|
119
|
+
request: PersonDatabase.EditGroupPersonsRequest.decode(args(0)),
|
|
120
|
+
completion: { callback($0.encode()) })
|
|
121
|
+
case("deleteGroup"): db.deleteGroup(groupId: args(0), completion: { callback($0.encode()) })
|
|
122
|
+
case("getGroup"): db.getGroups(groupId: args(0), completion: { callback($0.encode()) })
|
|
123
|
+
case("getGroups"): db.getGroups(completion: { callback($0.encode()) })
|
|
124
|
+
case("getGroupsForPage"): db.getGroups(
|
|
125
|
+
page: args(0),
|
|
126
|
+
size: args(1),
|
|
127
|
+
completion: { callback($0.encode()) })
|
|
128
|
+
case("getPersonGroups"): db.getPersonGroups(personId: args(0), completion: { callback($0.encode()) })
|
|
129
|
+
case("getPersonGroupsForPage"): db.getPersonGroups(
|
|
130
|
+
personId: args(0),
|
|
131
|
+
page: args(1),
|
|
132
|
+
size: args(2),
|
|
133
|
+
completion: { callback($0.encode()) })
|
|
134
|
+
case("getPersonsInGroup"): db.getGroupPersons(groupId: args(0), completion: { callback($0.encode()) })
|
|
135
|
+
case("getPersonsInGroupForPage"): db.getGroupPersons(
|
|
136
|
+
groupId: args(0),
|
|
137
|
+
page: args(1),
|
|
138
|
+
size: args(2),
|
|
139
|
+
completion: { callback($0.encode()) })
|
|
140
|
+
case("searchPerson"): db.searchPerson(
|
|
141
|
+
searchRequest: PersonDatabase.SearchPersonRequest.decode(args(0)),
|
|
142
|
+
completion: { callback(encodeDBItemResponse($0.results?.compactMap{ $0.encode2() }, $0.error)) })
|
|
143
|
+
default: break
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// MARK: - Implementation
|
|
148
|
+
|
|
149
|
+
var headers: [String: String]?
|
|
150
|
+
let headersDelegate = IURLRequestInterceptingDelegate()
|
|
151
|
+
class IURLRequestInterceptingDelegate: NSObject, URLRequestInterceptingDelegate {
|
|
152
|
+
func interceptorPrepare(_ request: URLRequest) -> URLRequest? {
|
|
153
|
+
guard let headers = headers else { return request }
|
|
154
|
+
var req = request
|
|
155
|
+
for (key, value) in headers {
|
|
156
|
+
req.addValue(value, forHTTPHeaderField: key)
|
|
157
|
+
}
|
|
158
|
+
return req
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
let videoUploadingDelegate = IVideoUploadingDelegate()
|
|
163
|
+
class IVideoUploadingDelegate: NSObject, VideoUploadingDelegate {
|
|
164
|
+
func videoUploading(forTransactionId transactionId: String, didFinishedWithSuccess success: Bool) {
|
|
165
|
+
sendEvent(videoEncoderCompletionEvent, generateVideoEncoderCompletion(success, transactionId))
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
let faceCaptureDelegate = IFaceCaptureDelegate()
|
|
170
|
+
class IFaceCaptureDelegate: NSObject, FaceCaptureDelegate {
|
|
171
|
+
func cameraPositionChanged(_ cameraPosition: CameraPosition) {
|
|
172
|
+
sendEvent(cameraSwitchEvent, cameraPosition)
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
let livenessDelegate = ILivenessDelegate()
|
|
177
|
+
class ILivenessDelegate: NSObject, LivenessDelegate {
|
|
178
|
+
func processStatusChanged(_ status: LivenessProcessStatus, result: LivenessResponse?) {
|
|
179
|
+
sendEvent(livenessNotificationEvent, generateLivenessNotification(status, result))
|
|
180
|
+
}
|
|
181
|
+
func cameraPositionChanged(_ cameraPosition: CameraPosition) {
|
|
182
|
+
sendEvent(cameraSwitchEvent, cameraPosition)
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
let actionDelegate = ICustomizationActionDelegate()
|
|
187
|
+
class ICustomizationActionDelegate: NSObject, FaceSDK.CustomizationActionDelegate {
|
|
188
|
+
func onFaceCustomButtonTapped(withTag tag: Int) {
|
|
189
|
+
sendEvent(onCustomButtonTappedEvent, tag)
|
|
190
|
+
}
|
|
191
|
+
}
|
package/ios/RNFaceSDK.m
CHANGED
|
@@ -1,43 +1,11 @@
|
|
|
1
|
-
#import
|
|
1
|
+
#import <React/RCTEventEmitter.h>
|
|
2
|
+
#import <React/RCTBridgeModule.h>
|
|
2
3
|
|
|
3
|
-
@
|
|
4
|
-
RCT_EXPORT_MODULE();
|
|
4
|
+
@interface RCT_EXTERN_MODULE(RNFaceSDK, RCTEventEmitter)
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
- (NSArray<NSString*>*)supportedEvents {
|
|
13
|
-
return @[cameraSwitchEvent,
|
|
14
|
-
livenessNotificationEvent,
|
|
15
|
-
videoEncoderCompletionEvent,
|
|
16
|
-
onCustomButtonTappedEvent];
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
static bool hasListeners;
|
|
20
|
-
- (void)startObserving { hasListeners = YES; }
|
|
21
|
-
- (void)stopObserving { hasListeners = NO; }
|
|
22
|
-
|
|
23
|
-
UIViewController*(^RFSWRootViewController)(void) = ^UIViewController*(){
|
|
24
|
-
return RCTPresentedViewController();
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
RCT_EXPORT_METHOD(exec:(NSString*)method:(NSArray*)args:(RCTPromiseResolveBlock)resolve:(RCTPromiseRejectBlock)reject) {
|
|
28
|
-
RFSWCallback callback = ^(id _Nullable data) {
|
|
29
|
-
if ([self.firedCallbacks containsObject:resolve]) return;
|
|
30
|
-
[self.firedCallbacks addObject:resolve];
|
|
31
|
-
resolve([RFSWJSONConstructor toSendable:data]);
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
RFSWEventSender sendEvent = ^(NSString* event, id data) {
|
|
35
|
-
dispatch_async(dispatch_get_main_queue(), ^{
|
|
36
|
-
if (hasListeners) [self sendEventWithName:event body:[RFSWJSONConstructor toSendable:data]];
|
|
37
|
-
});
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
[RFSWMain methodCall:method :args :callback :sendEvent];
|
|
41
|
-
}
|
|
6
|
+
RCT_EXTERN_METHOD(exec: (NSString*)method
|
|
7
|
+
newArgs:(NSArray*)newArgs
|
|
8
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
9
|
+
reject:(RCTPromiseRejectBlock)reject)
|
|
42
10
|
|
|
43
11
|
@end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React
|
|
2
|
+
|
|
3
|
+
@objc(RNFaceSDK)
|
|
4
|
+
public class RNFaceSDK: RCTEventEmitter {
|
|
5
|
+
override public func startObserving() { hasListeners = true }
|
|
6
|
+
override public func stopObserving() { hasListeners = false }
|
|
7
|
+
override public func supportedEvents()->[String] {
|
|
8
|
+
return [cameraSwitchEvent,
|
|
9
|
+
livenessNotificationEvent,
|
|
10
|
+
videoEncoderCompletionEvent,
|
|
11
|
+
onCustomButtonTappedEvent];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@objc
|
|
15
|
+
func exec(
|
|
16
|
+
_ method: String,
|
|
17
|
+
newArgs: [Any],
|
|
18
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
19
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
20
|
+
) {
|
|
21
|
+
this = self
|
|
22
|
+
args = newArgs
|
|
23
|
+
methodCall(method, { data in
|
|
24
|
+
if firedCallbacks.contains(where: { ($0 as AnyObject) === (resolve as AnyObject) }) { return }
|
|
25
|
+
firedCallbacks.append(resolve)
|
|
26
|
+
resolve(data.toSendable())
|
|
27
|
+
})
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private var firedCallbacks: [RCTResponseSenderBlock] = []
|
|
32
|
+
private var hasListeners: Bool = false
|
|
33
|
+
private var this: RNFaceSDK?
|
|
34
|
+
|
|
35
|
+
func sendEvent(_ event: String, _ data: Any? = nil) {
|
|
36
|
+
guard let plugin = this, hasListeners else { return }
|
|
37
|
+
DispatchQueue.main.async {
|
|
38
|
+
plugin.sendEvent(withName: event, body: data.toSendable())
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
let rootViewController: () -> UIViewController? = { return RCTPresentedViewController() }
|
package/ios/Utils.swift
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
public typealias Callback = (Any?) -> Void
|
|
2
|
+
|
|
3
|
+
var args: [Any?] = []
|
|
4
|
+
func args<T>(_ index: Int) -> T {
|
|
5
|
+
return args[index] as! T
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
func argsNullable<T>(_ index: Int) -> T? {
|
|
9
|
+
if args[index] is NSNull { return nil }
|
|
10
|
+
return args[index] as! T?
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
extension Any? {
|
|
14
|
+
func toSendable() -> Any {
|
|
15
|
+
guard let self else { return NSNull() }
|
|
16
|
+
if self is [String: Any?] || self is [Any?] {
|
|
17
|
+
let data = try! JSONSerialization.data(withJSONObject: fixNulls(self), options: .prettyPrinted)
|
|
18
|
+
return String(data: data, encoding: .utf8)!
|
|
19
|
+
}
|
|
20
|
+
return self
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
func fixNulls(_ value: Any?) -> Any {
|
|
25
|
+
guard let value else { return NSNull() }
|
|
26
|
+
switch value {
|
|
27
|
+
case let value as [String: Any]:
|
|
28
|
+
var dict = [String: Any]()
|
|
29
|
+
for (k, v) in value { dict[k] = fixNulls(v) }
|
|
30
|
+
return dict
|
|
31
|
+
case let value as [Any]: return value.map { fixNulls($0) }
|
|
32
|
+
default: return value
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
extension NSObject {
|
|
37
|
+
static func allocate() -> NSObject {
|
|
38
|
+
return perform(NSSelectorFromString("alloc")).takeUnretainedValue() as! NSObject
|
|
39
|
+
}
|
|
40
|
+
static func emptyInit<T>() -> T {
|
|
41
|
+
return allocate().perform("init".selector()).takeUnretainedValue() as! T
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
extension String {
|
|
46
|
+
func selector() -> Selector {
|
|
47
|
+
return NSSelectorFromString(self)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
func privateInit<T, Fn>(
|
|
52
|
+
_ allocated: NSObject,
|
|
53
|
+
_ selector: Selector,
|
|
54
|
+
_ function: Fn.Type,
|
|
55
|
+
_ call: (Fn) -> Unmanaged<AnyObject>?
|
|
56
|
+
) -> T {
|
|
57
|
+
let f = unsafeBitCast(allocated.method(for: selector), to: function)
|
|
58
|
+
return call(f)!.takeUnretainedValue() as! T
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
extension Data {
|
|
62
|
+
static func decode(_ it: Any?) -> Self? {
|
|
63
|
+
guard var it = it as? String else { return nil }
|
|
64
|
+
if it.hasPrefix("data") { it = String(it[it.index(after: it.firstIndex(of: ",")!)...]) }
|
|
65
|
+
return Self(base64Encoded: it)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
func encode() -> String {
|
|
69
|
+
return self.base64EncodedString()
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
extension UIImage {
|
|
74
|
+
static func decode(_ it: Any?) -> Self? {
|
|
75
|
+
guard let it = it as? String else { return nil }
|
|
76
|
+
return Self(data: Data.decode(it)!)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
func encode() -> String {
|
|
80
|
+
return self.pngData()!.encode()
|
|
81
|
+
}
|
|
82
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@regulaforensics/face-sdk",
|
|
3
|
-
"version": "8.2.
|
|
3
|
+
"version": "8.2.923-beta",
|
|
4
4
|
"description": "This is an npm module for Regula Face SDK. It allows you to easily compaire faces using your phone's camera.",
|
|
5
5
|
"main": "www/react-native/index.js",
|
|
6
6
|
"module": "www/capacitor/index.js",
|
package/plugin.xml
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<?xml version='1.0' encoding='utf-8'?>
|
|
2
|
-
<plugin id="@regulaforensics/face-sdk" version="8.2.
|
|
2
|
+
<plugin id="@regulaforensics/face-sdk" version="8.2.923-beta" xmlns="http://apache.org/cordova/ns/plugins/1.0">
|
|
3
3
|
<name>FaceSDK</name>
|
|
4
4
|
<description>Cordova plugin for Regula Face SDK</description>
|
|
5
5
|
<license>commercial</license>
|
|
@@ -12,18 +12,16 @@
|
|
|
12
12
|
<platform name="ios">
|
|
13
13
|
<config-file target="config.xml" parent="/widget">
|
|
14
14
|
<feature name="FaceSDK">
|
|
15
|
-
<param name="ios-package" value="
|
|
15
|
+
<param name="ios-package" value="CDVFaceSDK" />
|
|
16
16
|
</feature>
|
|
17
17
|
<preference name="deployment-target" value="13.0" />
|
|
18
|
+
<preference name="SwiftVersion" value="5" />
|
|
18
19
|
</config-file>
|
|
19
|
-
<
|
|
20
|
-
<source-file src="ios/
|
|
21
|
-
<
|
|
22
|
-
<source-file src="ios/
|
|
23
|
-
<
|
|
24
|
-
<source-file src="ios/RFSWJSONConstructor.m" />
|
|
25
|
-
<header-file src="ios/RFSWConfig.h" />
|
|
26
|
-
<source-file src="ios/RFSWConfig.m" />
|
|
20
|
+
<source-file src="ios/CDVFaceSDK.swift" />
|
|
21
|
+
<source-file src="ios/Main.swift" />
|
|
22
|
+
<source-file src="ios/Decoder.swift" />
|
|
23
|
+
<source-file src="ios/Config.swift" />
|
|
24
|
+
<source-file src="ios/Utils.swift" />
|
|
27
25
|
<podspec>
|
|
28
26
|
<config>
|
|
29
27
|
<source url="https://github.com/CocoaPods/Specs.git" />
|
|
@@ -37,11 +35,11 @@
|
|
|
37
35
|
<platform name="android">
|
|
38
36
|
<config-file parent="/*" target="res/xml/config.xml">
|
|
39
37
|
<feature name="FaceSDK">
|
|
40
|
-
<param name="android-package" value="com.regula.plugin.facesdk.
|
|
38
|
+
<param name="android-package" value="com.regula.plugin.facesdk.CDVFaceSDK" />
|
|
41
39
|
</feature>
|
|
42
40
|
</config-file>
|
|
43
41
|
<framework src="android/cordova.gradle" custom="true" type="gradleReference" />
|
|
44
|
-
<source-file src="android/
|
|
42
|
+
<source-file src="android/CDVFaceSDK.kt" target-dir="java/com.regula.plugin.facesdk" />
|
|
45
43
|
<source-file src="android/src/main/java/com/regula/plugin/facesdk/Main.kt" target-dir="java/com.regula.plugin.facesdk" />
|
|
46
44
|
<source-file src="android/src/main/java/com/regula/plugin/facesdk/JSONConstructor.kt" target-dir="java/com.regula.plugin.facesdk" />
|
|
47
45
|
<source-file src="android/src/main/java/com/regula/plugin/facesdk/Config.kt" target-dir="java/com.regula.plugin.facesdk" />
|
package/test/json.tsx
CHANGED
|
@@ -47,19 +47,20 @@ export var customizationFonts = {
|
|
|
47
47
|
"400": font2,
|
|
48
48
|
}
|
|
49
49
|
export var customizationImages = {
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
50
|
+
"onboardingScreenCloseButton": img1,
|
|
51
|
+
"onboardingScreenIllumination": img2,
|
|
52
|
+
"onboardingScreenAccessories": img3,
|
|
53
|
+
"onboardingScreenCameraLevel": img1,
|
|
54
|
+
"cameraScreenCloseButton": img2,
|
|
55
|
+
"cameraScreenLightOnButton": img3,
|
|
56
|
+
"cameraScreenLightOffButton": img1,
|
|
57
|
+
"cameraScreenSwitchButton": img2,
|
|
58
|
+
"retryScreenCloseButton": img3,
|
|
59
|
+
"retryScreenHintEnvironment": img1,
|
|
60
|
+
"retryScreenHintSubject": img2,
|
|
61
|
+
"retryScreenHintGeo": img3,
|
|
62
|
+
"processingScreenCloseButton": img1,
|
|
63
|
+
"successScreenImage": img2,
|
|
63
64
|
}
|
|
64
65
|
export var customization = {
|
|
65
66
|
"colors": customizationColors,
|
|
@@ -168,6 +169,7 @@ export var faceCaptureConfig = {
|
|
|
168
169
|
"vibrateOnSteps": true,
|
|
169
170
|
"detectOcclusion": false,
|
|
170
171
|
"showFaceAnimation": true,
|
|
172
|
+
"preventScreenRecording": false,
|
|
171
173
|
"cameraPositionAndroid": 0,
|
|
172
174
|
"cameraPositionIOS": 1,
|
|
173
175
|
"screenOrientation": [0, 1],
|
|
@@ -218,6 +220,7 @@ export var livenessConfig = {
|
|
|
218
220
|
"cameraPositionIOS": 1,
|
|
219
221
|
"screenOrientation": [0, 1],
|
|
220
222
|
"locationTrackingEnabled": true,
|
|
223
|
+
"preventScreenRecording": false,
|
|
221
224
|
"attemptsCount": 2,
|
|
222
225
|
"recordingProcess": 0,
|
|
223
226
|
"livenessType": 1,
|
package/test/package-lock.json
CHANGED
|
@@ -4,116 +4,124 @@ export class CustomizationImages {
|
|
|
4
4
|
_onboardingScreenCloseButton
|
|
5
5
|
set onboardingScreenCloseButton(val) {
|
|
6
6
|
this._onboardingScreenCloseButton = val
|
|
7
|
-
this._set({ "
|
|
7
|
+
this._set({ "onboardingScreenCloseButton": val })
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
_onboardingScreenIllumination
|
|
11
11
|
set onboardingScreenIllumination(val) {
|
|
12
12
|
this._onboardingScreenIllumination = val
|
|
13
|
-
this._set({ "
|
|
13
|
+
this._set({ "onboardingScreenIllumination": val })
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
_onboardingScreenAccessories
|
|
17
17
|
set onboardingScreenAccessories(val) {
|
|
18
18
|
this._onboardingScreenAccessories = val
|
|
19
|
-
this._set({ "
|
|
19
|
+
this._set({ "onboardingScreenAccessories": val })
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
_onboardingScreenCameraLevel
|
|
23
23
|
set onboardingScreenCameraLevel(val) {
|
|
24
24
|
this._onboardingScreenCameraLevel = val
|
|
25
|
-
this._set({ "
|
|
25
|
+
this._set({ "onboardingScreenCameraLevel": val })
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
_cameraScreenCloseButton
|
|
29
29
|
set cameraScreenCloseButton(val) {
|
|
30
30
|
this._cameraScreenCloseButton = val
|
|
31
|
-
this._set({ "
|
|
31
|
+
this._set({ "cameraScreenCloseButton": val })
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
_cameraScreenLightOnButton
|
|
35
35
|
set cameraScreenLightOnButton(val) {
|
|
36
36
|
this._cameraScreenLightOnButton = val
|
|
37
|
-
this._set({ "
|
|
37
|
+
this._set({ "cameraScreenLightOnButton": val })
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
_cameraScreenLightOffButton
|
|
41
41
|
set cameraScreenLightOffButton(val) {
|
|
42
42
|
this._cameraScreenLightOffButton = val
|
|
43
|
-
this._set({ "
|
|
43
|
+
this._set({ "cameraScreenLightOffButton": val })
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
_cameraScreenSwitchButton
|
|
47
47
|
set cameraScreenSwitchButton(val) {
|
|
48
48
|
this._cameraScreenSwitchButton = val
|
|
49
|
-
this._set({ "
|
|
49
|
+
this._set({ "cameraScreenSwitchButton": val })
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
_retryScreenCloseButton
|
|
53
53
|
set retryScreenCloseButton(val) {
|
|
54
54
|
this._retryScreenCloseButton = val
|
|
55
|
-
this._set({ "
|
|
55
|
+
this._set({ "retryScreenCloseButton": val })
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
_retryScreenHintEnvironment
|
|
59
59
|
set retryScreenHintEnvironment(val) {
|
|
60
60
|
this._retryScreenHintEnvironment = val
|
|
61
|
-
this._set({ "
|
|
61
|
+
this._set({ "retryScreenHintEnvironment": val })
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
_retryScreenHintSubject
|
|
65
65
|
set retryScreenHintSubject(val) {
|
|
66
66
|
this._retryScreenHintSubject = val
|
|
67
|
-
this._set({ "
|
|
67
|
+
this._set({ "retryScreenHintSubject": val })
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
_retryScreenHintGeo
|
|
71
|
+
set retryScreenHintGeo(val) {
|
|
72
|
+
this._retryScreenHintGeo = val
|
|
73
|
+
this._set({ "retryScreenHintGeo": val })
|
|
68
74
|
}
|
|
69
75
|
|
|
70
76
|
_processingScreenCloseButton
|
|
71
77
|
set processingScreenCloseButton(val) {
|
|
72
78
|
this._processingScreenCloseButton = val
|
|
73
|
-
this._set({ "
|
|
79
|
+
this._set({ "processingScreenCloseButton": val })
|
|
74
80
|
}
|
|
75
81
|
|
|
76
82
|
_successScreenImage
|
|
77
83
|
set successScreenImage(val) {
|
|
78
84
|
this._successScreenImage = val
|
|
79
|
-
this._set({ "
|
|
85
|
+
this._set({ "successScreenImage": val })
|
|
80
86
|
}
|
|
81
87
|
|
|
82
88
|
static fromJson(jsonObject) {
|
|
83
89
|
var result = new CustomizationImages()
|
|
84
90
|
|
|
85
|
-
result._onboardingScreenCloseButton = jsonObject["
|
|
86
|
-
result._onboardingScreenIllumination = jsonObject["
|
|
87
|
-
result._onboardingScreenAccessories = jsonObject["
|
|
88
|
-
result._onboardingScreenCameraLevel = jsonObject["
|
|
89
|
-
result._cameraScreenCloseButton = jsonObject["
|
|
90
|
-
result._cameraScreenLightOnButton = jsonObject["
|
|
91
|
-
result._cameraScreenLightOffButton = jsonObject["
|
|
92
|
-
result._cameraScreenSwitchButton = jsonObject["
|
|
93
|
-
result._retryScreenCloseButton = jsonObject["
|
|
94
|
-
result._retryScreenHintEnvironment = jsonObject["
|
|
95
|
-
result._retryScreenHintSubject = jsonObject["
|
|
96
|
-
result.
|
|
97
|
-
result.
|
|
91
|
+
result._onboardingScreenCloseButton = jsonObject["onboardingScreenCloseButton"]
|
|
92
|
+
result._onboardingScreenIllumination = jsonObject["onboardingScreenIllumination"]
|
|
93
|
+
result._onboardingScreenAccessories = jsonObject["onboardingScreenAccessories"]
|
|
94
|
+
result._onboardingScreenCameraLevel = jsonObject["onboardingScreenCameraLevel"]
|
|
95
|
+
result._cameraScreenCloseButton = jsonObject["cameraScreenCloseButton"]
|
|
96
|
+
result._cameraScreenLightOnButton = jsonObject["cameraScreenLightOnButton"]
|
|
97
|
+
result._cameraScreenLightOffButton = jsonObject["cameraScreenLightOffButton"]
|
|
98
|
+
result._cameraScreenSwitchButton = jsonObject["cameraScreenSwitchButton"]
|
|
99
|
+
result._retryScreenCloseButton = jsonObject["retryScreenCloseButton"]
|
|
100
|
+
result._retryScreenHintEnvironment = jsonObject["retryScreenHintEnvironment"]
|
|
101
|
+
result._retryScreenHintSubject = jsonObject["retryScreenHintSubject"]
|
|
102
|
+
result._retryScreenHintGeo = jsonObject["retryScreenHintGeo"]
|
|
103
|
+
result._processingScreenCloseButton = jsonObject["processingScreenCloseButton"]
|
|
104
|
+
result._successScreenImage = jsonObject["successScreenImage"]
|
|
98
105
|
|
|
99
106
|
return result
|
|
100
107
|
}
|
|
101
108
|
|
|
102
109
|
toJson() {
|
|
103
110
|
return {
|
|
104
|
-
"
|
|
105
|
-
"
|
|
106
|
-
"
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
"
|
|
110
|
-
"
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"
|
|
115
|
-
"
|
|
116
|
-
"
|
|
111
|
+
"onboardingScreenCloseButton": this._onboardingScreenCloseButton,
|
|
112
|
+
"onboardingScreenIllumination": this._onboardingScreenIllumination,
|
|
113
|
+
"onboardingScreenAccessories": this._onboardingScreenAccessories,
|
|
114
|
+
"onboardingScreenCameraLevel": this._onboardingScreenCameraLevel,
|
|
115
|
+
"cameraScreenCloseButton": this._cameraScreenCloseButton,
|
|
116
|
+
"cameraScreenLightOnButton": this._cameraScreenLightOnButton,
|
|
117
|
+
"cameraScreenLightOffButton": this._cameraScreenLightOffButton,
|
|
118
|
+
"cameraScreenSwitchButton": this._cameraScreenSwitchButton,
|
|
119
|
+
"retryScreenCloseButton": this._retryScreenCloseButton,
|
|
120
|
+
"retryScreenHintEnvironment": this._retryScreenHintEnvironment,
|
|
121
|
+
"retryScreenHintSubject": this._retryScreenHintSubject,
|
|
122
|
+
"retryScreenHintGeo": this._retryScreenHintGeo,
|
|
123
|
+
"processingScreenCloseButton": this._processingScreenCloseButton,
|
|
124
|
+
"successScreenImage": this._successScreenImage,
|
|
117
125
|
}
|
|
118
126
|
}
|
|
119
127
|
|