6

Ich möchte ein Skript mit WKWebview API injizieren. Aus irgendeinem Grund funktioniert es nicht und ich kann es nicht herausfinden. Ich habe Debugging in Safari Entwicklerkonsole versucht, und ich kann den Code JavaScript dort entweder nicht finden.WKUserScript funktioniert nicht

Implementation-Code wie folgt:

NSString *js = @"document.body.style.background = \"#FF0000\";"; 

    NSString *myScriptSource = @"alert('Hello, World!')"; 


    WKUserScript *s = [[WKUserScript alloc] initWithSource:myScriptSource injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES]; 
    WKUserContentController *c = [[WKUserContentController alloc] init]; 
    [c addUserScript:s]; 

    WKWebViewConfiguration *conf = [[WKWebViewConfiguration alloc] init]; 
    conf.userContentController = c; 

    WKWebView *webview = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:conf]; 
    [self.view addSubview:webview]; 
    webview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    // Do any additional setup after loading the view, typically from a nib. 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]; 
     [webview loadRequest:request]; 
    }); 
+2

Haben Sie also eine Antwort auf Ihre Frage gefunden? – Bastian

+0

@Bastian können Sie versuchen mit meiner Lösung, wenn dies Ihnen hilft –

Antwort

2

Bitte Code verwenden und Script-Message-Handler und setzen Navigation Delegat

NSString *js = @"document.body.style.background = \"#FF0000\";"; 

NSString *myScriptSource = @"alert('Hello, World!')"; 


WKUserScript *s = [[WKUserScript alloc] initWithSource:myScriptSource injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES]; 
WKUserContentController *c = [[WKUserContentController alloc] init]; 
[c addUserScript:s]; 
// Add a script message handler for receiving "buttonClicked" event notifications posted from the JS document using window.webkit.messageHandlers.buttonClicked.postMessage script message 
    [c addScriptMessageHandler:self name:@"buttonClicked"]; 

WKWebViewConfiguration *conf = [[WKWebViewConfiguration alloc] init]; 
conf.userContentController = c; 

WKWebView *webview = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:conf]; 
[self.view addSubview:webview]; 
webview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
// Do any additional setup after loading the view, typically from a nib. 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]; 
    [webview loadRequest:request]; 
}); 

implementieren Script Message-Handler "WKScriptMessageHandler" mit Methodenname

hinzufügen
#pragma mark -WKScriptMessageHandler 
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { 
if ([message.name isEqualToString:@"buttonClicked"]) { 
    self.buttonClicked ++; 
} 

// JS objects are automatically mapped to ObjC objects 
id messageBody = message.body; 
if ([messageBody isKindOfClass:[NSDictionary class]]) { 
    NSString* idOfTappedButton = messageBody[@"ButtonId"]; 
    [self updateColorOfButtonWithId:idOfTappedButton]; 
} 

}

und Post js die Nachricht Form wie dieses

var button = document.getElementById("clickMeButton"); 
button.addEventListener("click", function() { 
     var messgeToPost = {'ButtonId':'clickMeButton'}; 
     window.webkit.messageHandlers.buttonClicked.postMessage(messgeToPost); 
    },false); 

Sie einen Anruf

erhalten zurück
+0

Es funktioniert nicht –

+0

@ mrjimoy_05 was hast du versucht, es ist implementiert und getestet, und diese Antwort ist über Skript-Nachrichten-Handler, Sie führen js, ich überprüft mit deinem Code auf deine Frage –

0

alert in WKWebView nicht standardmäßig implementiert ist, so dass selbst wenn Ihr Benutzer Skript ausgeführt wird es nicht sichtbar mach alles. Sie müssen runJavaScriptAlertPanelWithMessage implementieren:

func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (() -> Void)) { 
    let alert = UIAlertController.create(title: frame.request.url?.host, message: message, preferredStyle: .alert) 
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in 
    completionHandler() 
    })) 
    present(alert, animated: true, completion: nil) 
} 

Ich glaube nicht das injizierte JavaScript scheint tatsächlich in dem DOM überall, es ist eine Eigenschaft im Innern der WKWebView.