本文将演示如何使用光学字符识别技术,识别信用卡上的卡号。
OCR技术是光学字符识别的缩写(Optical Character Recognition),
是通过扫描等光学输入方式将各种文字转化为图像信息,
再利用文字识别技术将图像信息转化为可以使用的计算机输入技术。
首先在浏览器的地址栏输入需要下载的第三方类库:card.io-iOS-SDK
将解压后的文件夹【CardIO】拖动到项目【DemoApp】中,
保持选项的默认设置,点击【Finish】完成文件夹的添加。
【CardIO】文件夹主要包含了三个库文件和一些头文件。
点击项目名称【DemoApp】,打开项目信息面板。
进入【Build Settings】编译设置面板。
在右上角搜索输入框内输入需要搜索的关键词:【Other Linker Flags】。
找到所需的选项后,在右侧双击弹出设置框。
在弹出的面板中,点击弹出面板左下角的【+】图标,进入文字输入状态。
然后输入链接器参数:【-lc++】
链接器做的事,就是把目标文件和所用的一些库链接在一起,形成一个完整的可执行文件。
从代码到可执行文件经历的步骤是:
【源代码】->【预处理器】->【编译器】->【汇编器】->【机器码】->【链接器】->【可执行文件】
点击弹出面板左下角的【+】图标,再添加一个输入链接器参数:【-ObjC】
添加了链接器参数:【-ObjC】后,链接器就会把静态库中所有的OC类和分类,都加载到最后的可执行文件中。
在链接器设置面板外部点击,完成参数的设置。
进入【Build Phases】编译阶段设置面板。
在【Link Binary With Libraries】选项中,点击【+】往项目中添加需要用到的五个框架。
在弹出窗口顶部的搜索框内,输入待添加的框架的名称:
【Accelerate.framework】:在框架名称上双击,引入该框架
【AVFoundation.framework】:在框架名称上双击,引入该框架
【AudioToolbox.framework】:在框架名称上双击,引入该框架
【CoreMedia.framework】:在框架名称上双击,引入该框架
【MobileCoreServices.framework】:在框架名称上双击,引入该框架
进入【Build Settings】编译设置面板。
在右上角搜索输入框内输入需要搜索的关键词:【Enable Modules】。
【Enable Modules】属性在默认情况下已经激活,如果没有激活的话,请把它调整为激活状态。
在右上角搜索输入框内输入需要搜索的关键词:【Link Frameworks Automatically】。
【Link Frameworks Automatically】属性在默认情况下已经激活,如果没有激活的话,请把它调整为激活状态。
在【CardIO】文件夹上点击鼠标右键,弹出右键菜单。
要在代码中调用文字识别框架的OC头文件,需要往项目中添加一个桥接头文件。
【New File】->【Header File】->【Next】->【Save As】:CardIO-Swift-Bridging-Header.h->【Create】
在桥接头文件【CardIO-Swift-Bridging-Header.h】中引入需要用到的头文件。
1 #ifndef CardIO_Swift_Bridging_Header_h 2 #define CardIO_Swift_Bridging_Header_h 3 4 #import "CardIO.h" 5 //在桥接头文件中引入需要用到的头文件。 6 @import AudioToolbox; 7 @import AVFoundation; 8 @import CoreMedia; 9 @import CoreVideo; 10 @import MobileCoreServices; 11 12 #endif /* CardIO_Swift_Bridging_Header_h */
然后点击项目名称【DemoApp】,进入项目属性设置面板,确保桥接头文件,已经被项目所引用。
进入【Build Settings】编译设置面板。
在右上角搜索输入框内输入需要搜索的关键词:【Bridging Header】。
然后在【Objective-C Bridging Header】文件属性右侧双击,弹出桥接头文件属性设置面板。
接着输入桥接文件,在项目中的存储路径:DemoApp/CardIO/CardIO-Swift-Bridging-Header.h
在项目导航区,打开视图控制器的代码文件【ViewController.swift】
准备工作已经全部完成,现在开始编写代码,实现识别卡号的功能。
1 import UIKit 2 3 //首先导入需要用到的代理协议CardIOPaymentViewControllerDelegate 4 //它将完成信用卡卡号识别的主要功能 5 class ViewController: UIViewController, CardIOPaymentViewControllerDelegate { 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup after loading the view, typically from a nib. 10 //当调用卡号识别的视图控制器时,因为需要加载各种资源, 11 //所以比较耗费时间,可能会出现卡顿现象。 12 //这里在调用前,进行一次预加载,以避免卡顿现象。 13 CardIOUtilities.preload() 14 15 //创建一个按钮对象,当点击该按钮时,弹出卡号识别的视图控制器, 16 //在该视图控制器中,进行卡号识别的主要工作。 17 let button = UIButton(frame: CGRect(x: 40, y: 80, 240, height: 40)) 18 //设置按钮标题文字 19 button.setTitle("Scan Card", for: .normal) 20 //设置按钮背景颜色 21 button.backgroundColor = UIColor.brown 22 //给按钮绑定点击事件 23 button.addTarget(self, action: #selector(ViewController.scanCard(_:)), for: UIControl.Event.touchUpInside) 24 25 //将按钮添加到当前视图控制器的根视图 26 self.view.addSubview(button) 27 } 28 29 //添加一个方法,用来响应按钮的点击事件 30 @objc func scanCard(_ sender: UIButton!) 31 { 32 //初始化卡号识别视图控制器 33 let cardIOVC = CardIOPaymentViewController(paymentDelegate: self) 34 //设置卡号识别视图控制器的展示样式 35 cardIOVC?.modalPresentationStyle = .formSheet 36 //以模态窗口的方式,显示卡号识别视图控制器 37 present(cardIOVC!, animated: true, completion: nil) 38 } 39 40 //添加一个方法,用来响应用户取消识别的动作 41 func userDidCancel(_ paymentViewController: CardIOPaymentViewController!) 42 { 43 //在控制台打印输出相关的日志 44 print("user canceled") 45 //并隐藏卡号识别视图控制器 46 paymentViewController?.dismiss(animated: true, completion: nil) 47 } 48 49 //添加另一个代理方法,用来响应用户点击完成按钮的事件 50 func userDidProvide(_ cardInfo: CardIOCreditCardInfo!, in paymentViewController: CardIOPaymentViewController!) 51 { 52 //创建一个字符串常量,用来存储识别到的信用卡的所有信息 53 if let info = cardInfo 54 { 55 let str = NSString(format: "Received card info. Number: %@ expiry: %02lu/%lu cvv: %@.", 56 info.cardNumber, 57 info.expiryMonth, 58 info.expiryYear, 59 info.cvv) 60 61 //在控制台打印输出所有信息 62 print(str) 63 } 64 //同时隐藏卡号识别视图控制器 65 paymentViewController?.dismiss(animated: true, completion: nil) 66 } 67 }
然后点击【DemoApp/IPhone】模拟器名称,弹出模拟器列表,在弹出的模拟器列表中,选择真机选项,该项目需要在真机设备上进行测试。