我需要让我的 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/