SweetCardScanner is a fast and simple Card Scanner library written in Swift, based on CreditCardScanner and Reg libraries by @yhkaplan so that users can pay much more easily by capturing their credit/debit card with the rear camera.
- iOS 13.0+ (due to SwiftUI, Vision Framework)
- Tesed on iOS 14.1 with iPhone X
-
In Xcode, add SwiftPM with the URL of this repository:
https://github.com/aaronLab/SweetCardScanner.git
-
Add
NSCameraUsageDescription
intoInfo.plist
for Camera Useage Description. -
import SweetCardScanner
on top of theContentView.swift
. -
Now, you can use like
SweetCardScanner()
inside of the body. -
Also, you can use completion clousures, such as
.onDismiss
,.onError
,.onSuccess
right afterSweetCardScanner()
like below.var body: some View { SweetCardScanner() .onDismiss { // Do something when the view dismissed. } .onError { error in // The 'error' above gives you 'CreditCardScannerError' struct below. print(error) } .onSuccess { card in // The card above gives you 'CreditCard' struct below. print(card) } }
public struct CreditCardScannerError: LocalizedError {
public enum Kind { case cameraSetup, photoProcessing, authorizationDenied, capture }
public var kind: Kind
public var underlyingError: Error?
public var errorDescription: String? { (underlyingError as? LocalizedError)?.errorDescription }
}
public struct CreditCard {
public var number: String?
public var name: String?
public var expireDate: DateComponents?
}
You can customize your own view with SweetCardScanner, and SwiftUI like below.
import SwiftUI
import SweetCardScanner
struct ContentView: View {
// MARK: - PROPERTIES
@State var navigationStatus: NavigationStatus? = .ready
@State var card: CreditCard?
// MARK: - BODY
var body: some View {
NavigationView {
GeometryReader { geometry in
ZStack {
NavigationLink(
destination: ResultView(card: card),
tag: NavigationStatus.pop,
selection: $navigationStatus) {
EmptyView()
}
SweetCardScanner()
.onError { err in
print(err)
}
.onSuccess { card in
self.card = card
self.navigationStatus = .pop
}
RoundedRectangle(cornerRadius: 16)
.stroke()
.foregroundColor(.white)
.padding(16)
.frame(width: geometry.size.width, height: geometry.size.width * 0.63, alignment: .center)
} //: ZSTACK
} //: GEOMETRY
} //: NAVIGATION
}
}
// MARK: - NavigationStatus
enum NavigationStatus {
case ready, pop
}
Licensed under MIT license.