İOS'ta barkodları nasıl tarayabilirim?


189

İPhone ve / veya iPad'de barkodları nasıl tarayabilirim?


7
Ne yazık ki, iPhone kamera lensi ∞'a sabitlendiğinden barkodları okumak için korkunç. İyi şanslar olsa!
Alastair Stuart

1
Sadece bu sorunu çözüyorum, gözlemlerimi yazacağım. Birkaç seçeneği test ettim. RSBarcodes_Swift - entegrasyonu kolaydı, ancak performansı çok düşüktü. ZBarSDK - uygulanması da kolaydı, altho nasıl olduğunu bulmak için birkaç google aradı. Ancak gerçekten iyi bir performansa sahipti (datamatrix ve diğer nadir kodları taramadı) barkodlar / QRCode için gerçekten iyi çalışıyor. Ama Scandit en iyisiydi. Süper hızlı, her şeyi tarar. ne yazık ki oldukça pahalı.
Katafalkas

Yanıtlar:


82

İPhone için 'Barkodlar' uygulamasını ürettik. QR Kodlarının kodunu çözebilir. Kaynak kodu zxing projesinden elde edilebilir ; özellikle, iPhone istemcisine ve çekirdek kütüphanenin kısmi C ++ bağlantı noktasına bir göz atmak istersiniz . Bağlantı noktası, Java kodunun 0.9 sürümünden itibaren biraz eskidir, ancak yine de makul derecede iyi çalışmalıdır.

1D formatları gibi diğer formatları taramanız gerekiyorsa, bu proje içindeki Java kodunun portunu C ++ 'a devam ettirebilirsiniz.

DÜZENLEME: Barkodlar ve iphoneprojedeki kod 2014 yılı başında kullanımdan kaldırıldı.


Sean ne tür bir lisans kullanıyor? Zbar kullanan ücretli bir uygulama oluşturmak istiyorum. Lisans sözleşmesi kapsamında bu mümkün müdür?
Radu

1
Açıkçası, bu noktada, iPhone'daki ZXing sadece QR Kodlarını destekliyor mu?
RefuX

Ben daha fazla C + + taşınan inanıyorum, ama bağlantı noktası hala ne yazık ki Java kodu kaba ve modası geçmiş bir yankı. Yani, evet belki de iyi olmasa da daha fazlası desteklenir.
Sean Owen

IPhone için ZXing hala 1.7 ver bellek sızıntıları var.
Yoon Lee

ZXing git'teki sayı listesinden barkodu yalnızca yatay modda tarayabileceğimizi anlıyorum.
Sagrian

81

Check out ZBar QR Code ve ECN / ISBN kodlarını okur ve LGPL v2 lisansı altında olarak mevcuttur.


5
Kısmen doğrudur. ZBar.app, Apache Lisansı (Sürüm 2.0) altında lisanslanmıştır , ancak kütüphane LGPL v2 altında lisanslanmıştır.
Sean

3
Ne yazık ki lisans, uygulamanızın nesne dosyalarını isteyen herkesle paylaşmanızı gerektirir .. zbar.sourceforge.net/iphone/sdkdoc/licensing.html
Ben Clayton

1
@BenClayton uygulamanın nesne dosyalarını paylaşmak ne anlama geliyor?
Dejell

@Odelya .o dosyalarını Xcode tarafından oluşturulan şekilde herkese gönderme, teorik olarak uygulamanızı oluşturmalarına izin verme. Bunu (özellikle müşterilerim için) yapmaktan kesinlikle memnun değilim, bu yüzden ZBar bizim için sorun değil. ZBar lisans sayfası sadece 'kimsenin talep etmesini ummamanız' gerektiğini önerir.
Ben Clayton

@BenClayton A. Teşekkürler B. Daha yeni bir sürümü indirmek için, önceden indirilmiş uygulama kullanıcılarına sorar ve isterse bileşeni değiştirebilirim. Yeterli mi? C. Peki hangi kütüphaneyi kullanıyorsunuz?
Dejell

56

Yayınlandığınız gibi iOS7artık harici bir çerçeve veya kütüphane kullanmanıza gerek yok. AVFoundation özellikli iOS ekosistemi artık QR'den EAN üzerinden UPC'ye hemen hemen her kodun taranmasını tamamen destekliyor .

Teknik Not ve AVFoundation programlama kılavuzuna bir göz atın . AVMetadataObjectTypeQRCodesenin arkadaşın.

