在Webview iOS中注入JavaScript代码

Inject a JavaScript code in Webview iOS

本文关键字:JavaScript 代码 注入 Webview iOS      更新时间:2023-09-26

我用swift语言代码创建了一个iOS网络浏览器。并添加一个额外的按钮在该网页上注入脚本,但当我尝试这个时,它总是崩溃:

webView!.evaluateJavaScript("document.body.style.background = 'red';", nil)

知道怎么解决这个问题吗?以及如何从文件中读取JavaScript代码,然后将其注入该webview元素。

我使用代码样式作为示例,但使用WKWebView:https://github.com/rshankras/WebViewDemo

如果你能解决这个问题,我需要一个基本的工作代码作为答案。以及如何从文件加载JavaScript的解决方案。并将该代码注入WKWebView元素中

我在当前UIWebView API文档中看不到您正在使用的方法(评估JavaScript),但它在WKWebView文档中。也许您使用了错误的API?也许可以尝试使用字符串ByEvaluatingJavaScriptFromString(_:):

let script = "document.body.style.background = 'red'"
if let result = webView.stringByEvaluatingJavaScriptFromString(script) {
    println("result is '(result)")
}

此外,我不确定是否需要"!"(直觉告诉我不需要),因为代码周围没有上下文。所以也许可以同时尝试两种版本。

从文件中获取字符串类似于:

let path = NSBundle.mainBundle().pathForResource("jsFileName", ofType: "js")
if let content = String.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: nil) {
    println("js content is '(content)")
}

从磁盘加载有很多关于文件复制和存储方式的变量,因此您必须做一些工作来将path变量适应您的结构。

这将适用于WKWebView。不要忘记在类定义的顶部添加WebKit框架

      var webView: WKWebView!
 func loadWebViewWithCustomJavaScript {
    //Create Preferences 
    let preferences = WKPreferences()
    preferences.javaScriptEnabled = true
    //Initialise javascript file with user content controller and configuration
    let configuration = WKWebViewConfiguration()
    let scriptURL =    NSBundle.mainBundle().pathForResource("Your File Name", ofType: "js")
    var scriptContent = ""
    do {
        scriptContent = try String(contentsOfFile: scriptURL!, encoding: NSUTF8StringEncoding)
    } catch{
    print("Cannot Load File")
   }
    let script = WKUserScript(source: scriptContent, injectionTime: .AtDocumentStart, forMainFrameOnly: true)
    configuration.userContentController.addUserScript(script)
    configuration.preferences = preferences
    //Create WebView instance
    webView = WKWebView(frame: CGRectMake(0,0, self.view.frame.size.width, self.view.frame.size.height), configuration: configuration)
    view.addSubview(webView)
    //Finally load the url
    let url = NSURL(string:"your URL")
    let urlRequest = NSURLRequest(URL: url!)
    webView.loadRequest(urlRequest)
  }

用于注入的示例JavaScript代码

 //Hides name of "background1" element on the page
 var styleTag = document.createElement("style");
 styleTag.textContent = 'div#background1, .after-post.widget-area      {display:none;}';
document.documentElement.appendChild(styleTag);

使用以下方法使其正常工作。使用String而不是NSString来使用本机swift 2。要注入的Javascript代码必须在hidessections.js文件中

    let jsPath = NSBundle.mainBundle().pathForResource("hidesections", ofType: "js");
    let jsContent: String?
    do
    {
        jsContent = try String(contentsOfFile: jsPath!, encoding: NSUTF8StringEncoding)
    }
    catch _
    {
        jsContent = nil
    }
    webView.stringByEvaluatingJavaScriptFromString(jsContent!)

如果您正在使用WKWebView,这里有一个解决方案。

if let scriptFile = NSBundle.mainBundle().pathForResource("script", ofType: "js") {
    var error: NSError?
    let scriptString = NSString(contentsOfFile: scriptFile, encoding: NSUTF8StringEncoding, error: &error)
    if let error = error {
        println("Error: Could not load script file => '(error)")
    } else {
        if let scriptString = scriptString {
            let script = WKUserScript(source: scriptString, injectionTime: .AtDocumentEnd, forMainFrameOnly: true)
            let controller = WKUserContentController()
            controller.addUserScript(script)
            let configuration = WKWebViewConfiguration()
            configuration.userContentController = controller
            let webView = WKWebView(frame: self.view.bounds, configuration: configuration)
            self.webView = webView
            self.view.addSubview(webView)
        }
    }
}