Xcode、二维码扫描仪、如何向webview传值

问题描述 投票:0回答:0

问题是关于将扫描的值传递给webview。

工作:我点击 html 侧的按钮,扫描仪打开,扫描并关闭。

问题:当扫描仪检测到某个值时,该值不会传递到 webview 或日志

问题 2:打印日志(“QRSCANNX 未在控制台应用程序上显示或打印,难以调试

//
//  .swift


import UIKit
import SwiftUI
import AVFoundation


struct BarCodeScanner : UIViewControllerRepresentable {
    
    @Binding var isbn: String?
    @Binding var foundBooks: Books?
    
    @Environment(\.presentationMode) private var presentationMode
    
    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
        
    }
    
    func makeCoordinator() -> Coordinator {
        return Coordinator(self)
    }
    
    func makeUIViewController(context: Context) -> UIViewController {
        let vc = UIViewController()
        vc.view.backgroundColor = UIColor.black
        
        context.coordinator.captureSession = AVCaptureSession()
        

        guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else { fatalError() }
        let videoInput: AVCaptureDeviceInput
        videoInput = try! AVCaptureDeviceInput(device: videoCaptureDevice)
        

        if (context.coordinator.captureSession.canAddInput(videoInput)) {
            context.coordinator.captureSession.addInput(videoInput)
        } else {
            print("QRSCANNX (makeUIViewController) Could not add input to capture session")
        }

        let metadataOutput = AVCaptureMetadataOutput()

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

            metadataOutput.setMetadataObjectsDelegate(context.coordinator, queue: DispatchQueue.main)
            metadataOutput.metadataObjectTypes = [.ean8, .ean13, .pdf417, .aztec, .code128, .code39, .code39Mod43, .code93, .dataMatrix, .qr, .upce]
        } else {
           
            print("QRSCANNX (makeUIViewController) Outputproblem")
        }

        context.coordinator.previewLayer = AVCaptureVideoPreviewLayer(session: context.coordinator.captureSession)
        context.coordinator.previewLayer.frame = vc.view.layer.bounds
        context.coordinator.previewLayer.videoGravity = .resizeAspectFill
        vc.view.layer.addSublayer(context.coordinator.previewLayer)

        context.coordinator.captureSession.startRunning()
        
        
        return vc
    }
    
    class Coordinator : NSObject, AVCaptureMetadataOutputObjectsDelegate {
        
        let parent: BarCodeScanner
        
        var captureSession: AVCaptureSession!
        var previewLayer: AVCaptureVideoPreviewLayer!
        
        init(_ parent: BarCodeScanner) {
            self.parent = parent
        }
        
        func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
            
            if let metadataObject = metadataObjects.first {
                guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }
                guard let stringValue = readableObject.stringValue else { return }
                AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
                print("QRSCANNX (metadataOutput) " + stringValue)
                found(code: stringValue, type: metadataObject.type.rawValue)
                captureSession.stopRunning()
                parent.presentationMode.wrappedValue.dismiss()
            }
        }
        
        func found(code: String, type: String) {
            print("QRSCANNX (func found) " + code + " " + type)
            parent.isbn = code

            // Load existing URL and append scanned value
            if var urlString = UserDefaults.standard.string(forKey: "stuburl") {
                urlString += "&qrx_scannedvalue=" + code
                print("QRSCANNX (func found) New URL string: " + urlString)

                // Save new URL
                UserDefaults.standard.setValue(urlString, forKey: "stuburl")

                // Post notification with new URL 
                NotificationCenter.default.post(name: NSNotification.Name("NewScannedURL"), object: urlString)

                // Stop running the capture session and dismiss the scanner
                captureSession.stopRunning()
                parent.presentationMode.wrappedValue.dismiss()
            }
        }
        
    }
}



-----------------

//

import UIKit
import WebKit
import SwiftUI

class ViewController: UIViewController, WKNavigationDelegate {
    
    var webView: WKWebView!
    let stubdomain = "productionsculturesurbaines.com"
    let stubstoreid = "20535582634846"
    let rss_owner = "productionsculturesurbaines"
    let startpage = "mobile_rand/"
    
    override func loadView() {...}
    
    override func viewDidLoad() {...}
    
    // SCANNER
    @objc func loadScannedURL(_ notification: NSNotification) {
        print("QRSCANNX (loadScannedURL) before if let ")
        if let urlString = notification.object as? String, let _ = URL(string: urlString), let code = URLComponents(string: urlString)?.queryItems?.first(where: { $0.name == "qrx_scannedvalue" })?.value {
            
            print("QRSCANNX (loadScannedURL) Received URL string: " + urlString)
            print("QRSCANNX (loadScannedURL) Extracted code: " + code)
            
            // Prepare a JavaScript string that sets the innerHTML of the div with id "myDivId" to the scanned code
            webView.evaluateJavaScript("document.getElementById('qrx_scannedvalue').innerHTML = '" + code + "';")
        }
    }
        
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        
        // TITLE
        title = ""
        
        // PREP SPECIAL LINKS
        let nru = navigationAction.request.url
        var nruspecial = 0
        
        // SCHEME CHECK TELL SMS MAILTO
        if nru?.scheme == "tel" { nruspecial = 1 }
       ...
        
        // FILE EXTENSIONS
        let files = Set( [".pdf",".doc",".docx",".txt",".xls",".xlsx",".mp3",".wav",".aif",".mp4",".mov",".avi",".h26",".ics",".vcard",".ods",".odt"] )
        
        // EXTERNAL DOMAINS
        let externaldomains = Set( [stubdomain,"stubfeedevent.com","stubfee.com"] )
        
        // QRCODE SCANNER
        let scanners = Set( ["qrcodescan","barcodescan"] )
        
        // IF URL CONTAINS FILES
        if let fullnru = navigationAction.request.url?.absoluteString,
           files.contains(where: { fullnru.contains($0) }) { nruspecial = 2 }
        
        // IF URL CONTAINS EXTERNAL DOMAINS
        if let fullnru = navigationAction.request.url?.absoluteString,
           externaldomains.contains(where: { fullnru.contains($0) }) {  } else { nruspecial = 1 }
        
        // IF URL CONTAINS SCANNERS
        if let fullnru = navigationAction.request.url?.absoluteString,
           scanners.contains(where: { fullnru.contains($0) }) { nruspecial = 3 }
    
        print("QRSCANNX before nruspecial")
        
        // IF URL SPECIAL
        switch nruspecial {
        
            case 3:
            
                print("QRSCANNX nruspecial case 3")
                
                // Saving stuburl
                let prefs = UserDefaults.standard
                prefs.setValue(navigationAction.request.url?.absoluteString, forKey: "stuburl")
                prefs.synchronize()
                
                // LOAD BAR CODE SCANNER
                let barCodeScanner = BarCodeScanner(isbn: .constant(nil), foundBooks: .constant(nil))
                let hostingController = UIHostingController(rootView: barCodeScanner)
                self.present(hostingController, animated: true, completion: nil)
                
                decisionHandler(.cancel)
                
            case 2:
                UIApplication.shared.open(nru!)
                decisionHandler(.cancel)
                
            case 1:
                UIApplication.shared.open(nru!)
                decisionHandler(.cancel)
                
            default:
                decisionHandler(.allow)
            
        }
        
    }
    
}
xcode webview qr-code barcode-scanner
© www.soinside.com 2019 - 2024. All rights reserved.