basistheory-ios
基础知识元素 是简单、安全、对开发者友好的输入,使消费者能够直接从用户那里收集敏感数据到基础知识认证的保险库。
把它想象成一个我们在您的移动应用程序内部打开的门户,允许用户无缝地标记信息,而永远不会意识到他们正在与我们技术互动。这就是我们使其成为可能的方式
- 拥有您自己的 UX,通过完全自定义 元素 的样式
- 轻松使用输入和表单
- 像原生元素一样与元素交互
安装
Swift 包管理器
通过Xcode
通过Xcode的“文件 -> 添加包”进行添加。搜索 "https://github.com/Basis-Theory/basistheory-ios",然后点击“复制依赖”。
通过Package.swift
在您的Package.swift
文件中的dependencies
下添加以下行
.package(url: "https://github.com/Basis-Theory/basistheory-ios", from: "X.X.X"),
并将BasisTheoryElements
作为依赖项添加到您的target
dependencies: [
.product(name: "BasisTheoryElements", package: "basistheory-ios"),
...
],
CocoaPods
在您的Podfile
文件中的target
下添加以下行
pod 'BasisTheoryElements'
功能
- TextElementUITextField 以安全地收集文本输入
- CardNumberUITextField 以安全地收集信用卡号码
- CardExpirationDateUITextField 以安全地收集卡到期日期
- CardVerificationCodeUITextField 以安全地收集卡验证码
- 服务 用于检索和标记在Elements中输入的敏感数据
- 样式 - 完全支持自定义样式和品牌
- 事件 - 订阅元素触发的事件
Full TextElementUITextField 示例
以下代码可以在我们的 开源仓库 中运行。只需打开 IntegrationTester.xcodeproj
文件,该文件位于 此处。
//
// ViewController.swift
// iOSExample
//
// Created by Brian Gonzalez on 10/18/22.
//
import UIKit
import Combine
import BasisTheoryElements
class TextElementUITextFieldViewController: UIViewController {
private let lightBackgroundColor : UIColor = UIColor( red: 240/255, green: 240/255, blue: 240/255, alpha: 1.0 )
private let darkBackgroundColor : UIColor = UIColor( red: 200/255, green: 200/255, blue: 200/255, alpha: 1.0 )
private var cancellables = Set<AnyCancellable>()
@IBOutlet private weak var nameTextField: TextElementUITextField!
@IBOutlet weak var output: UITextView!
@IBOutlet private weak var phoneNumberTextField: TextElementUITextField!
@IBAction func printToConsoleLog(_ sender: Any) {
nameTextField.text = "Tom Cruise"
phoneNumberTextField.text = "555-123-4567"
print("nameTextField.text: \(nameTextField.text)")
print("phoneTextField.text: \(phoneNumberTextField.text)")
}
@IBAction func tokenize(_ sender: Any) {
let body: [String: Any] = [
"data": [
"name": self.nameTextField,
"phoneNumber": self.phoneNumberTextField,
"myProp": "myValue",
"object": [
"nestedProp": "nestedValue",
"phoneNumber": self.phoneNumberTextField,
]
],
"search_indexes": ["{{ data.phoneNumber }}"],
"type": "token"
]
BasisTheoryElements.tokenize(body: body, apiKey: "YOUR PUBLIC API KEY") { data, error in
guard error == nil else {
self.output.text = "There was an error!"
print(error)
return
}
let stringifiedData = String(data: try! JSONSerialization.data(withJSONObject: data!.value as! [String: Any], options: .prettyPrinted), encoding: .utf8)!
self.output.text = stringifiedData
print(stringifiedData)
}
}
override func viewDidLoad() {
super.viewDidLoad()
let regexDigit = try! NSRegularExpression(pattern: "\\d")
let phoneMask = [ //(123)456-7890
"(",
regexDigit,
regexDigit,
regexDigit,
")",
regexDigit,
regexDigit,
regexDigit,
"-",
regexDigit,
regexDigit,
regexDigit,
regexDigit
] as [Any]
let transformMatcher = try! NSRegularExpression(pattern: "[()-]") //Regex to remove parentheses & dashes
let phoneOptions = TextElementOptions(mask: phoneMask, transform: ElementTransform(matcher: transformMatcher))
try! phoneNumberTextField.setConfig(options: phoneOptions)
setStyles(textField: nameTextField, placeholder: "Name")
setStyles(textField: phoneNumberTextField, placeholder: "Phone Number")
nameTextField.subject.sink { completion in
print(completion)
} receiveValue: { message in
print(message)
}.store(in: &cancellables)
}
private func setStyles(textField: UITextField, placeholder: String) {
textField.layer.cornerRadius = 15.0
textField.placeholder = placeholder
textField.backgroundColor = lightBackgroundColor
textField.addTarget(self, action: #selector(didBeginEditing(_:)), for: .editingDidBegin)
textField.addTarget(self, action: #selector(didEndEditing(_:)), for: .editingDidEnd)
}
@objc private func didBeginEditing(_ textField: UITextField) {
textField.backgroundColor = darkBackgroundColor
}
@objc private func didEndEditing(_ textField: UITextField) {
textField.backgroundColor = lightBackgroundColor
}
}
Full Split Card Elements 示例
以下代码可以在我们的 开源仓库 中运行。只需打开 IntegrationTester.xcodeproj
文件,该文件位于 此处。
//
// SplitCardElementsViewController.swift
// IntegrationTester
//
// Created by Brian Gonzalez on 11/10/22.
//
import Foundation
import UIKit
import BasisTheoryElements
import Combine
class SplitCardElementsViewController: UIViewController {
private let lightBackgroundColor : UIColor = UIColor( red: 240/255, green: 240/255, blue: 240/255, alpha: 1.0 )
private let darkBackgroundColor : UIColor = UIColor( red: 200/255, green: 200/255, blue: 200/255, alpha: 1.0 )
private var cancellables = Set<AnyCancellable>()
@IBOutlet weak var cardNumberTextField: CardNumberUITextField!
@IBOutlet weak var expirationDateTextField: CardExpirationDateUITextField!
@IBOutlet weak var cvcTextField: CardVerificationCodeUITextField!
@IBOutlet weak var output: UITextView!
@IBOutlet weak var cardBrand: UITextView!
@IBAction func tokenize(_ sender: Any) {
let body: [String: Any] = [
"data": [
"number": self.cardNumberTextField,
"expiration_month": self.expirationDateTextField.month(),
"expiration_year": self.expirationDateTextField.year(),
"cvc": self.cvcTextField
],
"type": "card"
]
BasisTheoryElements.tokenize(body: body, apiKey: "YOUR PUBLIC API KEY") { data, error in
guard error == nil else {
self.output.text = "There was an error!"
print(error)
return
}
let stringifiedData = String(data: try! JSONSerialization.data(withJSONObject: data!.value as! [String: Any], options: .prettyPrinted), encoding: .utf8)!
self.output.text = stringifiedData
print(stringifiedData)
}
}
override func viewDidLoad() {
super.viewDidLoad()
setStyles(textField: cardNumberTextField, placeholder: "Card Number")
setStyles(textField: expirationDateTextField, placeholder: "MM/YY")
setStyles(textField: cvcTextField, placeholder: "CVC")
cardNumberTextField.subject.sink { completion in
print(completion)
} receiveValue: { message in
print("cardNumber:")
print(message)
if (!message.details.isEmpty) {
var brandDetails = message.details[0]
self.cardBrand.text = brandDetails.type + ": " + brandDetails.message
}
}.store(in: &cancellables)
expirationDateTextField.subject.sink { completion in
print(completion)
} receiveValue: { message in
print("expirationDate:")
print(message)
}.store(in: &cancellables)
cvcTextField.subject.sink { completion in
print(completion)
} receiveValue: { message in
print("CVC:")
print(message)
}.store(in: &cancellables)
}
private func setStyles(textField: UITextField, placeholder: String) {
textField.layer.cornerRadius = 15.0
textField.placeholder = placeholder
textField.backgroundColor = lightBackgroundColor
textField.addTarget(self, action: #selector(didBeginEditing(_:)), for: .editingDidBegin)
textField.addTarget(self, action: #selector(didEndEditing(_:)), for: .editingDidEnd)
}
@objc private func didBeginEditing(_ textField: UITextField) {
textField.backgroundColor = darkBackgroundColor
}
@objc private func didEndEditing(_ textField: UITextField) {
textField.backgroundColor = lightBackgroundColor
}
}