【iOS】SwiftでQRコード読取り
急ぎでサンプル作ってくれと言われて昨日から開始
先週末に話しが出てきて今週末に見せろとかひどい話だよ…。
XCode自体触るの6年ぶりくらいだからよくわからんちん。
Swift?初めて触ったよ(*´∀`*)
kotlinっぽいので思ったよりは触りやすかった。
【動作端末】
iPad mini(初代)
OS:9.3.5
【開発端末】
iMac(21.5-inch,Mid 2011)
OS:10.13.5
メモリ:4GB
会社のPCは全てポンコツです。
【開発環境】
IDE:Xcode 9.4
BaseSDK:iOS11.4
Target:iOS9.3
Swift:4.1
要件としてはiOS6で動くQRリーダー+サーバアプリだったんだけど
OSだけは新しくしてくれということでiOS9になるようお願い
そもそも端末買い換えろって話だけど昔大量に買った端末を有効活用したいんだと
使ってなかったのを数年後に無理やり活用とかホント多くて嫌になる。
ってことで、ソース
import UIKit import AVFoundation class ViewController:UIViewController{ var session:AVCaptureSession? = nil var qrcodeText: UILabel? = nil override func viewDidLoad(){ super.viewDidLoad() // デバイスの取得、今回はフロントをメインに使いたい ver targetDevice:AVCaptureDevice? = nil let devices = AVCaptureDevice.devices() for device in devices { if device.position == AVCaptureDevice.Position.front { device = device break }else{ device = device } } // セッションの初期化とか session = AVCaptureSession.init() // 入出力の初期化とか色々 let input = try? AVCaptureDeviceInput.init(device:device!) let output = AVCaptureMetadataOutput.init() session?.addInput(input!) session?.addOutput(output) output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) output.metadataObjectTypes = [AVMetadataObject.ObjectType.qr] // プレビューの初期化とか let preview = AVCaptureVideoPreviewLayer.init(session:session!) preview.videoGravity = AVLayerVideoGravity.resizeAspectFill 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) // QR読取り結果の表示領域設定 qrcodeText = UILabel.init(frame:CGRect(x:20,y:20,width:450,height:26)) qrcodeText?.text = "QR読込結果" qrcodeText?.backgroundColor = UIColor.white qrcodeText?.textColor = UIColor.black self.view.addSubview(qrcodeText!) // カメラセッション開始 session?.startRunning() } override func didReceiveMemoryWarning(){ super.didReceiveMemoryWarning() } } // キャプチャ結果のデリゲート extension ViewController:AVCaptureMetadataOutputObjectsDelegate { func metadataOutput(_ output:AVCaptureMetadataOutput, didOutput metadataObjects:[AVMetadataObject], from connection:AVCaptureConnection) { for data in metadataObjects { if data as? AVMetadataMachineReadableCodeObject { // 結果をラベルに書き出し qrcodeText?.text = data.stringValue } } } }
色々なサイトを参考にしたけど記述が古いのかビルドが通らないこと多くて苦戦した。
下記みたいなのとか。
let videoDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
ちかれた。