2013-03-29 67 views
4

我正在寫與MonoTouch的一款iOS應用,確實​​有一個UIWebView一些JavaScript交互中。出於調試的目的,能夠在UIWebView中運行的JavaScript中捕獲console.log以及應用程序輸出的其餘部分會很好。這可能嗎?使用常規Objective-C代碼的例子也是可以的。捕獲的console.log一個UIWebView

回答

3

經過一些google搜索,我來到了這個答案:Javascript console.log() in an iOS UIWebView

將其轉換爲MonoTouch的產生此解決方案:

using System; 
using System.Web; 
using System.Json; 
using MonoTouch.UIKit; 

namespace View 
{ 
    public class JsBridgeWebView : UIWebView 
    { 

     public object BridgeDelegate {get;set;} 

     private const string BRIDGE_JS = @" 
      function invokeNative(functionName, args) { 
       var iframe = document.createElement('IFRAME'); 
       iframe.setAttribute('src', 'jsbridge://' + functionName + '#' + JSON.stringify(args)); 
       document.documentElement.appendChild(iframe); 
       iframe.parentNode.removeChild(iframe); 
       iframe = null; 
      } 

      var console = { 
       log: function(msg) { 
        invokeNative('Log', [msg]); 
       } 
      }; 
     "; 

     public JsBridgeWebView() 
     { 
      ShouldStartLoad += LoadHandler; 
      LoadFinished += (sender, e) => { 
       EvaluateJavascript(BRIDGE_JS); 
      }; 
     } 

     public bool LoadHandler (UIWebView webView, MonoTouch.Foundation.NSUrlRequest request, UIWebViewNavigationType navigationType) 
     { 
      var url = request.Url; 
      if(url.Scheme.Equals("jsbridge")) { 
       var func = url.Host; 
       if(func.Equals("Log")) { 
        // console.log 
        var args = JsonObject.Parse(HttpUtility.UrlDecode(url.Fragment)); 
        var msg = (string)args[0]; 
        Console.WriteLine(msg); 
        return false; 
       } 
       return true; 
      } 
     } 
    } 
} 

現在所有console.log語句在JavaScript中UIWebView將被髮送到Console.WriteLine。這當然可以擴展到任何想要的輸出。

1

你可以添加JavaScript代碼,它是這樣的覆蓋方法:

console.log = function(var text) { 
    consoleforios += text; 
} 

然後,從Web視圖,請致電:

string console = webView.EvaluatingJavaScript("return consoleforios;"); 

這可能不是什麼我要離開永久的,但它應該工作。

+0

這是一個選項,但不是我一直在尋找的東西。 – NilsH