2017-07-18 15 views
0

私はQRコードリーダーで構成されるプロジェクトに取り組んでいます。 QRコードがURLに埋め込まれている場合、出力に関しては、私はアプリケーションがWebリンクを開くようにしたいと思います。たとえば、www.google.comに埋め込まれたQRコードをスキャンすると、アプリがGoogleを開くはずです。QRコードをスキャンした後にURLを開く方法は?

以下は、私のコードです:今のところどうやら

class QRScannerController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 
    @IBOutlet var messageLabel:UILabel! 
    @IBOutlet var topbar: UIView! 

    var captureSession:AVCaptureSession? 
    var videoPreviewLayer:AVCaptureVideoPreviewLayer? 
    var qrCodeFrameView:UIView? 

    let supportedCodeTypes = [AVMetadataObjectTypeUPCECode, 
         AVMetadataObjectTypeCode39Code, 
         AVMetadataObjectTypeCode39Mod43Code, 
         AVMetadataObjectTypeCode93Code, 
         AVMetadataObjectTypeCode128Code, 
         AVMetadataObjectTypeEAN8Code, 
         AVMetadataObjectTypeEAN13Code, 
         AVMetadataObjectTypeAztecCode, 
         AVMetadataObjectTypePDF417Code, 
         AVMetadataObjectTypeQRCode] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Get an instance of the AVCaptureDevice class to initialize a device object and provide the video as the media type parameter. 
     let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

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

      // Initialize the captureSession object. 
      captureSession = AVCaptureSession() 

      // 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 = supportedCodeTypes 

      // Initialize the video preview layer and add it as a sublayer to the viewPreview view's layer. 
      videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
      videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
      videoPreviewLayer?.frame = view.layer.bounds 
      view.layer.addSublayer(videoPreviewLayer!) 

      // Start video capture. 
      captureSession?.startRunning() 

      // Move the message label and top bar to the front 
      view.bringSubview(toFront: messageLabel) 
      view.bringSubview(toFront: topbar) 

      // Initialize QR Code Frame to highlight the QR code 
      qrCodeFrameView = UIView() 

      if let qrCodeFrameView = qrCodeFrameView { 
       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) 
      return 
     } 
    } 

    // MARK: - AVCaptureMetadataOutputObjectsDelegate Methods 

    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { 
     // Check if the metadataObjects array is not nil and it contains at least one object. 
     if metadataObjects == nil || metadataObjects.count == 0 { 
      qrCodeFrameView?.frame = CGRect.zero 
      messageLabel.text = "No QR/barcode is detected" 
      return 
     } 

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

     if supportedCodeTypes.contains(metadataObj.type) { 
      // 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 

      if metadataObj.stringValue != nil { 
       messageLabel.text = metadataObj.stringValue 
      } 
     } 
    } 
} 

、それだけで検出し、TextViewの中にURLが表示されます。私は助けていただければ幸いです。前もって感謝します。

+0

次に、metadataObj.stringValueからURLを取得して開きます。 – GeneCode

答えて

0

使用このリンクを検出し、

let string = "some other text http://www.google.com should detect the link" 

    // Do any additional setup after loading the view, typically from a nib. 
    do{ 
     let dataDetector = try NSDataDetector(types: NSTextCheckingAllTypes) 

     dataDetector.enumerateMatches(in: string, options: .withoutAnchoringBounds, range: NSRange(location: 0, length: string.characters.count), using: { (result, matchingFlags, pointer) in 
      if(result?.resultType == .link) 
      { 
       if let url = URL(string: NSString(string: string).substring(with: (result?.range)!)) 
       { 
        if(UIApplication.shared.canOpenURL(url)) 
        { 
         if #available(iOS 10.0, *) { 
          UIApplication.shared.open(url, options: [:], completionHandler: nil) 
         } else { 
          // Fallback on earlier versions 
          UIApplication.shared.openURL(url) 
         } 
        } 
       } 
      } 
     }) 
    } 
    catch 
    { 

    } 

それを開くことを期待これは、私はちょうどあなたのコードを編集したあなたは、このようにURLを開くことができるか、あなたは@Reinier答え

に従うことができます

+0

ありがとう@ハニー –

+0

@Kinjaあなたはこの答えを試しましたか? –

+0

明らかに私はkumar oneを代わりに使ってみましたが、今は代わりに作成したView Controllerにリンクしたいのですが、解決法を知っていますか? – Kinja

0

を支援@Kinja

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

if supportedCodeTypes.contains(metadataObj.type) { 
    // 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 

    if metadataObj.stringValue != nil { 
     let url = URL(string: metadataObj.stringValue)! 
     if #available(iOS 10.0, *) { 
      UIApplication.shared.open(url, options: [:], completionHandler: nil) 
     } else { 
      UIApplication.shared.openURL(url) 
     } 
     // messageLabel.text = metadataObj.stringValue 
    } 
} 

おかげ

関連する問題