Swift Package Manager 是自动化 Swift 代码分发的一个工具,并集成到 swift 编译器中。使用 VGSCollectSDK 需要 Xcode 的 Swift 工具版本 5.3。早期版本的 Xcode 不支持带资源的 Swift 包。要检查您的当前 Swift 工具版本,请在您的终端中运行
/// Initialize VGSCollect instance
var vgsCollect = VGSCollect(id: "vauiltId", environment: .sandbox)
/// VGS UI Elements
var cardNumberField = VGSCardTextField()
var cardHolderNameField = VGSTextField()
var expCardDateField = VGSTextField()
var cvcField = VGSTextField()
/// Native UI Elements
@IBOutlet weak var stackView: UIStackView!
override func viewDidLoad() {
super.viewDidLoad()
/// Create card number field configuration
let cardConfiguration = VGSConfiguration(collector: vgsCollect,
fieldName: "card_number")
cardConfiguration.type = .cardNumber
cardConfiguration.isRequiredValidOnly = true
/// Setup configuration to card number field
cardNumberField.configuration = cardConfiguration
cardNumberField.placeholder = "Card Number"
stackView.addArrangedSubview(cardNumberField)
/// Setup next textfields...
}
...
... 监视字段状态
override func viewDidLoad() {
super.viewDidLoad()
...
/// Observing text fields
vgsCollect.observeStates = { textFields in
textFields.forEach({ textField in
print(textdField.state.description)
if textdField.state.isValid {
textField.borderColor = .grey
} else {
textField.borderColor = .red
}
/// CardState is available for VGSCardTextField
if let cardState = textField.state as? CardState {
print(cardState.bin)
print(cardState.last4)
print(cardState.brand.stringValue)
}
})
}
}
... 将数据发送到您的保险库
// ...
// MARK: - Send data
func sendData() {
/// handle fields validation before send data
guard cardNumberField.state.isValid else {
print("cardNumberField input is not valid")
}
/// extra information will be sent together with all sensitive card information
var extraData = [String: Any]()
extraData["customKey"] = "Custom Value"
/// send data to your Vault
vgsCollect.sendData(path: "/post", extraData: extraData) { [weak self](response) in
switch response {
case .success(let code, let data, let response):
// parse data
case .failure(let code, let data, let response, let error):
// handle failed request
switch code {
// handle error codes
}
}
}
}
class ViewController: UIViewController {
var vgsCollect = VGSCollect(id: "vauiltId", environment: .sandbox)
/// Init VGSCardIOScanController
var scanController = VGSCardIOScanController()
/// Init VGSTextFields...
override func viewDidLoad() {
super.viewDidLoad()
/// set VGSCardIOScanDelegate
canController.delegate = self
}
/// Present scan controller
func scanData() {
scanController.presentCardScanner(on: self,
animated: true,
completion: nil)
}
// MARK: - Send data
func sendData() {
/// Send data from VGSTextFields to your Vault
vgsCollect.sendData{...}
}
}
...
... 处理 VGSCardIOScanControllerDelegate
// ...
/// Implement VGSCardIOScanControllerDelegate methods
extension ViewController: VGSCardIOScanControllerDelegate {
///Asks VGSTextField where scanned data with type need to be set.
func textFieldForScannedData(type: CradIODataType) -> VGSTextField? {
switch type {
case .expirationDate:
return expCardDateField
case .cvc:
return cvcField
case .cardNumber:
return cardNumberField
default:
return nil
}
}
/// When user press Done button on CardIO screen
func userDidFinishScan() {
scanController.dismissCardScanner(animated: true, completion: { [weak self] in
/// self?.sendData()
})
}
}
// ...
// MARK: - Send File
/// Send file and extra data
func sendFile() {
/// add extra data to send request
let extraData = ["document_holder": "Joe B"]
/// send file to your Vault
vgsCollect.sendFile(path: "/post", extraData: extraData) { [weak self](response) in
switch response {
case .success(let code, let data, let response):
/// remove file from VGSCollect storage
self?.vgsCollect.cleanFiles()
case .failure(let code, let data, let response, let error):
// handle failed request
switch code {
// handle error codes
}
}
}
}