İşte adım adım gösteren güzel bir öğretici : iPhone QR kod tarama kütüphanesi iOS7

Nasıl ayarlanacağıyla ilgili küçük bir örnek:

#pragma mark -
#pragma mark AVFoundationScanSetup

- (void) setupScanner;
{
    self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];

    self.session = [[AVCaptureSession alloc] init];

    self.output = [[AVCaptureMetadataOutput alloc] init];
    [self.session addOutput:self.output];
    [self.session addInput:self.input];

    [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    self.output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];

    self.preview = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
    self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
    self.preview.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

    AVCaptureConnection *con = self.preview.connection;

    con.videoOrientation = AVCaptureVideoOrientationLandscapeLeft;

    [self.view.layer insertSublayer:self.preview atIndex:0];
}

1
İOS8'deki görüntüden barkodu tespit etmek istiyorsanız, bu eğitici yardımcı olabilir.
NSDeveloper

Ben startRunningkimseye yardımcı olması durumunda yukarıdaki kodu almak için oturumu aramak zorunda bulundu bulundu
Chris

13

İPhone 4 kamera barkod yapma yeteneğinden daha fazlası. Zebra geçiş barkod kütüphanesinde github zxing-iphone üzerinde bir çatal var . Açık kaynak.


1
Yayınınız, bu ZXing bağlantı noktasının sadece QRCodes'dan daha fazlasını tarayabileceğini ima ediyor gibi görünüyor? Durum bu mu?
RefuX

4
Bu sorunla belirtildiği gibi, github çatalı ölü gibi görünüyor: github.com/joelind/zxing-iphone/issues/3
Josh Brown

10

liteqr , github'da "zxing'den taşınan Objective C'de Lite QR Okuyucu" dur ve Xcode 4 desteğine sahiptir.


10

İki büyük kütüphane vardır:

  • Java ile yazılmış ve daha sonra Objective C / C ++ 'a taşınan bir kütüphaneyi ZXing (yalnızca QR kodu). Ve ObjC'ye başka bir liman da yapıldı, TheLevelUp: ZXingObjC

  • ZBar , C kodlu barkodları okumak için açık kaynaklı bir yazılımdır.

Deneylerime göre, ZBar, en azından iPhone'da, ZXing'den çok daha doğru ve hızlı .


Bana ZXingObjC şimdiye kadar en çok oyla zirveye itilmesi gereken biri gibi görünüyor. Ben kullanmadım henüz ama açıklama bu 2.0 ZXing ile parite üzerinde olduğunu söylüyor.
Shaolo

ZBar lisansı, kullanıcılara nesne dosyalarını sunmanızı gerektirir, böylece dosyayı çalıştırabilir ve kitaplıklarını da değiştirebilirler.
Dejell

Ben ZXingObjC tavsiye
Dejell


7

Aşağıda Swift 4 ve Xcode 9'u kullanarak başka bir yerel iOS çözümü bulabilirsiniz . AVFoundationBu çözümde kullanılan yerel çerçeve.

Birinci bölüm, UIViewControllerilgili kurulum ve işleyici işlevlerine sahip bir alt sınıftır AVCaptureSession.

import UIKit
import AVFoundation

class BarCodeScannerViewController: UIViewController {

    let captureSession = AVCaptureSession()
    var videoPreviewLayer: AVCaptureVideoPreviewLayer!
    var initialized = false

