【问题标题】:Swift iOS 9 QR scannerSwift iOS 9 二维码扫描仪
【发布时间】:2015-11-04 14:58:31
【问题描述】:

我正在快速开发一个 QR 扫描仪,它应该打开一个 URL 并将 QR 数据解析为 URL,然后再加载到新制作的 webview 中。

为此,我用我的 URL 和获取的字符串创建了一个字符串,但添加了扫描的数据。

在没有该功能的情况下扫描时,数据被解析为标签“lblQRCodeResult”没有问题,但是在某些时候尝试打开加载地址的webview时,应用程序崩溃。

有什么建议吗?

我的代码目前如下所示:

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
        if metadataObjects == nil || metadataObjects.count == 0 {
            vwQRCode?.frame = CGRectZero
            lblQRCodeResult.text = "NO QRCode text detacted"
            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 {

                let newString = "http://192.168.2.1/qr.php?type=buy&prod=" + objMetadataMachineReadableCodeObject.stringValue;
                lblQRCodeResult.text = newString

                let webV:UIWebView = UIWebView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height))
                webV.loadRequest(NSURLRequest(URL: NSURL(string: newString)!))
                webV.delegate = self;
                self.view.addSubview(webV)
            }
        }
    }

【问题讨论】:

  • 如果您的应用程序崩溃,错误信息是什么?

标签: ios swift uiwebview nsurlrequest


【解决方案1】:

当您尝试获取objBarCode 时,您将变量转换为显式展开的AVMetadataMachineReadableCodeObject,保证它始终存在。但是,您的 objCaptureVideoPreviewLayer 是可选的,转换函数可能会返回一个 nil 对象,如文档中所述。

没有错误信息很难说,但请检查objBarCodeNSURL 是否都有效。

【讨论】:

    【解决方案2】:

    解决了问题。

    let newString = "http://192.168.2.1/qr.php?type=buy&prod=" + objMetadataMachineReadableCodeObject.stringValue;
    
    let url = NSString(string: newString)
    let urlStr = NSString(string: url.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)
    let newNS = NSURL(string: urlStr as String)
    print(newNS)
    
    //Load URL
    webV.loadRequest(NSURLRequest(URL: newNS!))
    

    【讨论】: