iphone - 我的 iPhone Objective-C 代码如何在 UIWebView 中收到

我需要让我的 iPhone Objective-C 代码在 UIWebView 中捕获 Javascript 错误。这包括未捕获的异常、加载文件时的语法错误、 undefined variable 引用等。

这是一个开发环境,所以它不需要是 SDK-kosher。事实上,它只需要在模拟器上工作。

我已经发现使用了一些隐藏的 WebKit 技巧,例如将 Obj-C 对象暴露给 JS 并拦截警报弹出窗口,但这仍然是我的目标。

[注意:发布此内容后,我确实找到了一种使用调试委托(delegate)的方法。有没有办法使用错误控制台/网络检查器来降低开销?]

最佳答案

我现在找到了一种在 WebView 中使用脚本调试器 Hook 的方法(注意,不是 UIWebView)。我首先必须继承 UIWebView 并添加这样的方法:

- (void)webView:(id)webView windowScriptObjectAvailable:(id)newWindowScriptObject {
    // save these goodies
    windowScriptObject = newWindowScriptObject;
    privateWebView = webView;

    if (scriptDebuggingEnabled) {
        [webView setScriptDebugDelegate:[[YourScriptDebugDelegate alloc] init]];
    }
}

接下来,您应该创建一个包含以下方法的 YourScriptDebugDelegate 类:

// in YourScriptDebugDelegate

- (void)webView:(WebView *)webView       didParseSource:(NSString *)source
 baseLineNumber:(unsigned)lineNumber
        fromURL:(NSURL *)url
       sourceId:(int)sid
    forWebFrame:(WebFrame *)webFrame
{
    NSLog(@"NSDD: called didParseSource: sid=%d, url=%@", sid, url);
}

// some source failed to parse
- (void)webView:(WebView *)webView  failedToParseSource:(NSString *)source
 baseLineNumber:(unsigned)lineNumber
        fromURL:(NSURL *)url
      withError:(NSError *)error
    forWebFrame:(WebFrame *)webFrame
{
    NSLog(@"NSDD: called failedToParseSource: url=%@ line=%d error=%@\nsource=%@", url, lineNumber, error, source);
}

- (void)webView:(WebView *)webView   exceptionWasRaised:(WebScriptCallFrame *)frame
       sourceId:(int)sid
           line:(int)lineno
    forWebFrame:(WebFrame *)webFrame
{
    NSLog(@"NSDD: exception: sid=%d line=%d function=%@, caller=%@, exception=%@", 
          sid, lineno, [frame functionName], [frame caller], [frame exception]);
}

这可能会对运行时产生很大影响,因为调试委托(delegate)还可以提供用于进入和退出堆栈帧以及执行每一行代码的方法。

见 http://www.koders.com/noncode/fid7DE7ECEB052C3531743728D41A233A951C79E0AE.aspx用于 WebScriptDebugDelegate 的 Objective-C++ 定义。

其他方法:

// just entered a stack frame (i.e. called a function, or started global scope)
- (void)webView:(WebView *)webView    didEnterCallFrame:(WebScriptCallFrame *)frame
      sourceId:(int)sid
          line:(int)lineno
   forWebFrame:(WebFrame *)webFrame;

// about to execute some code
- (void)webView:(WebView *)webView willExecuteStatement:(WebScriptCallFrame *)frame
      sourceId:(int)sid
          line:(int)lineno
   forWebFrame:(WebFrame *)webFrame;

// about to leave a stack frame (i.e. return from a function)
- (void)webView:(WebView *)webView   willLeaveCallFrame:(WebScriptCallFrame *)frame
      sourceId:(int)sid
          line:(int)lineno
   forWebFrame:(WebFrame *)webFrame;

请注意,这一切都隐藏在一个私有(private)框架中,因此不要尝试将其放入您提交给 App Store 的代码中,并准备好让一些骇客让它发挥作用。

关于iphone - 我的 iPhone Objective-C 代码如何在 UIWebView 中收到有关 Javascript 错误的通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/193119/

相关文章:

objective-c - iOS 7 过度导航栏按钮填充

iphone - 所有文本字段的 resignFirstResponder

ios - AVPlayer 和 Video 的屏幕截图

ios - 使用 Xcode 进行模拟时,PerformFetchWithCompletionHan

objective-c - 实现 -hash/-isEqual :/-isEqualTo. ..:用

ios - 了解一对多的核心数据删除规则

ios - 我可以设置 `attributedText` 的 `UILabel` 属性吗

objective-c - Xcode:可以为协议(protocol)接口(interface)所需

ios - 不支持推送导航 Controller

ios - 选择时如何更改 UITableViewCell 的颜色?