Я пытаюсь прочитать консольные журналы webapp, которые программно загружаются в мой WkWebview.
пока в моих исследованиях это невозможно.
Любая помощь в достижении этого будет оценена!
Я пытаюсь прочитать консольные журналы webapp, которые программно загружаются в мой WkWebview.
пока в моих исследованиях это невозможно.
Любая помощь в достижении этого будет оценена!
Пожалуйста, используйте это красивое приложение " Bridge"
Edit:
self.webView = [[WBWKWebView alloc] initWithFrame:self.view.bounds];
self.webView.JSBridge.interfaceName = @"WKWebViewBridge";
WBWebDebugConsoleViewController * controller = [[WBWebDebugConsoleViewController alloc] initWithConsole:_webView.console];
Затем вы можете использовать метод делегата:
- (void)webDebugInspectCurrentSelectedElement:(id)sender
{
// To use the referenced log values
}
Можно подключить браузер Safari на вашем Mac к WKWebView и получить доступ к консоли.
В Safari откройте вкладку "Разработка" и, пока симулятор iOS работает с открытым WKWebView, - просто щелкните по нему, чтобы открыть консоль. См:
Вы можете переоценить (переопределить) реализацию Javascript console.log() по умолчанию, чтобы использовать window.webkit.messageHandlers.postMessage(msg) для передачи сообщений вперед. А затем перехватите вызов javascript postMessage (msg) в собственном коде, используя WKScriptMessageHandler :: didReceiveScriptMessage, чтобы получить зарегистрированное сообщение.
Шаг 1) Пересмотрите реализацию по умолчанию console.log, чтобы использовать postMessage()
// javascript to override console.log to use messageHandlers.postmessage
NSString * js = @"var console = { log: function(msg){window.webkit.messageHandlers.logging.postMessage(msg) } };";
// evaluate js to wkwebview
[self.webView evaluateJavaScript:js completionHandler:^(id _Nullable ignored, NSError * _Nullable error) {
if (error != nil)
NSLog(@"installation of console.log() failed: %@", error);
}];
Шаг 2) Перехват javascript postMessage в нативном коде в WKScriptMessageHandler :: didReceiveScriptMessage
- (void)viewDidLoad
{
// create message handler named "logging"
WKUserContentController *ucc = [[WKUserContentController alloc] init];
[ucc addScriptMessageHandler:self name:@"logging"];
// assign usercontentcontroller to configuration
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
[configuration setUserContentController:ucc];
// assign configuration to wkwebview
self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) configuration:configuration];
}
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
// what ever were logged with console.log() in wkwebview arrives here in message.body property
NSLog(@"log: %@", message.body);
}
Обычно ведение журнала консоли определяется в js как
"window.addEventListener("message",function(e){console.log(e.data)});"
Мой ответ был адаптирован из handling-javascript-events-in-wkwebview!
Инициализировать WKWebView с конфигурацией
let config = WKWebViewConfiguration()
let source = "document.addEventListener('message', function(e){
window.webkit.messageHandlers.iosListener.postMessage(e.data); })"
let script = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
config.userContentController.addUserScript(script)
config.userContentController.add(self, name: "iosListener")
webView = WKWebView(frame: UIScreen.main.bounds, configuration: config)
Или используйте свойство KVO "оцененныйProgress" и введите js с помощью JavaScript JavaScript
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if ([keyPath isEqualToString:@"estimatedProgress"])
{
CGFloat progress = [change[NSKeyValueChangeNewKey] floatValue];
if (progress>= 0.9)
{
NSString *jsCmd = @"window.addEventListener(\"message\",function(e){window.webkit.messageHandlers.iosListener.postMessage(e.data)});";
//@"document.addEventListener('click', function(e){ window.webkit.messageHandlers.iosListener.postMessage('Customize click'); })";
[_webView evaluateJavaScript:jsCmd completionHandler:^(id _Nullable obj, NSError * _Nullable error) {
NSLog(@"error:%@",error);
}];
}
}
}
реализовать протокол WKScriptMessageHandler для получения сообщения:
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
{
print("message: \(message.body)")
// and whatever other actions you want to take
}