Skip to main content
Version: Next

iOS Customer User APIs

Customer user APIs for account signup, login/logout, and account recovery. Access these APIs through vipaso.user.customer.

Authentication

Login

Authenticate an existing customer with phone number and password:

let request = LoginRequest(identifier: phoneNumber, password: password)
vipaso.user.customer.login(request: request) { result in
switch result {
case .success:
// User successfully logged in
// Authentication state change will be sent via delegate
case .failure(let error):
// Handle login error
print("Login failed: \(error.localizedDescription)")
}
}

Logout

Log out the current customer:

vipaso.user.customer.logout()
// Authentication state change will be sent via delegate

Account Signup

The signup process requires three steps: starting the flow, verifying the phone number, and completing the signup.

1. Start Signup Flow

Begin the signup process with a phone number. This sends an OTP code to the provided number:

let request = StartSignupRequest(phoneNumber: phoneNumber)
vipaso.user.customer.startSignupFlow(request: request) { result in
switch result {
case .success(let response):
// Save the flowID for the next step
let flowID = response.flowID
case .failure(let error):
print("Signup start failed: \(error.localizedDescription)")
}
}

2. Verify Phone Number

Verify the phone number using the OTP code received via SMS:

let request = VerifyPhoneNumberRequest(flowID: flowID, otp: otp)
vipaso.user.customer.verifyPhoneNumber(request: request) { result in
switch result {
case .success(let response):
// Phone number verified, save flowID for final step
let verifiedFlowID = response.flowID
case .failure(let error):
print("Phone verification failed: \(error.localizedDescription)")
}
}

3. Complete Signup

Finish the signup by providing user details:

let request = FinishSignupRequest(
flowID: flowID,
password: password,
email: email,
firstName: firstName,
lastName: lastName,
phoneNumber: phoneNumber
)
vipaso.user.customer.finishSignupFlow(request: request) { result in
switch result {
case .success(let response):
// Signup completed successfully
// User is now logged in, authentication state change sent via delegate
case .failure(let error):
print("Signup completion failed: \(error.localizedDescription)")
}
}

Password Recovery

The password recovery process has three steps: starting recovery, sending OTP, and completing the password change.

1. Start Recovery Flow

Begin password recovery with the customer's phone number:

let request = StartRecoveryRequest(phoneNumber: phoneNumber)
vipaso.user.customer.startRecoveryFlow(request: request) { result in
switch result {
case .success(let response):
// Save the flowID for the next step
let flowID = response.flowID
case .failure(let error):
print("Recovery start failed: \(error.localizedDescription)")
}
}

2. Send Recovery OTP

Submit the OTP code received via SMS:

let request = RecoveryOTPRequest(code: otp, flowID: flowID)
vipaso.user.customer.sendRecoveryOTP(request: request) { result in
switch result {
case .success(let response):
// Save both settingsFlowID and sessionToken for final step
let settingsFlowID = response.settingsFlowID
let sessionToken = response.sessionToken
case .failure(let error):
print("OTP verification failed: \(error.localizedDescription)")
}
}

3. Complete Password Recovery

Set the new password using the settings flow ID and session token:

let request = FinishRecoveryRequest(
settingsFlowID: settingsFlowID,
sessionToken: sessionToken,
password: newPassword
)
vipaso.user.customer.finishRecoveryFlow(request: request) { result in
switch result {
case .success(let response):
// Password successfully updated
case .failure(let error):
print("Password recovery failed: \(error.localizedDescription)")
}
}

User Data

Fetch User Details

Get the current customer's profile information:

vipaso.user.customer.fetchUser { result in
switch result {
case .success(let response):
let user = response.user
// Access user.id, user.phone, user.firstName, etc.
case .failure(let error):
print("Fetch user failed: \(error.localizedDescription)")
}
}