2017-02-14 1 views
0

사용자를 웹 응용 프로그램으로 안내하는 아주 간단한 응용 프로그램을 만들었습니다 ... 응용 프로그램 내의 페이지 중 하나를 사용하면 다양한 상점 (수동으로 입력 한 상점 번호)을 검색 할 수 있습니다 또는 가장 가까운 상점 자동으로 위치) 다음 사용자에게 적절한 바코드를 입력하도록 요청 ... 나는 바코드 스캐너 (별도의보기 컨트롤러) 바코드 캡처 후 uiwebview 반환하는 추가했습니다 ... 어떻게 특정 div 필드에 바코드를 자동으로 입력 한 다음 js 함수를 실행할 수 있습니까? 나는 evaluatejavascript를 시도했지만 매우 유용하지는 않습니다 ... 거의 포기하고, 당신은 나의 마지막 희망입니다! 로 다음과 :Xcode/Swift 내의 웹 사이트 제어 UIWebView

보기 컨트롤러 ...

import UIKit 
import WebKit 


class ViewController: UIViewController { 

    var webView: WebView 




    @IBOutlet weak var searchText: UITextField! 


    required init(coder aDecoder: NSCoder) { 
     self.webView = WebView() 
     super.init(coder: aDecoder)! 
    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.addSubview(webView) 
     webView.setPosition(view) 
    } 

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

    // MARK: Actions 

    @IBAction func UseBCode(_ sender: Any) { 
     webView.FillIn() 
    } 

    @IBAction func siteHomeBtn(_ sender: UIButton) { 
     webView.setUrl("https://intranet.testsite.com/index.html") 
    } 

    @IBAction func searchBtn(_ sender: UIButton) { 
     print ("Navigating to: \(searchText.text)") 
     webView.setUrl(searchText.text) 
    } 

    @IBAction func appHomeBtn(_ sender: UIButton) { 
     webView.setUrl("https://intranet.testsite.com/index.html") 
    } 

    @IBAction func backBtn(_ sender: UIButton) { 
     webView.back() 
    } 


    @IBAction func forwardBtn(_ sender: UIButton) { 
     //webView.forward() 
    } 

    @IBAction func unwindToHomeScreen(segue: UIStoryboardSegue) { 
     dismiss(animated: true, completion: nil) 
    //webView.FillIn() 
     //webView.popup() 

    } 

    override func viewDidAppear(_ animated: Bool) { 
     webView.FillIn() 

    } 

} 


QRScannerController 

import UIKit 
import AVFoundation 

var BCode = "" 

class QRScannerController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 

    @IBOutlet var Back2: UIButton! 

    @IBOutlet var topBar: UIView! 

    @IBOutlet var messageLabel: UILabel! 



    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 
     } 
    } 

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


    // 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 barcode 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 = "Use " + metadataObj.stringValue 

       // Copy the barcode text to the clipboard. 
       let clipboard = UIPasteboard.general 
       clipboard.string = metadataObj.stringValue 
      view.bringSubview(toFront: messageLabel) 

       BCode = metadataObj.stringValue 


       } 

      } 
     } 
    } 

