6

Я хочу вставить скрипт, используя WKWebview API. По какой-то причине он не работает, и я не могу понять это. Я пробовал отладку в консоли разработчика Safari, и я не могу найти код JavaScript.WKUserScript не работает

код реализации следующим образом:

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

Итак, вы нашли ответ на свой вопрос? – Bastian

+0

@Bastian вы можете попробовать с моим решением, если это вам поможет –

ответ

2

Пожалуйста, используйте код, как это и добавить скрипт обработчика сообщений и установить навигацию делегат

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]; 
}); 

реализовать скрипт обработчика сообщений «WKScriptMessageHandler» с именем метода

#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]; 
} 

и создавать форме сообщения JS как этот

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

вы получите обратный звонок

+0

Не работает –

+0

@ mrjimoy_05 что вы пробовали, оно реализовано и протестировано, и этот ответ о обработчике сообщений скрипта, вы выполняете js, i checked с кодом на ваш вопрос –

0

alert не реализован в WKWebView по умолчанию, так что даже если ваш сценарий пользователь запускает это не будет заметно Делать что-нибудь. Вы должны реализовать runJavaScriptAlertPanelWithMessage:

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) 
} 

Я не думаю, что нагнетаемый JavaScript на самом деле появляется в DOM в любом месте, это свойство внутренней по отношению к WKWebView.