为有牺牲多壮志,敢教日月换新天。

[Xcode 实际操作]七、文件与数据-(22)使用OCR光学字符识别技术识别银行卡号码

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

目录:[Swift]Xcode实际操作

本文将演示如何使用光学字符识别技术,识别信用卡上的卡号。

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, width: 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.\n Number: %@\n expiry: %02lu/%lu\n 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】模拟器名称,弹出模拟器列表,在弹出的模拟器列表中,选择真机选项,该项目需要在真机设备上进行测试。

posted @ 2018-12-02 16:11  为敢技术  阅读(318)  评论(0编辑  收藏  举报