    let barCodeTypes = [AVMetadataObject.ObjectType.upce,
                        AVMetadataObject.ObjectType.code39,
                        AVMetadataObject.ObjectType.code39Mod43,
                        AVMetadataObject.ObjectType.code93,
                        AVMetadataObject.ObjectType.code128,
                        AVMetadataObject.ObjectType.ean8,
                        AVMetadataObject.ObjectType.ean13,
                        AVMetadataObject.ObjectType.aztec,
                        AVMetadataObject.ObjectType.pdf417,
                        AVMetadataObject.ObjectType.itf14,
                        AVMetadataObject.ObjectType.dataMatrix,
                        AVMetadataObject.ObjectType.interleaved2of5,
                        AVMetadataObject.ObjectType.qr]

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        setupCapture()
        // set observer for UIApplicationWillEnterForeground, so we know when to start the capture session again
        NotificationCenter.default.addObserver(self,
                                           selector: #selector(willEnterForeground),
                                           name: .UIApplicationWillEnterForeground,
                                           object: nil)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        // this view is no longer topmost in the app, so we don't need a callback if we return to the app.
        NotificationCenter.default.removeObserver(self,
                                              name: .UIApplicationWillEnterForeground,
                                              object: nil)
    }

    // This is called when we return from another app to the scanner view
    @objc func willEnterForeground() {
        setupCapture()
    }

    func setupCapture() {
        var success = false
        var accessDenied = false
        var accessRequested = false

        let authorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
        if authorizationStatus == .notDetermined {
            // permission dialog not yet presented, request authorization
            accessRequested = true
            AVCaptureDevice.requestAccess(for: .video,
                                      completionHandler: { (granted:Bool) -> Void in
                                          self.setupCapture();
            })
            return
        }
        if authorizationStatus == .restricted || authorizationStatus == .denied {
            accessDenied = true
        }
        if initialized {
            success = true
        } else {
            let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera,
                                                                                        .builtInTelephotoCamera,
                                                                                        .builtInDualCamera],
                                                                          mediaType: .video,
                                                                          position: .unspecified)

            if let captureDevice = deviceDiscoverySession.devices.first {
                do {
                    let videoInput = try AVCaptureDeviceInput(device: captureDevice)
                    captureSession.addInput(videoInput)
                    success = true
                } catch {
                    NSLog("Cannot construct capture device input")
                }
            } else {
                NSLog("Cannot get capture device")
            }
        }
        if success {
            DispatchQueue.global().async {
                self.captureSession.startRunning()
                DispatchQueue.main.async {
                    let captureMetadataOutput = AVCaptureMetadataOutput()
                    self.captureSession.addOutput(captureMetadataOutput)
                    let newSerialQueue = DispatchQueue(label: "barCodeScannerQueue") // in iOS 11 you can use main queue
                    captureMetadataOutput.setMetadataObjectsDelegate(self, queue: newSerialQueue)
                    captureMetadataOutput.metadataObjectTypes = self.barCodeTypes
                    self.videoPreviewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession)
                    self.videoPreviewLayer.videoGravity = .resizeAspectFill
                    self.videoPreviewLayer.frame = self.view.layer.bounds
                    self.view.layer.addSublayer(self.videoPreviewLayer)
                } 
            }
            initialized = true
        } else {
            // Only show a dialog if we have not just asked the user for permission to use the camera.  Asking permission
            // sends its own dialog to th user
            if !accessRequested {
                // Generic message if we cannot figure out why we cannot establish a camera session
                var message = "Cannot access camera to scan bar codes"
                #if (arch(i386) || arch(x86_64)) && (!os(macOS))
                    message = "You are running on the simulator, which does not hae a camera device.  Try this on a real iOS device."
                #endif
                if accessDenied {
                    message = "You have denied this app permission to access to the camera.  Please go to settings and enable camera access permission to be able to scan bar codes"
                }
                let alertPrompt = UIAlertController(title: "Cannot access camera", message: message, preferredStyle: .alert)
                let confirmAction = UIAlertAction(title: "OK", style: .default, handler: { (action) -> Void in
                    self.navigationController?.popViewController(animated: true)
                })
                alertPrompt.addAction(confirmAction)
                self.present(alertPrompt, animated: true, completion: nil)
            }
        }
    }

    func handleCapturedOutput(metadataObjects: [AVMetadataObject]) {
        if metadataObjects.count == 0 {
            return
        }

        guard let metadataObject = metadataObjects.first as? AVMetadataMachineReadableCodeObject else {
            return
        }

        if barCodeTypes.contains(metadataObject.type) {
            if let metaDataString = metadataObject.stringValue {
                captureSession.stopRunning()
                displayResult(code: metaDataString)
                return
            }
        }
    }

    func displayResult(code: String) {
        let alertPrompt = UIAlertController(title: "Bar code detected", message: code, preferredStyle: .alert)
        if let url = URL(string: code) {
            let confirmAction = UIAlertAction(title: "Launch URL", style: .default, handler: { (action) -> Void in
                UIApplication.shared.open(url, options: [:], completionHandler: { (result) in
                    if result {
                        NSLog("opened url")
                    } else {
                        let alertPrompt = UIAlertController(title: "Cannot open url", message: nil, preferredStyle: .alert)
                        let confirmAction = UIAlertAction(title: "OK", style: .default, handler: { (action) -> Void in
                        })
                        alertPrompt.addAction(confirmAction)
                        self.present(alertPrompt, animated: true, completion: {
                            self.setupCapture()
                        })
                    }
                })        
            })
            alertPrompt.addAction(confirmAction)
        }
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: { (action) -> Void in
            self.setupCapture()
        })
        alertPrompt.addAction(cancelAction)
        present(alertPrompt, animated: true, completion: nil)
    }

}

