iOS Liveness SDK *New
iOS Compact Version "0.1.3"
Installation
pod 'YouverifyLivenessSDKCompat'Usage
3
Start the liveness process
yvLiveness.startSDK(tasks: tasks)
// add the liveness view controller to the current view controller
DispatchQueue.main.async {
self.addLivenessViewController()
}let livenessTasks = [
TaskProperties(task:
YVTask.completeTheCircle(CompleteTheCircleTask(difficulty: .medium))
)
]
yvLiveness.startSDK(tasks: livenessTasks)4
Add and remove the liveness view controller
private var livenessViewController: YVLivenessViewController?
private func addLivenessViewController() {
guard livenessViewController == nil else { return } // Prevent duplicate adds
let vc = YVLivenessViewController(sdk: yvLiveness)
vc.delegate = self
addChild(vc)
view.addSubview(vc.view)
vc.didMove(toParent: self)
livenessViewController = vc
}
private func removeLivenessViewController() {
guard let vc = livenessViewController else { return }
vc.willMove(toParent: nil)
vc.view.removeFromSuperview()
vc.removeFromParent()
livenessViewController = nil
}Full Example
import YouverifyLivenessSDK
class MainViewController: UIViewController {
var yvLiveness: YVLiveness?
private var livenessViewController: YVLivenessViewController?
override func viewDidLoad() {
super.viewDidLoad()
initializeSDK()
// Create a vertical stack view
let stackView = UIStackView()
stackView.axis = .vertical
stackView.spacing = 10
stackView.translatesAutoresizingMaskIntoConstraints = false
// Create buttons
let completeCircleButton = createButton(title: "Complete the Circle", action: #selector(completeTheCircleTapped))
// Add buttons to stack view
stackView.addArrangedSubview(completeCircleButton)
// Add stack view to the main view
view.addSubview(stackView)
// Set Auto Layout constraints
NSLayoutConstraint.activate([
stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20)
])
}
private func initializeSDK() {
// start loading...
ApiClient.shared.generateSessionId(publicMerchantID: publicMerchantID,
apiToken: apiToken) { [weak self] result in
switch result {
case .success(let sessionId):
// Now get token
ApiClient.shared.generateSessionToken(publicMerchantID: publicMerchantID,
deviceCorrelationId: sessionId,
apiToken: apiToken) { result in
switch result {
case .success(let authToken):
// end loading
DispatchQueue.main.async {
self?.yvLiveness = YVLiveness(
publicKey: publicMerchantID,
user: YVLivenessUser(firstName: "John"),
onSuccess: { data in
print("The success data is \(data)")
},
onFailure: { errorData in
if let error = errorData.error {
if error.key == "invalid_or_expired_session" {
print("Session expired, retrying...")
self?.initializeSDK()
} else if error.key == "session_token_error" {
print("Session token error, retrying...")
self?.initializeSDK()
}
}
},
sessionId: sessionId,
sessionToken: authToken
)
}
case .failure(let error):
print("Token failed:", error)
}
}
case .failure(let error):
print("Session failed:", error)
}
}
}
private func addLivenessViewController() {
guard livenessViewController == nil else { return } // Prevent duplicate adds
guard let yvLiveness = yvLiveness else { return }
let vc = YVLivenessViewController(sdk: yvLiveness)
vc.delegate = self
addChild(vc)
view.addSubview(vc.view)
vc.didMove(toParent: self)
livenessViewController = vc
}
private func removeLivenessViewController() {
guard let vc = livenessViewController else { return }
vc.willMove(toParent: nil)
vc.view.removeFromSuperview()
vc.removeFromParent()
livenessViewController = nil
}
// Helper function to create buttons with actions
private func createButton(title: String, action: Selector) -> UIButton {
let button = UIButton(type: .system)
button.setTitle(title, for: .normal)
button.addTarget(self, action: action, for: .touchUpInside)
return button
}
private func startLiveness(with tasks: [TaskProperties]) {
guard let yvLiveness = yvLiveness else { return }
yvLiveness.startSDK(tasks: tasks)
DispatchQueue.main.async {
self.addLivenessViewController()
}
}
@objc private func completeTheCircleTapped() {
startLiveness(with: [
TaskProperties(task: .completeTheCircle(CompleteTheCircleTask(difficulty: .medium)))
])
}
}
extension MainViewController: YVLivenessViewDelegate {
func closeModal() {
DispatchQueue.main.async {
self.removeLivenessViewController()
}
}
}Breaking change: session token generation now external
Base URL Configuration
Session ID Generation
Session Token Generation
Complete Integration Flow
Error Keys
Retry Logic
Token generation
Options
Option
Type
Required
Description
Default Value
Possible Values
Tasks
Complete The Circle
CompleteTheCircleTask option
Option
Type
Required
Description
Default Value
Possible Values
Yes Or No
YesOrNoTask option
Option
Type
Required
Description
Default Value
Possible Values
Motions
MotionsTaskClass option
Option
Type
Required
Description
Default Value
Possible Values
Blink
BlinkTaskClass option
Option
Type
Required
Description
Default Value
Possible Values
TaskProperties
Option
Type
Required
Description
Default Value
Possible Values
Liveness Data
Option
Type
Description
Credits
Last updated
Was this helpful?
