2017-12-28 4 views
-1

私が初めてAVFoundationを使用していますをスキャンしたときに私のビューは消え、私はちょっと働いて私のスクリプトを得ていますそのチケットが使用されているかどうかをチェックします。 (私はAPIログインを隠してしまった)。しかし、私はqrコードをスキャンするとすぐに、私のコードが実行され、私はコンソールでチケットの有効なplottetを得るが、viewcontrollerは解読し、私のログインページに戻ります。...私はQRコード

私はこのコードを使用しています。私のログインページでは、QRコードでviewcontrollerを表示しています。

let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "scanner") as UIViewController 

self.present(viewController, animated: false, completion: nil) 

QRスキャナを備えたビューコントローラ。

// 
// scanner.swift 
// GB Billet Scanner 
// 
// Created by Benjamin Eibye on 26/12/2017. 
// Copyright © 2017 GymBilletter.dk. All rights reserved. 
// 

import UIKit 
import AVFoundation 
import Alamofire 

class scanner: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 

    @IBOutlet weak var videoPreview: UIView! 
    @IBOutlet weak var navnLabel: UILabel! 
    let avCaptureSession = AVCaptureSession() 

    var returnValue: String = String() 

    enum error: Error { 
     case noCameraAvailable 
     case videoInputInitFail 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Creating session 

     do { 
      try scanQRCode() 
     } catch { 
      print("Failed to scan the QR/BarCode") 
     } 

    } 

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

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

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

      AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) 
      //print(readableObject.stringValue!); 

      navnLabel.text = "Indlæser billet #\(readableObject.stringValue!)" 

      let urlEnc = "https://domain?token=\(String(describing: UserDefaults.standard.object(forKey: "token")!))&ticket=\(readableObject.stringValue!)" 

      Alamofire.request(urlEnc).responseJSON { response in 
       //print(urlEnc) 
       //debugPrint(response) 
       //print(response.result) 
       if let result = response.result.value { 
        let JSON = result as! NSDictionary 

        if JSON["error"] as? Int == 5002 { 
         print("User not Authendicated") 
         print(urlEnc) 
         self.navnLabel.text = "Telefonen er ikke logget ind" 
         self.avCaptureSession.startRunning() 

        } else if JSON["error"] as? Int == 5003 { 
         print("Ticket not Found") 
         self.navnLabel.text = "Billetten blev ikke fundet" 
         self.avCaptureSession.startRunning() 

        } else { 
         // Billetten eksistere 
         print("Billet fundet") 
         if JSON["active"] as! String == "1" { 

          print("ticket Valid") 
          self.avCaptureSession.startRunning() 

         } else { 
          print("Billetten er blevet brugt") 
          self.navnLabel.text = "Billetten er blevet brugt \(String(describing: JSON["used_date"]))" 
         } 

        } 

       } 

      } 


     } 

     dismiss(animated: true) 
    } 

    func scanQRCode() throws { 

     guard let avCaptureDevice = AVCaptureDevice.default(for: AVMediaType.video) else { 
      print("no camera.") 
      throw error.noCameraAvailable 
     } 

     guard let avCaptureInput = try? AVCaptureDeviceInput(device: avCaptureDevice) else { 
      print("Faild to init camera.") 
      throw error.videoInputInitFail 
     } 

     let avCaptureMetadataOutput = AVCaptureMetadataOutput() 
     avCaptureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 
     avCaptureSession.addInput(avCaptureInput) 
     avCaptureSession.addOutput(avCaptureMetadataOutput) 

     avCaptureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr] 

     let avCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: avCaptureSession) 
     avCaptureVideoPreviewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill 
     avCaptureVideoPreviewLayer.frame = videoPreview.bounds 

     self.videoPreview.layer.addSublayer(avCaptureVideoPreviewLayer) 

     avCaptureSession.startRunning() 


    } 

    @IBAction func anuller(_ sender: Any) { 

     navnLabel.text = "Scan billet." 
     avCaptureSession.startRunning() 

    } 


    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 

} 

答えて

2

あなたmetadataOutput(...)機能の終わりにdismiss(animated: true)は関係なく、返されたもののと呼ばれています。

+0

ありがとう、私は今、どのように愚かな質問だったかを見ることができます。しかし、本当にありがとうございました。スクリプトのPHPから4時間遅れてしまいました。 –