İkinci bölüm, yakalanan çıktıları yakaladığımız UIViewControlleralt sınıfımızın uzantısıdır AVCaptureMetadataOutputObjectsDelegate.

extension BarCodeScannerViewController: AVCaptureMetadataOutputObjectsDelegate {

    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        handleCapturedOutput(metadataObjects: metadataObjects)
    }

}

Swift 4.2 Güncellemesi

.UIApplicationWillEnterForegroundolarak değişir UIApplication.willEnterForegroundNotification.


bu Ürün adı, boyutu, fiyatı, ürün url'si, para birimi, mağaza adı verecek mi? ya da sadece @abdullahselek barkod numarasını verecektir
R. Mohan

@ R.Mohan okuduğunuz barkodla ilgili. Lütfen AVCaptureMetadataOutput ve AVMetadataMachineReadableCodeObject öğelerini kontrol edin ve handleCapturedOutput işlevinin metadataObjectsiçinde okumaya çalışın .
abdullahselek

Tamam, deneyeceğim. @Abdullahselek
R. Mohan

5

Bunun yardımcı olup olmayacağından emin değilim, ancak burada açık kaynak kodlu bir QR Kod kütüphanesine bir bağlantı var . Gördüğünüz gibi birkaç kişi zaten iphone için uygulamalar oluşturmak için bunu kullandı.

Wikipedia'da QR Kodlarının ne olduğunu açıklayan bir makale var . Bence QR Kodları, bu tür bir uygulama için tasarlandığı için iphone'un ilgili olduğu standart barkoddan çok amaca daha uygun.


5

İPad 2 veya iPod Touch desteği uygulamanız için önemliyse , iOS ve Android için Scandit barkod tarayıcı SDK'mız gibi bulanık görüntülerdeki barkodları çözebilen bir barkod tarayıcı SDK'sı seçerim . Kullanıcının otomatik netlemenin devreye girmesini beklemesi gerekmediğinden, bulanık barkod görüntülerinin kodunun çözülmesi otomatik netleme kameralı telefonlarda da yararlıdır.

Scandit, ücretsiz bir topluluk fiyat planıyla birlikte gelir ve ayrıca barkod numaralarını ürün adlarına dönüştürmeyi kolaylaştıran bir ürün API'sına sahiptir.

(Feragatname: Scandit'in kurucu ortağıyım)


4

Bu uygulamadaki deneyiminiz nasıl? Benim için basit bir datamatrix barkodunun kodunu çözmek 10s veya daha fazla zaman alıyor!
iamj4de


1
Doğrudan bağlantı (Google'ın bunu bir süre için yok edeceğini sanmıyorum) code.google.com/p/barcodeapp

Herkes Stefan'ın app Store'daki resmi adının ne olduğunu biliyor mu? Ben gerçek koda dalış önce indirmek istiyorum.
macutan

3

İPhone kamera ile ilgili sorun, ilk modellerin (tonları kullanımda olan) 2ft altındaki mesafeler için odakta resim çekemeyen sabit odaklı bir kameraya sahip olmasıdır. Görüntüler bulanık ve bozuk ve daha uzak bir mesafeden alınırsa barkoddan yeterli ayrıntı / bilgi yok.

Birkaç şirket, gelişmiş bulanıklaştırma önleme teknolojilerini kullanarak buna uygun iPhone uygulamaları geliştirmiştir. Apple uygulama mağazasında bulabileceğiniz uygulamalar: pic2shop, RedLaser ve ShopSavvy. Tüm şirketler, SDK'larının da bulunduğunu açıkladı - bazıları ücretsiz veya çok tercihli terimler için, bunu kontrol edin.


ShopSavvy'yi bir 3G iphone ile kullanmaya çalıştım. Eğlenceli, ama çok sık çöküyor ve çok net, düz barkodları okumak için çok, çok zor bir zaman var.
James Moore

1
Ve ben sadece pic2shop denedim. Nişanlımdan alıntı: "Bu hayatımızı nasıl kolaylaştıracak?" Bu sevimli bir uygulama, ama aslında anlayabildiğim kadarıyla bir barkod okuyamıyor.
James Moore

Hangi biçimi okumaya çalıştınız? EAN'ı taramak için pic2shop'u kullanmaya çalıştım ve çok iyi çalışıyor. Lisans ücreti pahalı olsa da RedLaser'dan bile daha fazla.
iamj4de

2

Swift 5 ile basit ve süper hızlı !!

Sadece kakao bakla "BarcodeScanner" eklemeniz gerekiyor tam kod

source 'https://github.com/CocoaPods/Specs.git' 
platform :ios, '12.0' 
target 'Simple BarcodeScanner' 
do   
pod 'BarcodeScanner' 
end

.Plist dosyanıza Kamera izni eklediğinizden emin olun

<key>NSCameraUsageDescription</key>
<string>Camera usage description</string>

Ve ViewController'ınıza Tarayıcı ve işlemciyi bu şekilde ekleyin

import UIKit
import BarcodeScanner

class ViewController: UIViewController, BarcodeScannerCodeDelegate, BarcodeScannerErrorDelegate, BarcodeScannerDismissalDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let viewController = BarcodeScannerViewController()
        viewController.codeDelegate = self
        viewController.errorDelegate = self
        viewController.dismissalDelegate = self

        present(viewController, animated: true, completion: nil)
    }

    func scanner(_ controller: BarcodeScannerViewController, didCaptureCode code: String, type: String) {
        print("Product's Bar code is :", code)
        controller.dismiss(animated: true, completion: nil)
    }

    func scanner(_ controller: BarcodeScannerViewController, didReceiveError error: Error) {
        print(error)
    }

    func scannerDidDismiss(_ controller: BarcodeScannerViewController) {
        controller.dismiss(animated: true, completion: nil)
    }
}

