QRCode 掃描
在iOS 10 以後當使用到隱私授權的情況,都需要到info.plist進行設置,比如QRCode Scaner就會用到camera
做一個QRCode讀取工具不需要第三方庫,只需要引入AVFoundation,支持多種barcode的掃描。
1 |
import AVFoundation |
先準備幾個變量
1 2 3 4 5 6 |
var captureSession = AVCaptureSession() let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) var videoPreviewLayer:AVCaptureVideoPreviewLayer? // 設定掃描code的類型,支持多種條碼 let supportedBarCodes = [AVMetadataObjectTypeQRCode] |
AVCaptureMetadataOutputObjectsDelegate方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { captureSession.stopRunning() if let metadataObject = metadataObjects.first { let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject; // vibrate device if isVibrate { AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) } self.delegate?.didScanCode(code: readableObject.stringValue) // 忽略這裡的黃色警告,Xcode認為我們沒有處理回傳值 self.navigationController?.popViewController(animated: true) } } |
QRCode圖製作
需要製作一張QRCode圖,同樣不需要其他第三方庫,可以通過CIImage直接生成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class func makeQRCode(text:String) -> UIImage { let data = text.data(using: String.Encoding.utf8, allowLossyConversion: false) let filter = CIFilter(name: "CIQRCodeGenerator") filter!.setValue(data, forKey: "inputMessage") filter!.setValue("Q", forKey: "inputCorrectionLevel") let qrcodeImage = filter!.outputImage let scaleX = 200 / (qrcodeImage?.extent.size.width)! let scaleY = 200 / (qrcodeImage?.extent.size.height)! // 這裡生成200*200的圖,如果沒有這個步驟,出來的QRCode會是低像素,顯示很模糊 let transformedImage = qrcodeImage?.applying(CGAffineTransform(scaleX: scaleX, y: scaleY)) let aImage = UIImage(ciImage: transformedImage!) return aImage } |
CIFilter不知道為什麼還是寫成用String來初始化,而且Xcode8中點進去也看不到有哪些String可以寫…只能看官方文檔了。
這樣的初始化方式很容易因為打錯字而出現意外呢。