iOS UIWebView의 Javascript console.log ()


Answers

나는 자바 스크립트를 사용하여 애플 리케이션 디버그 콘솔에 로그하는 솔루션을 가지고있다. 약간 조잡하지만 작동합니다.

먼저 javascript에 console.log () 함수를 정의합니다.이 함수는 ios-log : url을 사용하여 iframe을 열고 즉시 제거합니다.

// Debug
console = new Object();
console.log = function(log) {
  var iframe = document.createElement("IFRAME");
  iframe.setAttribute("src", "ios-log:#iOS#" + log);
  document.documentElement.appendChild(iframe);
  iframe.parentNode.removeChild(iframe);
  iframe = null;    
};
console.debug = console.log;
console.info = console.log;
console.warn = console.log;
console.error = console.log;

이제 shouldStartLoadWithRequest 함수를 사용하여 iOS 앱의 UIWebViewDelegate에서이 URL을 잡아야합니다.

- (BOOL)webView:(UIWebView *)webView2 
shouldStartLoadWithRequest:(NSURLRequest *)request 
 navigationType:(UIWebViewNavigationType)navigationType {

    NSString *requestString = [[[request URL] absoluteString] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
    //NSLog(requestString);

    if ([requestString hasPrefix:@"ios-log:"]) {
        NSString* logString = [[requestString componentsSeparatedByString:@":#iOS#"] objectAtIndex:1];
                               NSLog(@"UIWebView console: %@", logString);
        return NO;
    }

    return YES;
}
Question

UIWebView가있는 iPhone / iPad 응용 프로그램을 작성할 때 콘솔이 보이지 않습니다. 이 훌륭한 대답 은 오류를 잡는 방법을 보여 주지만 console.log ()도 사용하고 싶습니다.




iOS7부터 네이티브 Javascript 브리지를 사용할 수 있습니다. 다음과 같이 간단합니다.

 #import <JavaScriptCore/JavaScriptCore.h>

JSContext *ctx = [webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
ctx[@"console"][@"log"] = ^(JSValue * msg) {
NSLog(@"JavaScript %@ log message: %@", [JSContext currentContext], msg);
    };



시도한 Leslie Godwin의 수정 사항이지만이 오류가 발생했습니다.

'objectForKeyedSubscript' is unavailable: use subscripting

Swift 2.2의 경우 다음과 같습니다.

이 코드를 컴파일하려면 JavaScriptCore를 가져와야합니다.

import JavaScriptCore

if let context = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") {
    context.evaluateScript("var console = { log: function(message) { _consoleLog(message) } }")
    let consoleLog: @convention(block) String -> Void = { message in
        print("javascript_log: " + message)
    }
    context.setObject(unsafeBitCast(consoleLog, AnyObject.self), forKeyedSubscript: "_consoleLog")
}

그런 다음 javascript 코드에서 console.log ( "_ your_log_")를 호출하면 Xcode 콘솔에 인쇄됩니다.

UIWebView의 확장으로이 코드를 추가하는 것이 더 좋습니다.

import JavaScriptCore

extension UIWebView {
    public func hijackConsoleLog() {
        if let context = valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") {
            context.evaluateScript("var console = { log: function(message) { _consoleLog(message) } }")
            let consoleLog: @convention(block) String -> Void = { message in
                print("javascript_log: " + message)
            }
            context.setObject(unsafeBitCast(consoleLog, AnyObject.self), forKeyedSubscript: "_consoleLog")
        }
    }
}

그런 다음 UIWebView 초기화 단계에서이 메서드를 호출합니다.

let webView = UIWebView(frame: CGRectZero)
webView.hijackConsoleLog()



Links