IOS 11 ve Swift 4.0 ile QR Kod ve Barkod Okuyucu Oluşturma
IOS işletim sisteminde Swift programlama ile ilgili ilk dersimizi, hakkında Türkçe içerik hiç bulamadığım, İngilizce içerik ararken bile zorlandığım bir konuda oluşturmak istedim. IOS 11 ve Swift 4.0 kullanarak QR Kod ve Barkod okuyucu program yazma.
QR kod okuyucumuz uygulamanın ana ekranında direkt çıkmasın diye “ScannerViewController” adlı bir class oluşturarak onun içerisine ekledim. Bu sayfaya geçişi de “TabBar” üzerinden gerçekleştirdim. Siz böyle bir geçiş gerçekleştirmeyecekseniz kodun ilk kısmındaki “required init” ile başlayan alanı kaldırabilirsiniz.
import AVFoundation import UIKit class ScannerViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { required init?(coder aDecoder: NSCoder){ super.init(coder: aDecoder) tabBarItem = UITabBarItem(title: "QR Code", image: UIImage(named: "if_shopping"), tag: 2) } class CameraView: UIView { override class var layerClass: AnyClass { get { return AVCaptureVideoPreviewLayer.self } } override var layer: AVCaptureVideoPreviewLayer { get { return super.layer as! AVCaptureVideoPreviewLayer } } } var cameraView: CameraView! override func loadView() { cameraView = CameraView() view = cameraView } let session = AVCaptureSession() let sessionQueue = DispatchQueue(label: AVCaptureSession.self.description(), attributes: [], target: nil) override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. session.beginConfiguration() let videoDevice = AVCaptureDevice.default(for: .video) 1 if (videoDevice != nil) { let videoDeviceInput = try? AVCaptureDeviceInput(device: videoDevice!) if (videoDeviceInput != nil) { if (session.canAddInput(videoDeviceInput!)) { session.addInput(videoDeviceInput!) } } let metadataOutput = AVCaptureMetadataOutput() if (session.canAddOutput(metadataOutput)) { session.addOutput(metadataOutput) metadataOutput.metadataObjectTypes = [ .ean13, .qr ] metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) } } session.commitConfiguration() cameraView.layer.session = session cameraView.layer.videoGravity = .resizeAspectFill let videoOrientation: AVCaptureVideoOrientation switch UIApplication.shared.statusBarOrientation { case .portrait: videoOrientation = .portrait case .portraitUpsideDown: videoOrientation = .portraitUpsideDown case .landscapeLeft: videoOrientation = .landscapeLeft case .landscapeRight: videoOrientation = .landscapeRight default: videoOrientation = .portrait } cameraView.layer.connection?.videoOrientation = videoOrientation } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) sessionQueue.async { self.session.startRunning() } } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) sessionQueue.async { self.session.stopRunning() } } override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) // Update camera orientation let videoOrientation: AVCaptureVideoOrientation switch UIDevice.current.orientation { case .portrait: videoOrientation = .portrait case .portraitUpsideDown: videoOrientation = .portraitUpsideDown case .landscapeLeft: videoOrientation = .landscapeRight case .landscapeRight: videoOrientation = .landscapeLeft default: videoOrientation = .portrait } cameraView.layer.connection?.videoOrientation = videoOrientation } func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { if (metadataObjects.count > 0 && metadataObjects.first is AVMetadataMachineReadableCodeObject) { let scan = metadataObjects.first as! AVMetadataMachineReadableCodeObject let alertController = UIAlertController(title: "Barcode Scanned", message: scan.stringValue, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler:nil)) present(alertController, animated: true, completion: nil) } } }
Kodumuz uygulama içerisinde çalışırken kamera izni isteyecektir. Bu izin ekranını da Info.plist dosyası üzerinde düzenlemeliyiz.
Yukarıdaki ekran görüntüsünde gördüğünüz gibi “Privacy – Camera Usage Description” satırını ekleyip, bu satırın değerine kendi onay sorumuzu yazıyoruz.
Son olarak, bu class için bir Main.storyboard’da boş bir viewcontroller yaratmanız yeterli olacaktır. O View Controller ile oluşturduğumuz “ScannerViewController” class’ını bağlayıp uygulamanızı çalıştırınız. Mac’inizdeki simülatörde düzgün çalışmayabilir. Bunun için bir iPhone’u simülatör olarak kullanmalısınız.
Sitemizde yayınladığımız ilk eğitim içeriği olduğu için anlatımdaki kusurlarımızı affedin. Eksik kalan ya da anlamadığınız kısımları yorum alanından sorabilirsiniz.