extension AVMetadataObject.ObjectType {
public static let upce: AVMetadataObject.ObjectType // UPC-E
public static let code39: AVMetadataObject.ObjectType // Code 39
public static let code39Mod43: AVMetadataObject.ObjectType // Code 39 Mod 43
public static let ean13: AVMetadataObject.ObjectType // EAN-13
public static let ean8: AVMetadataObject.ObjectType // EAN-8
public static let code93: AVMetadataObject.ObjectType // Code 93
public static let code128: AVMetadataObject.ObjectType // Code 128
public static let pdf417: AVMetadataObject.ObjectType // PDF417
public static let qr: AVMetadataObject.ObjectType // QRコード
public static let aztec: AVMetadataObject.ObjectType // Aztec
public static let interleaved2of5: AVMetadataObject.ObjectType // Interleaved 2 of 5 codes
public static let itf14: AVMetadataObject.ObjectType // ITF14
public static let dataMatrix: AVMetadataObject.ObjectType // Data Matrix
}
通常のバーコードリーダーで設定可能な
ということができないため読み取れるバーコードに制限がある
iOSにはBluetooth接続で外部キーボードを繋げることができる
この機能を利用して外部キーボードとしてバーコードリーダーを接続し、キーボード入力としてバーコードを送ることでバーコード読取を実現できる
UITextField
を画面上に置くiPhoneやiPod touchに装着して使用するバーコードリーダー
電源供給をiOS端末から行ってBluetoothで通信し、SDK経由でバーコードを受け取る
プリンターのUSB端子に接続して使用するバーコードリーダー
プリンターへコマンドを送ってそのレスポンスとしてバーコードを受け取るが、コマンドは非公開のためSDK経由で受け取る
func read(barcode: String) {
guard var view: UIView = self.window else { return }
var subviews = view.subviews
while !view.isFirstResponder && subviews.count > 0 {
if let firstResponder = subviews.filter({ $0.isFirstResponder }).first {
view = firstResponder
break
}
subviews = subviews.flatMap({ $0.subviews })
}
guard view.isFirstResponder else { return }
self.read(barcode: barcode, view: view)
}
func read(barcode: String, view: UIView) {
switch view {
case let textField as UITextField:
self.read(barcode: barcode, textField: textField)
case let textView as UITextView:
self.read(barcode: barcode, textView: textView)
case let searchBar as UISearchBar:
self.read(barcode: barcode, searchBar: searchBar)
default:
break
}
}
func read(barcode: String, textField: UITextField) {
guard textField.delegate?.textField?(textField,
shouldChangeCharactersIn: NSMakeRange(textField.text?.count ?? 0, 0),
replacementString: barcode) ?? true else { return }
textField.text = barcode
let _ = textField.delegate?.textFieldShouldReturn?(textField)
}
func read(barcode: String, textView: UITextView) {
guard textView.delegate?.textView?(textView,
shouldChangeTextIn: NSMakeRange(textView.text?.count ?? 0, 0),
replacementText: barcode) ?? true else { return }
textView.text = barcode
textView.delegate?.textViewDidChange?(textView)
}
func read(barcode: String, searchBar: UISearchBar) {
guard searchBar.delegate?.searchBar?(searchBar,
shouldChangeTextIn: NSMakeRange(searchBar.text?.count ?? 0, 0),
replacementText: barcode) ?? true else { return }
searchBar.text = barcode
searchBar.delegate?.searchBarSearchButtonClicked?(searchBar)
}