Swift3 でQRコード読み込む
iOSでQRコードを読み込むアプリを作りたかったので、実装方法をメモ。
iOS7からAVFoundation により、標準ライブラリのみでQRコードの読み込みができるようになりました。
方法も簡単なのでコードそのまま貼ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import UIKit import AVFoundation class ViewController: UIViewController { var session: AVCaptureSession? = nil override func viewDidLoad() { super.viewDidLoad() // Device let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) session = AVCaptureSession.init() guard session != nil else { print("error") return } // Input let input = try? AVCaptureDeviceInput.init(device: device) session?.addInput(input) // Output let output = AVCaptureMetadataOutput.init() session?.addOutput(output) output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) output.metadataObjectTypes = [AVMetadataObjectTypeQRCode ] // Preview if let preview = AVCaptureVideoPreviewLayer.init(session: session) { preview.videoGravity = AVLayerVideoGravityResizeAspectFill; preview.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height); self.view.layer.insertSublayer(preview, at: 0) } // Start self.session?.startRunning() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } extension ViewController : AVCaptureMetadataOutputObjectsDelegate { func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { for data in metadataObjects { if let code = data as? AVMetadataMachineReadableCodeObject { print("type \(code.type)") print("result \(code.stringValue)") } } } } |
簡単です。が、、、
実は私がやりたかったことはこれだとできないことがわかりました。QRコード化されたバイナリデータをそのまま読み込みたかったのですが、前述の AVMetadataMachineReadableCodeObject
のプロパティを確認すると、取得できる情報は type と文字列化された stringValue しかありません。
例のごとく、Stack Overflow で議論されているようですが、無理やり内部変数の値を見る解決策しか現状無さそうですね。
というわけで、バイナリのQRコードの読み込みに関しては別のライブラリを使うことで対応する方針となりました、という話です。
2018/02/10 追記
実際にやりたかった、バイナリのQRコードを読み込む方法を書きました。
最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。
Follow @ryuta461
この記事をシェアする