问题是关于将扫描的值传递给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)
}
}
}