2013-03-29 91 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