Hala ve herhangi bir soru veya zorluklar, tam kaynak kodu ile burada örnek uygulama kontrol edin



1

Bu AVFramework kullanılarak yapılabilir inanıyorum, İşte bunu yapmak için örnek kod

import UIKit
import AVFoundation

class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate
{

    @IBOutlet weak var lblQRCodeResult: UILabel!
    @IBOutlet weak var lblQRCodeLabel: UILabel!

    var objCaptureSession:AVCaptureSession?
    var objCaptureVideoPreviewLayer:AVCaptureVideoPreviewLayer?
    var vwQRCode:UIView?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.configureVideoCapture()
        self.addVideoPreviewLayer()
        self.initializeQRView()
    }

    func configureVideoCapture() {
        let objCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
        var error:NSError?
        let objCaptureDeviceInput: AnyObject!
        do {
            objCaptureDeviceInput = try AVCaptureDeviceInput(device: objCaptureDevice) as AVCaptureDeviceInput

        } catch let error1 as NSError {
            error = error1
            objCaptureDeviceInput = nil
        }
        objCaptureSession = AVCaptureSession()
        objCaptureSession?.addInput(objCaptureDeviceInput as! AVCaptureInput)
        let objCaptureMetadataOutput = AVCaptureMetadataOutput()
        objCaptureSession?.addOutput(objCaptureMetadataOutput)
        objCaptureMetadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
        objCaptureMetadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
    }

    func addVideoPreviewLayer() {
        objCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: objCaptureSession)
        objCaptureVideoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
        objCaptureVideoPreviewLayer?.frame = view.layer.bounds
        self.view.layer.addSublayer(objCaptureVideoPreviewLayer!)
        objCaptureSession?.startRunning()
        self.view.bringSubviewToFront(lblQRCodeResult)
        self.view.bringSubviewToFront(lblQRCodeLabel)
    }

    func initializeQRView() {
        vwQRCode = UIView()
        vwQRCode?.layer.borderColor = UIColor.redColor().CGColor
        vwQRCode?.layer.borderWidth = 5
        self.view.addSubview(vwQRCode!)
        self.view.bringSubviewToFront(vwQRCode!)
    }

    func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
        if metadataObjects == nil || metadataObjects.count == 0 {
            vwQRCode?.frame = CGRectZero
            lblQRCodeResult.text = "QR Code wans't found"
            return
        }
        let objMetadataMachineReadableCodeObject = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
        if objMetadataMachineReadableCodeObject.type == AVMetadataObjectTypeQRCode {
            let objBarCode = objCaptureVideoPreviewLayer?.transformedMetadataObjectForMetadataObject(objMetadataMachineReadableCodeObject as AVMetadataMachineReadableCodeObject) as! AVMetadataMachineReadableCodeObject
            vwQRCode?.frame = objBarCode.bounds;
            if objMetadataMachineReadableCodeObject.stringValue != nil {
                lblQRCodeResult.text = objMetadataMachineReadableCodeObject.stringValue
            }
        }
    }
}

