iOS9中的WebKit 与 Safari带来的惊喜

2020-01-14 17:39:06刘景俊
 实例,并作为参数传入 WKWebView的构造函数,具体代码如下:

 


// ViewController.swift

import WebKit

class ViewController : UIViewController {

	var webView: WKWebView!

	required init(coder aDecoder: NSCoder) {
	  super.init(coder: aDecoder)!
	  

	  let configuation = WKWebViewConfiguration()

	  configuation.userContentController.addUserScript(getUserScript("inject"))
	  
	  self.webView = WKWebView(frame: CGRectZero,configuration: configuation)
	}

  // 从资源中读取 javascript 脚本
  func getUserScript(fromName: String)-> WKUserScript {
    let filePath = NSBundle.mainBundle().pathForResource(fromName, ofType: "js")
    let js = try! String(contentsOfFile: filePath!, encoding: NSUTF8StringEncoding)
    return WKUserScript(source: js, injectionTime: .AtDocumentEnd, forMainFrameOnly: true)
  }
	...
}

此代码段中需要注意的另一点是在自定义方法 getUserScript() 所返回的 WKUserScript 对象。我们可以通过 injectionTime 决定将脚本注入至HTML的开始部分还是在文档的尾部。

再次执行代码,效果如下:

iOS9中的WebKit 与 Safari带来的惊喜

也就是说我们可以在 app 内通过 WebKit 注入javascript后就可以任意地操控页面内的所有 DOM 对象!

javascript 的回调

除了从 app 一端将代码注入到浏览器,执行一个动作。某些情况下我们还需要从网页上做某一些处理后,例如将网页内的某些元素读出并转为一个 json 对象集合,回传给 App 处理。又或者我们的 app 在加载一个网页之后想一次性地读出页面内的所有图像,当用户点击这些图像的时候我们用 app 的本地方式来全屏预览,诸如此类。在这些语境下: