Validation and Errors Handling
VGSTextField Input Validation
VGSCollectSDK provides built-in validation for input data and files. Validation is based on defined validation rules set for each specific VGSTextField
. These rule sets are defined by default for each FieldType
, but you still have possibility to customize them.
VGSTextField
will be validating after each textfield's editing event. You can check validation results through textfield's state fields: textfield.state.isValid
& textfield.state.validationErrors
.
Default Validation
Here are few examples how default validation works for specific FieldType
:
FieldType
Validation Details
.none
Any input will be valid if no other validation rules will be applied
.ssn
US social security number, should be 9 digits, don't start with [000,666,9] or contain sequences of the same digits. Ignores some SSNs used in advertising
.cardNumer
Card number validation with checkSum algorithm(Luhn algorithm), available card lengths for defined card types
.date
Any date that match the selected format. By default valid date should be in mm-dd-yyyy
.expDate
Any date starting from current month. By default valid expiration date should be in short year format - MM/yy
.cardHolderName
Name, should be 2 or more symbols, valid characters shold match pattern: [a-zA-Z0-9]
.cvc
card cvc number, should be 3-4 digits. If in same VGSCollect
instance there is associated .cardNumer
field, cvc validation will be dynamic. It depends on input Card Brand type. For example: for AMEX valid cvc only with 4 digits, while for Visa 3 digits only.
If you didn't find specific FieldType
for your use case, you can always configure VGSTextField
with VGSConfiguration.fieldType = .none
. Then assign any specific rule set to the field and use other configuration attributes. Check more on our code examples below.
• To get full details about how validation rules work for each specific fields you can check
VGSCollectSDK
source code.
Available Validation Rules
VGSCollect SDK provide pre-build validation rules that you can apply to VGSTextField
object through it's configuration.
Here are some examples of the available rules:
VGSValidationRule
Description
VGSValidationRuleLength
Validate input in scope of min
& max
lengths
VGSValidationRulePattern
Validate input in scope of matching the regex pattern
VGSValidationRuleDateRange
Validate input in scope of matching date range. It also validate dates is in specific range. Supports VGSDateFormat
date formats validation
VGSValidationRuleCardExpirationDate
Validate input in scope of matching card expiration date format and time range. Supports VGSCardExpDateFormat
date formats validation
VGSValidationRulePaymentCard
Validate input in scope of matching supported card brands, available lengths and checkSum algorithms. Support optional validation of cards that are not defined in SDK - CardBrand.unknown
VGSValidationRuleLuhnCheck
Validate input in scope of matching Luhn algorithm
When you don't want to send to your organization vault data that is not valid, you can also set up additional VGSConfiguration
attributes:
.isRequired - if
true
, then the SDK will check if the input data in the field is not empty or nil onVGSCollect.sendData(_:)
request. When validation failed, the DK will return a specificVGSError
withextraInfo
field that contains info about not valid fields..isRequiredValidOnly - if
true
, then the SDK will check if the input data in the field is valid onVGSCollect.sendData(_:)
request. When validation failed, Sthe DK will return specificVGSError
withextraInfo
field that contains info about not valid fields.
How to customize VGSTextField Validation?
Here are a few examples of how to create your own validation rules set or edit existing rules that will validate input in VGSTextField
.
Create a textfield that should be valid when input is 6-9 digits long and starts with 555
let configuration = VGSConfiguration(collector: collector, fieldName: "secretNumber")
configuration.type = .none
configuration.formatPattern = "XXX-XXX-XXX"
configuration.validationRules = VGSValidationRuleSet(rules: [
VGSValidationRuleLength.init(min: 6, max: 9, error: "WRONG LENGTH"),
VGSValidationRulePattern.init(pattern: "^555\\d*$", error: "PATTERN FAILED")
])
textField.configuration = configuration
textField.placeholder = "XXX-XXX-XXX"
Validate payment cards that are not supported by the SDK. In this case, all .unknown
card types will go through Luhn
check validation and possible card lengths.
let cardConfiguration = VGSConfiguration(collector: collector, fieldName: "card_number")
cardConfiguration.type = .cardNumber
cardConfiguration.validationRules = VGSValidationRuleSet(rules:[
VGSValidationRulePaymentCard(error: VGSValidationErrorType.cardNumber.rawValue, validateUnknownCardBrand: true)
])
cardTextField.configuration = cardConfiguration
Validate date with format mm/dd/yyyy
that is in a date range from 01/02/2010
and 01/02/2020
.
/// Define range validation
/// The validation will fails if the date is before 02/01/2010 or after 02/01/2020
let startDate = VGSDate(day: 2, month: 1, year: 2010)
let endDate = VGSDate(day: 2, month: 1, year: 2020)
/// Use `VGSDateConfiguration` when you need to set validation date range
let dateConfiguration = VGSDateConfiguration(
collector: vgsCollect,
fieldName: "date",
datePickerStartDate: startDate,
datePickerEndDate: endDate
)
dateConfiguration.inputDateFormat = .mmddyyyy
/// Update configuration in the text field
dateField.configuration = dateFieldConfiguration
/// Update validation rules, `start` and `end` should be the same used in the configuration `datePickerStartDate` and `datePickerEndDate`
dateConfiguration.validationRules = VGSValidationRuleSet(
rules: [
VGSValidationRuleDateRange(
dateFormat: .mmddyyyy,
error: VGSValidationErrorType.date.rawValue,
start: startDate
end: endDate
)
]
)
Validate expiration date with long year format MM/yyyy
.
let expDateConfiguration = VGSConfiguration(collector: collector, fieldName: "exp_date")
expDateConfiguration.type = .expDate
expDateConfiguration.validationRules = VGSValidationRuleSet(rules: [
VGSValidationRuleCardExpirationDate(dateFormat: .longYear, error: VGSValidationErrorType.expDate.rawValue)
])
expDateTextField.configuration = expDateConfiguration
Use the Input Validation results
extension ViewController: VGSTextFieldDelegate {
func vgsTextFieldDidChange(_ textField: VGSTextField) {
/// update textfield color on validation state changes
textField.borderColor = textField.state.isValid ? .lightGray : .red
/// show the validation error message
validationLabel.text = textField.state.isValid ? "All is OK!" : textField.state.validationErrors.first
}
}
File Data validation
Before sending file data to your organization vault, VGSCollectSDK
validates selected files.
Here are a few examples of file data validation rules:
File source should be available for the App.
It should be possible to convert a file into base64.
File size doesn't exceed the limit of 24mb and its size is not 0.
File not removed from the directory where it was selected before uploading to your organization's vault.
For each of these errors VGSCollectSDK
will produce specific VGSError
on VGSCollect.sendFile(_:)
.
Errors Handling
This guide covers error handling features that will help you make your App more reliable and recover from errors produced by VGSCollectSDK
.
VGSError
An object VGSCollectSDK
used to produce errors inside the SDK. All VGSCollectSDK
errors are produced under VGSCollectSDKErrorDomain
domain.
Declaration
class VGSError: NSError
Attributes
Attribute
Type/Description
key
String, error key defined in VGSErrorInfoKey.swift
NSLocalizedDescriptionKey
String, error description for developer
extraInfo
Dictionary, can contain additional error details
VGSError
inherits iOS native NSError
class and works similar. VGSError
populates error codes, declared in VGSErrorType
, and error keys, declared in VGSCollectSDK Reference docs.
Error codes
List of Error codes produced by VGS Collect iOS SDK locally.
Code
Key
Description
1001
inputDataIsNotValid
When input data is not valid, but required to be valid
1101
inputFileNotFound
When can't find file on device
1102
inputFileTypeIsNotSupported
When selected file type not supported
1103
inputFileSizeExceedsTheLimit
When file size is larger then allowed limit
1150
sourceNotAvailable
When can't get access to file source
1400
unexpectedResponseType
When response type is not supported
1401
unexpectedResponseDataFormat
When response data format is not supported
1480
invalidConfigurationURL
When VGS configuration URL is not valid
Code example
vgsCollect.sendData(path: "/post", extraData: nil) { [weak self](../../response) in
switch response {
case .failure(let code, _, _, let error):
switch code {
/// Hande not valid fields data error
case VGSErrorType.inputDataIsNotValid.rawValue:
/// handle error
/// ...
return
}
}
Last updated