首页 > 解决方案 > 获取 WKWebView 内区域的快照

问题描述

我正在尝试获取网站上存在的验证码的快照,以便我可以要求我的用户在不同的 UI 中键入它。https://www.camsonline.com/InvestorServices/COL_ISAccountStatement.aspx 我通过使用找到了验证码的框架

document.getElementById('captchImg').getBoundingClientRect();

但是这个框架是指 webview 而不是 iOS 窗口。我确实尝试使用转换

webview.convert(CGRect(x: 685, y: 1063), to: self.view)

但这似乎并没有奏效。我只想要验证码快照中的图像。我该怎么办?我已经尝试了很多关于 SO 的答案,但到目前为止没有任何帮助。

标签: ioswebviewuiwebviewwkwebview

解决方案


我认为您可以使用 base64 编码保存缓存的图像,然后在您需要的任何地方将其转换为 UIImage。例如把它放回另一个 UIImageView。

这个代码示例只是加载到self.imageView中,你可以用它做任何你想做的事情。

   func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

        let str = "var c = document.createElement('canvas'); var ctx = c.getContext('2d'); ctx.drawImage(document.getElementById('captchImg'), 100, 40); var value = c.toDataURL(); value.split(',')[1]; "

        self.webView.evaluateJavaScript(str) { (value, error) in
             if error == nil {
                 if let img = value as? String {
                      self.imageView.image = self.base64ToImage(base64: img)
                 }
             }
         }
    }

    func base64ToImage(base64: String) -> UIImage? {
        var img: UIImage = UIImage()
        if (!base64.isEmpty) {
            if let decodedData = NSData(base64Encoded: base64 , options: NSData.Base64DecodingOptions.ignoreUnknownCharacters) {
                if let decodedimage = UIImage(data: decodedData as Data) {
                    img = (decodedimage as UIImage?)!
                    return img
                }
            }
        }
        return nil
    }

推荐阅读