Xamarin Forms Webview에서 Console.Log 값 가져오기

네이버 자마린 카페에 관련 질문이 있어서 거기다 쓰려다가 닷넷데브 활성화 시켜보자는 마음으로 여기다가 씁니다.

먼저 안드로이드 기준에서 설명 드리면 커스텀 렌더러 구현이 필요합니다.
(iOS는 구글에 샘플이 몇 개 있으니 그건 찾아보시는걸로!!)

원래는 로그캣에는 뜨긴 뜨는데 웹사이트에서 별도로 브릿지를 구성해서 값을 가져오는 방식이 좀 부담스럽고 특정한 서비스에서 콘솔 로그만 제공해야 되는 경우도 분명히 있을거라 생각은 됩니다.

이럴 땐 WebChromeClient를 커스텀해서 OnConsoleMessage를 오버라이드 하시면 되겠습니다.

테스트하면서 몇 개 필요 없는 구문도 샘플에 있긴한데 WebChromeClient 구현만 잘 해주시면 됩니다 :slight_smile:

[assembly: ExportRenderer(typeof(Xamarin.Forms.WebView), typeof(HoneyheadRenderer))]
namespace LOGCAT.Droid
{
    public class HoneyheadRenderer : WebViewRenderer
    {
        static Xamarin.Forms.WebView _xwebView = null;

        public HoneyheadRenderer(Android.Content.Context context) : base(context)
        {
        }
       
        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);
            _xwebView = e.NewElement as Xamarin.Forms.WebView;
            global::Android.Webkit.WebView.SetWebContentsDebuggingEnabled(true); //원격 디버깅 할때 필요

            if (e.OldElement == null)
            {
                Control.SetWebViewClient(new ConsoleDebugWebviewClient());
            }
        }

        class ConsoleDebugClient : WebChromeClient
        {
            public override bool OnConsoleMessage(ConsoleMessage consoleMessage)
            {

                if (consoleMessage.Message() != null)
                {
                    System.Diagnostics.Debug.WriteLine(consoleMessage.Message().ToString());
                }

                return base.OnConsoleMessage(consoleMessage);
            }

            public override void OnConsoleMessage(string message, int lineNumber, string sourceID)
            {
                //System.Diagnostics.Debug.WriteLine(message);

                base.OnConsoleMessage(message, lineNumber, sourceID);
            }
        }

        class ConsoleDebugWebviewClient : WebViewClient
        {
            public async override void OnPageFinished(Android.Webkit.WebView view, string url)
            {
                try
                {
                    if (_xwebView != null)
                    {
                        view.Settings.JavaScriptEnabled = true;
                        view.Settings.DomStorageEnabled = true;
                        view.Settings.AllowContentAccess = true;
                        view.SetWebChromeClient(new ConsoleDebugClient());
                    }
                    base.OnPageFinished(view, url);
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"{ex.Message}");
                }
            }
        }
    }
}

스크린샷 2022-02-08 오후 4.06.41

7개의 좋아요

감사합니다!!

2개의 좋아요