1

İşte basit kod:

func scanbarcode()
{
    view.backgroundColor = UIColor.blackColor()
    captureSession = AVCaptureSession()

    let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    let videoInput: AVCaptureDeviceInput

    do {
        videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
    } catch {
        return
    }

    if (captureSession.canAddInput(videoInput)) {
        captureSession.addInput(videoInput)
    } else {
        failed();
        return;
    }

    let metadataOutput = AVCaptureMetadataOutput()

    if (captureSession.canAddOutput(metadataOutput)) {
        captureSession.addOutput(metadataOutput)

        metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
        metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypePDF417Code]
    } else {
        failed()
        return
    }

    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession);
    previewLayer.frame = view.layer.bounds;
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    view.layer.addSublayer(previewLayer);
    view.addSubview(closeBtn)
    view.addSubview(backimg)

    captureSession.startRunning();

}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func failed() {
    let ac = UIAlertController(title: "Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.", preferredStyle: .Alert)
    ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
    presentViewController(ac, animated: true, completion: nil)
    captureSession = nil
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    if (captureSession?.running == false) {
        captureSession.startRunning();
    }
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)

    if (captureSession?.running == true) {
        captureSession.stopRunning();
    }
}

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
    captureSession.stopRunning()

    if let metadataObject = metadataObjects.first {
        let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject;

        AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
        foundCode(readableObject.stringValue);
    }

   // dismissViewControllerAnimated(true, completion: nil)
}

func foundCode(code: String) {
    var createAccountErrorAlert: UIAlertView = UIAlertView()
    createAccountErrorAlert.delegate = self
    createAccountErrorAlert.title = "Alert"
    createAccountErrorAlert.message = code
    createAccountErrorAlert.addButtonWithTitle("ok")
    createAccountErrorAlert.addButtonWithTitle("Retry")
    createAccountErrorAlert.show()
    NSUserDefaults.standardUserDefaults().setObject(code, forKey: "barcode")
    NSUserDefaults.standardUserDefaults().synchronize()
    ItemBarcode = code
    print(code)
}

override func prefersStatusBarHidden() -> Bool {
    return true
}

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return .Portrait
}

1

Swift 4 ile iOS> 10.2 için geliştiriyorsanız, çözümümü deneyebilirsiniz. Ben bu ve bu öğretici karışık ve bir QR kodu ve print()dışarı tarama bir ViewController ile geldi . Ayrıca kamera ışığını değiştirmek için kullanıcı arayüzümde bir Anahtar var, ayrıca yardımcı olabilir. Şimdilik sadece bir iPhone SE'de test ettim, lütfen daha yeni iPhone'larda çalışmıyorsa bana bildirin.

Hadi bakalım:

import UIKit
import AVFoundation

class QRCodeScanner: UIViewController, AVCaptureMetadataOutputObjectsDelegate {

    let captureSession: AVCaptureSession = AVCaptureSession()
    var videoPreviewLayer: AVCaptureVideoPreviewLayer?
    let qrCodeFrameView: UIView = UIView()
    var captureDevice: AVCaptureDevice?

