Swift: 注入 JS & CSS 到 WKWebView 不起作用
Swift: Injecting JS & CSS to WKWebView doesn't work
我想尝试将 js 脚本注入 WKWebView,但它不起作用。所以它是一个网页,但是当它加载到 App 上时,我们应该隐藏页眉和页脚。我从配置中获取 CSS URL 并加载它,并尝试将它与代码中编写的 JS 一起注入。但是,网络已加载,但预期的事情不起作用。怎么了?
这是代码(我省略了很多与问题无关的代码)
import UIKit
import WebKit
class CustomPageWebViewController: UIViewController, WKNavigationDelegate {
private var webView: WKWebView = WKWebView()
override func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self
view.addSubview(webView)
// Request web page
requestWebPage()
}
// MARK: - Request Web Page
func requestWebPage() {
if let urlString = URL(string: determineURLBasedOnPaymentName()) {
webView.load(URLRequest(url: urlString))
}
}
//
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
removeHeaderAndFooter(webView: webView)
}
func removeHeaderAndFooter(webView: WKWebView) {
let cssURLString = ConfigManager.sharedInstance.cssURL
if cssURLString != "" {
let cssURL = URL(string: cssURLString)
if let cssURL = cssURL {
let sessionConfig = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfig, delegate: nil, delegateQueue: nil)
var request = URLRequest(url: cssURL)
request.httpMethod = "GET"
let task = session.dataTask(with: request, completionHandler: { (data: Data!, response: URLResponse!, error: Error!) -> Void in
if (error == nil) {
let result = String(data: data, encoding: String.Encoding.utf8)!
var js = "!function(){var e=document.createElement(\"style\");e.type=\"text/css\",e.innerHTML=window.atob(%@),document.getElementsByTagName(\"head\")[0].appendChild(e);var t=document.createElement(\"style\");t.type=\"text/css\",t.innerHTML=\"#tab-hotel,#tabs-2,.rail-order__flex{display:none;} .search__label--input{height:45px;} #tabs-2{display:block;}\",document.body.appendChild(t)}();"
// So after I get the CSS file from the link, I will inject it to the JS file here
js = String(format: js, result)
// And then inject the whole script to the webview
self.webView.evaluateJavaScript(js, completionHandler: { (any, error) in
})
}
})
task.resume()
}
}
}
}
请使用 UIWebView 和 webView.stringByEvaluatingJavaScript(from: "")
WKWebview 中的 js 消息处理程序执行是使用 WKUserScript 处理的
你可以按照我在link中的回答执行JS WKUserScript not working
这是我们在WKWebview中执行JS的方式
[objectofWKWebView evaluateJavaScript:yourScript completionHandler:^(id result, NSError *error) {}];
您可以创建 WKWebView 类别并添加类似
的功能
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script {
__block NSString *resultString = nil;
__block BOOL finished = NO;
[self evaluateJavaScript:script completionHandler:^(id result, NSError *error) {
if (error == nil) {
if (result != nil) {
resultString = [NSString stringWithFormat:@"%@", result];
}
} else {
NSLog(@"evaluateJavaScript error : %@", error.localizedDescription);
}
finished = YES;
}];
while (!finished)
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
return resultString;
}
Swift 5:
在显示网站之前将 css 注入 html
import UIKit
import WebKit
class WebViewController: UIViewController, WKNavigationDelegate {
@IBOutlet weak var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
config()
}
private func config(){
webView.navigationDelegate = self
guard let url = URL(string: "url") else {
return
}
webView.load(URLRequest(url: url))
}
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
let css = "Css Code"
let js = "var style = document.createElement('style'); style.innerHTML = '\(css)'; document.head.appendChild(style);"
webView.evaluateJavaScript(js, completionHandler: nil)
}
}
我想尝试将 js 脚本注入 WKWebView,但它不起作用。所以它是一个网页,但是当它加载到 App 上时,我们应该隐藏页眉和页脚。我从配置中获取 CSS URL 并加载它,并尝试将它与代码中编写的 JS 一起注入。但是,网络已加载,但预期的事情不起作用。怎么了?
这是代码(我省略了很多与问题无关的代码)
import UIKit
import WebKit
class CustomPageWebViewController: UIViewController, WKNavigationDelegate {
private var webView: WKWebView = WKWebView()
override func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self
view.addSubview(webView)
// Request web page
requestWebPage()
}
// MARK: - Request Web Page
func requestWebPage() {
if let urlString = URL(string: determineURLBasedOnPaymentName()) {
webView.load(URLRequest(url: urlString))
}
}
//
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
removeHeaderAndFooter(webView: webView)
}
func removeHeaderAndFooter(webView: WKWebView) {
let cssURLString = ConfigManager.sharedInstance.cssURL
if cssURLString != "" {
let cssURL = URL(string: cssURLString)
if let cssURL = cssURL {
let sessionConfig = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfig, delegate: nil, delegateQueue: nil)
var request = URLRequest(url: cssURL)
request.httpMethod = "GET"
let task = session.dataTask(with: request, completionHandler: { (data: Data!, response: URLResponse!, error: Error!) -> Void in
if (error == nil) {
let result = String(data: data, encoding: String.Encoding.utf8)!
var js = "!function(){var e=document.createElement(\"style\");e.type=\"text/css\",e.innerHTML=window.atob(%@),document.getElementsByTagName(\"head\")[0].appendChild(e);var t=document.createElement(\"style\");t.type=\"text/css\",t.innerHTML=\"#tab-hotel,#tabs-2,.rail-order__flex{display:none;} .search__label--input{height:45px;} #tabs-2{display:block;}\",document.body.appendChild(t)}();"
// So after I get the CSS file from the link, I will inject it to the JS file here
js = String(format: js, result)
// And then inject the whole script to the webview
self.webView.evaluateJavaScript(js, completionHandler: { (any, error) in
})
}
})
task.resume()
}
}
}
}
请使用 UIWebView 和 webView.stringByEvaluatingJavaScript(from: "")
WKWebview 中的 js 消息处理程序执行是使用 WKUserScript 处理的
你可以按照我在link中的回答执行JS WKUserScript not working
这是我们在WKWebview中执行JS的方式
[objectofWKWebView evaluateJavaScript:yourScript completionHandler:^(id result, NSError *error) {}];
您可以创建 WKWebView 类别并添加类似
的功能- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script {
__block NSString *resultString = nil;
__block BOOL finished = NO;
[self evaluateJavaScript:script completionHandler:^(id result, NSError *error) {
if (error == nil) {
if (result != nil) {
resultString = [NSString stringWithFormat:@"%@", result];
}
} else {
NSLog(@"evaluateJavaScript error : %@", error.localizedDescription);
}
finished = YES;
}];
while (!finished)
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
return resultString;
}
Swift 5:
在显示网站之前将 css 注入 html
import UIKit
import WebKit
class WebViewController: UIViewController, WKNavigationDelegate {
@IBOutlet weak var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
config()
}
private func config(){
webView.navigationDelegate = self
guard let url = URL(string: "url") else {
return
}
webView.load(URLRequest(url: url))
}
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
let css = "Css Code"
let js = "var style = document.createElement('style'); style.innerHTML = '\(css)'; document.head.appendChild(style);"
webView.evaluateJavaScript(js, completionHandler: nil)
}
}