Webview.script... the fillin function is me playing (to very little avail! :(

import UIKit 
import WebKit 

class WebView : WKWebView { 

    /** 
    Initialize the WKWebView. 
    */ 
    init(){ 
     let webConfig:WKWebViewConfiguration = WKWebViewConfiguration() 
     super.init(frame:CGRect.zero,configuration:webConfig) 
     self.translatesAutoresizingMaskIntoConstraints = false 
     self.allowsBackForwardNavigationGestures = true 

     createHomePage() 
    } 


    required init?(coder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    /** 
    Set the position for the WKWebView. 
    */ 
    func setPosition(_ view: UIView) { 
     self.translatesAutoresizingMaskIntoConstraints = false; 
     let height = NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: view, attribute: .height, multiplier: 1, constant: -60) 
     let width = NSLayoutConstraint(item: self, attribute: .width, relatedBy: .equal, toItem: view, attribute: .width, multiplier: 1, constant: 0) 
     let top = NSLayoutConstraint(item:self,attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1, constant: 20) 
     view.addConstraints([height, width, top]) 
    } 

    /** 
    Set the url the webview should display. 
    */ 
    func setUrl(_ url:String!) { 
     if url != nil { 
      let url = URL(string:url) 
      let request = URLRequest(url:url!) 
      self.load(request) 
     } 
    } 

    /** 
    Create the home page. 
    */ 
    func createHomePage() { 
     self.setUrl("https://intranet.testsite.com/index.html") 
     drawHomePage() 
    } 

    /** 
    Draw the home page. 
    */ 
    func drawHomePage() { 
     let javaSCriptString="document.body.style.background=\"#ffc\"" 
     //self.loadHTMLString("<h1>Top20</h1>", baseURL: nil) 
     self.evaluateJavaScript(javaSCriptString, completionHandler: nil) 
    } 

    /** 
    Go to the home page. 
    */ 
    func setAppHome() { 
     print("The first item is \(self.findFirstItem()?.url)") 
     let item = findFirstItem() 
     if item != nil { 
      self.go(to: item!) 
      drawHomePage() 
     } 
    } 

    /** 
    Find the first item in the list of websites. 
    */ 
    func findFirstItem() -> WKBackForwardListItem? { 
     var index=0 
     if (self.backForwardList.item(at: 0)==nil) { 
      return nil 
     } 
     while self.backForwardList.item(at: index) != nil { 
      index -= 1 
     } 
     return self.backForwardList.item(at: index+1) 
    } 

    /** 
    Handle forward navigation. 
    */ 
    func forward() { 
     if self.canGoForward { 
      self.goForward() 
     } else { 
      print("Cannot go forward.") 
     } 
    } 

    /** 
    Handle backward navigation. 
    */ 
    func back(){ 
     if self.canGoBack { 
      self.goBack() 
      //self.evaluateJavaScript("document.getElementByID('barcode').innerHTML = '" + BCode + "'", completionHandler: nil) 
     } else { 
      print("Cannot go backwards.") 
     } 
    } 

    func FillIn() { 

     // fill data 
     //let savedUsername = "USERNAME" 
     //let savedPassword = "PASSWORD" 
     let javaSCriptString="document.getElementByID('barcode').innerHTML = '" + BCode + "'" 
     //self.loadHTMLString("<h1>Top20</h1>", baseURL: nil) 
     self.evaluateJavaScript(javaSCriptString, completionHandler: nil) 

     self.evaluateJavaScript("document.getElementByID('barcode').innerHTML = '" + BCode + "'") 

     let source="appfunction('" + BCode + "'" 
     //self.loadHTMLString("<h1>Top20</h1>", baseURL: nil) 
     self.evaluateJavaScript(source) 

     self.evaluateJavaScript("document.getElementByID('barcode').innerHTML = '" + BCode + "'") 
     //let javaSCriptString="functiontofindIndexByKeyValue(eval('BarCode'), 'label', '\(BCode)', 'value')" 


     let PArt = self.evaluateJavaScript(javaSCriptString) 

     let DC01Stock = self.evaluateJavaScript("functiontofindIndexByKeyValue(eval('DCStock'), 'PArt', PArt.value, 'DC01')") 

    } 
    func webView(webView: WKWebView!, didFinishNavigation navigation: WKNavigation!) { 
     UIApplication.shared.isNetworkActivityIndicatorVisible = false 

     webView.evaluateJavaScript("document.getElementById('anonymousFormSubmit').click();", completionHandler: nil) 

    } 


} 

답변

1

확인이 질문에 응답 :

Calling Javascript using UIWebView

  1. 은 바코드를받을 수있는 JS 방법을 만듭니다.
  2. 페이지가 이미로드 된 경우 stringByEvaluatingJavaScriptFromString을 사용하여 호출 할 수 있습니다.

    하자 codebar = "34244342342424234" webView.stringByEvaluatingJavaScriptFromString ("methodName로 ("\ (codebar) ");")


업데이트

나는이 방법 몇 가지를 사용 이전 : evaluateJavaScript in WKWebView, t 그 꽤 많이했다 내가 항상 온라인으로 볼 무엇을하지만 여전히 링크를 한 후 결국 ... 작업을 거부 (그리고 또 다른 내

var navigator : WKWebView! 

func runJS(js:String) { 
    navigator.evaluateJavaScript(js) { 
     res, error in 
     print(res ?? "no res", error ?? "no error") 
    } 
} 

@IBAction func changeBackground(_ sender: Any) { 
    navigator.evaluateJavaScript("jQuery('body').css('background', 'magenta!important')") {res, error in print(error ?? "no error buton 1")} 
} 


@IBAction func loadJQuery(_ sender: Any) { 
    //Load jQuery library using plain JavaScript 
    runJS(js: "(function(){ " + 
     "var newscript = document.createElement('script'); " + 
     "newscript.type = 'text/javascript'; " + 
     "newscript.async = true; " + 
     "newscript.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js'; " + 
     "(document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(newscript); " + 
    "})();") 
} 
+0

당신에게 ucotta 감사합니다 그의 예는 jQuery를로드 한 후 배경을 변경 그래서 등등) 사파리 개발자 함수를 통해 uiwebview를 디버깅하라는 제안이있었습니다 ... JS (매우 당혹 스럽습니다 !!)에서 문제를 발견하게 되었기 때문에 xcode에서 오류가 발생하지 않는 이유는 무엇입니까? -/ –

+0

이전 응용 프로그램을 확인했는데 발견했습니다 : webview.evaluateJavaScript ("jQuery ('body') .css ('배경', 'magenta! 중요')") {res, 인쇄 오류 (오류? ? "오류 없음 1")} 다른 예제가 효과가 있기를 바랍니다. – ucotta

관련 문제