    override func viewDidLoad() {
        // Get the back-facing camera for capturing videos
        let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera, .builtInDualCamera], mediaType: AVMediaType.video, position: .back)

        captureDevice = deviceDiscoverySession.devices.first
        if captureDevice == nil {
            print("Failed to get the camera device")
            return
        }

        do {
            // Get an instance of the AVCaptureDeviceInput class using the previous device object.
            let input = try AVCaptureDeviceInput(device: captureDevice!)

            // Set the input device on the capture session.
            captureSession.addInput(input)

            // Initialize a AVCaptureMetadataOutput object and set it as the output device to the capture session.
            let captureMetadataOutput = AVCaptureMetadataOutput()
            captureSession.addOutput(captureMetadataOutput)

            // Set delegate and use the default dispatch queue to execute the call back
            captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
            captureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]

            // Initialize the video preview layer and add it as a sublayer to the viewPreview view's layer.

            videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)

            if let videoPreviewLayer = videoPreviewLayer {
                videoPreviewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
                videoPreviewLayer.frame = view.layer.bounds
                view.layer.addSublayer(videoPreviewLayer)

                // Start video capture.
                captureSession.startRunning()

                if let hasFlash = captureDevice?.hasFlash, let hasTorch = captureDevice?.hasTorch {
                    if hasFlash && hasTorch {
                        view.bringSubview(toFront: bottomBar)
                        try captureDevice?.lockForConfiguration()
                    }
                }
            }

            // QR Code Overlay
            qrCodeFrameView.layer.borderColor = UIColor.green.cgColor
            qrCodeFrameView.layer.borderWidth = 2
            view.addSubview(qrCodeFrameView)
            view.bringSubview(toFront: qrCodeFrameView)

        } catch {
            // If any error occurs, simply print it out and don't continue any more.
            print("Error: \(error)")
            return
        }
    }

    // MARK: Buttons and Switch

    @IBAction func switchFlashChanged(_ sender: UISwitch) {
        do {
            if sender.isOn {
                captureDevice?.torchMode = .on
            } else {
                captureDevice?.torchMode = .off
            }
        }
    }

    // MARK: AVCaptureMetadataOutputObjectsDelegate

    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {

        // Check if the metadataObjects array is not nil and it contains at least one object.
        if metadataObjects.count == 0 {
            qrCodeFrameView.frame = CGRect.zero
            return
        }

        // Get the metadata object.
        let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject

        if metadataObj.type == AVMetadataObject.ObjectType.qr {
            // If the found metadata is equal to the QR code metadata then update the status label's text and set the bounds
            let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj)
            qrCodeFrameView.frame = barCodeObject!.bounds

            print("QR Code: \(metadataObj.stringValue)")
        }
    }
}

0

Bazen QR kodları oluşturmak da yararlı olabilir . Bunun için bir cazibe gibi çalışan mükemmel bir C kütüphanesi var. Buna libqrencode denir . QR kodunu görüntülemek için özel bir görünüm yazmak o kadar zor değildir ve temel bir QuartzCore anlayışı ile yapılabilir.


Bunu bir iOS xCode projesine nasıl ekleyeceğiniz konusunda herhangi bir öğretici biliyor musunuz?
james

Quartcore kullanarak görünümü nasıl oluşturduğunuzu paylaşır mısınız? büyük bir zaman kazandıracaktı: P
ThomasRS

Bu doğru. Ancak, kütüphanenin yayınlandığı yazılım lisansıyla uyumlu olduğunuzdan emin olun.
GorillaPatch

Bu soru nesil ile değil tanıma ile ilgilidir.
MonsieurDart

0

QR Kodunu ve ECN / ISBN kodlarını okumak için ZBarSDK'yı kontrol edebilirsiniz.

- (void)scanBarcodeWithZBarScanner
  {
// ADD: present a barcode reader that scans from the camera feed
ZBarReaderViewController *reader = [ZBarReaderViewController new];
reader.readerDelegate = self;
reader.supportedOrientationsMask = ZBarOrientationMaskAll;

ZBarImageScanner *scanner = reader.scanner;
// TODO: (optional) additional reader configuration here

// EXAMPLE: disable rarely used I2/5 to improve performance
 [scanner setSymbology: ZBAR_I25
               config: ZBAR_CFG_ENABLE
                   to: 0];

//Get the return value from controller
[reader setReturnBlock:^(BOOL value) {

}

ve didFinishPickingMediaWithInfo'da barkod değerini alırız.

    - (void) imagePickerController: (UIImagePickerController*) reader
   didFinishPickingMediaWithInfo: (NSDictionary*) info
   {
    // ADD: get the decode results
    id<NSFastEnumeration> results =
    [info objectForKey: ZBarReaderControllerResults];
    ZBarSymbol *symbol = nil;
    for(symbol in results)
    // EXAMPLE: just grab the first barcode
    break;

    // EXAMPLE: do something useful with the barcode data
    barcodeValue = symbol.data;

    // EXAMPLE: do something useful with the barcode image
    barcodeImage =   [info objectForKey:UIImagePickerControllerOriginalImage];
    [_barcodeIV setImage:barcodeImage];

    //set the values for to TextFields
    [self setBarcodeValue:YES];

    // ADD: dismiss the controller (NB dismiss from the *reader*!)
    [reader dismissViewControllerAnimated:YES completion:nil];
   }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.