目錄:[Swift]Xcode實際操做html
本文將演示如何使用光學字符識別技術,識別信用卡上的卡號。c++
OCR技術是光學字符識別的縮寫(Optical Character Recognition),git
是經過掃描等光學輸入方式將各類文字轉化爲圖像信息,github
再利用文字識別技術將圖像信息轉化爲可使用的計算機輸入技術。swift
首先在瀏覽器的地址欄輸入須要下載的第三方類庫:card.io-iOS-SDK瀏覽器
將解壓後的文件夾【CardIO】拖動到項目【DemoApp】中,框架
保持選項的默認設置,點擊【Finish】完成文件夾的添加。ide
【CardIO】文件夾主要包含了三個庫文件和一些頭文件。post
點擊項目名稱【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】模擬器名稱,彈出模擬器列表,在彈出的模擬器列表中,選擇真機選項,該項目須要在真機設備上進行測試。