QR CODE 掃瞄器初探

剛上沒幾堂課就有這個需求出現,腦袋都要炸了,硬著頭皮開始google QRCODE掃瞄器如何寫,還真的被我找到,看日期還滿新的,就開始了複製貼上之旅...

看了一下code,session應該是運載某種資料的吧?input應該是放擷取下來的資料,output應該是要呈現資料的,大概流程如下:

接下來就是一堆看不太懂的物件、方法...好吧,就先複製貼上再說

1.首先要在plist裡新增相機使用權限,移到字上會出現+號,點了選privacy-camera usage description,後面是要顯示的文字

2.UI用上了一點autoLayout,code一開始寫在viewDidLoad,可是怎麼跑UI都是歪的,問了彼得潘才知道有用autoLayout的話,code要寫在viewDidAppear

3.開始code的部分

首先import AVFoundation並實作AVCaptureMetadataOutputObjectsDelegate,宣告變數

guard let 類似if let ,彼得潘有寫過介紹

實體化一個AVCaptureSession物件,AVCaptureDevice可以抓到相機和其屬性,AVCaptureDeviceInput 可以運載相機抓到的資料並透過addInput方法丟給AVCaptureSession

AVCaptureMetaDataOutput是輸出影音資料的部分,先實體化AVCaptureMetaDataOutput物件,一樣在CaptureSession上加Output

metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)這段代理看不懂,跳過

metadataOutput.metadataObjectTypes是表示要處理哪些類型的資料,這裡我們要處理QRCODE

我們用個AVCaptureVideoPreviewLayer來呈現Session上的資料,把這個previewLayer的frame設定成storyboard的view,用addSublayer(previewLayer)最後打上captureSession?.startRunning()開始影像擷取就能呈現鏡頭的畫面了

AVCaptureMetadataOutput物件辨識QR Code 時,以下 AVCaptureMetadataOutputObjectsDelegate的委派方法metadataOutout會被呼叫

AVMetadataMachineReadableCodeObject是從OutPut擷取到的一維或二維barcode內容,轉成string後放到label

寫完後在實機上跑又出現一些問題,手機上要點選信任,只是每次安裝都要信任一次,不知道有沒有一勞永逸的方法

信任完執行,APP黑畫面...console出現The app delegate must implement the window property if it wants to use a main storyboard file. 查了一下是要在appDelegate加上var window: UIWindow?

成功拉~~~痛哭流涕QQ

UI好不好看已經不是重點了,能跑就好,接下來就是連接web service地獄...

待確認問題點:

  1. 信任一勞永逸的方式
  2. appDelegate加上var window: UIWindow?的意義
  3. 有autoLayout要寫在viewDidAppear的原理
  4. Delegate的原理

#這篇的觀念是我個人的理解,有錯誤再告訴我

參考資料:

--

--