WKWebView 未在设备上运行

Posted

技术标签:

【中文标题】WKWebView 未在设备上运行【英文标题】:WKWebView not running on device 【发布时间】:2015-02-25 04:37:49 【问题描述】:

我的主要问题是 WKWebView....当我运行我的应用程序时,它应该导航到幕后的网站并通过运行主包上的 .js 文件中的一些代码来登录用户。

 required init(coder aDecoder: NSCoder) 

 //  Load username and password from NSUserDefults

        self.staffID = defaults.objectForKey("UserName") as String
        self.pass = defaults.objectForKey("PassWord") as String

    // locate file from main bundle
        let populateLoginURL = NSBundle.mainBundle().pathForResource("login", ofType: "js")       
// edit username and password
      var PassEdited = pass + "'"
        println(pass)
        var PassJs = "document.getElementsByName('password')[0].value = '" + PassEdited
        var usernameEdited = "'" + staffID + "'"
        println(staffID)
        var userNameJS = "document.getElementsByName('username')[0].value = " + usernameEdited
    // submit fuction will validate username and password on webpage
        let submit = "submitButton()"
    //combine the java code in one line
       let javaCode = userNameJS + "; " + PassJs + "; " + submit
    // write java code to file in main bundle which is empty
      javaCode.writeToFile(populateLoginURL!, atomically: true, encoding: NSUTF8StringEncoding, error: nil)
    //configure webView
       self.webView = WKWebView(frame: CGRectZero)
        let configuration = WKWebViewConfiguration()
    // load javacode to inject from file
        let populateLoginJS = String(contentsOfFile:populateLoginURL!,   encoding:NSUTF8StringEncoding, error: nil)
        let populateLoginScript = WKUserScript(source: populateLoginJS!,    injectionTime: .AtDocumentEnd, forMainFrameOnly: true)
// add configuration to webview
        configuration.userContentController.addUserScript(populateLoginScript)

                       configuration.preferences.javascriptCanOpenWindowsAutomatically = false
        self.webView = WKWebView(frame: CGRectZero, configuration:      configuration)

    println(populateLoginJS)
    super.init(coder: aDecoder)
    

 override func viewDidLoad() 
//set navigation delegate of web view and navigate to specified url
    webView.navigationDelegate = self
    let URL = NSURL(string: "https://ifly.etihad.ae")
    let request = NSURLRequest(URL:URL!)
    webView.loadRequest(request)
    

这一切都可以在 ios 模拟器上正常运行。

话虽如此,我注意到最后一个 println(populateLoginJs) 通常会打印 .Js 文件的内容,但是当在我的设备上运行时,它会打印可选的“”

所以要么写入 JS 文件不起作用,要么加载到 JS 文件不起作用这是我的预感

任何想法或信息将不胜感激

【问题讨论】:

为什么要在 required init 中声明变量? 伙计们,我设法让代码运行,但我发现问题是 writeToFile 在设备上不起作用。 【参考方案1】:

我设法解决了这个问题,我发现写入文件从未在设备上编译。在联系苹果支持后,他们说这是他们知道的一个错误。

我现在处理问题的方式是检查 webView 所在的 URL,如果为 true,则 webView.evaluateJavaScript

【讨论】:

以上是关于WKWebView 未在设备上运行的主要内容,如果未能解决你的问题,请参考以下文章

嵌入在 html 中的 javascript 未在 wkwebview 中运行

WKWebView 的网页未在 dispatch_get_main_queue 内显示页面

WKWebView:表单未在 WKWebView (Swift) 中提交

iOS 11.3 的 WKWebView 中的 Service Worker 不可用

WKWebView javascript 警报、提示、确认不起作用

通过 WKWebView 应用于 Javascript 的样式表在模拟器上工作,在设备上失败