gpt4 book ai didi

iphone - 我的 iPhone Objective-C 代码如何收到 UIWebView 中 Javascript 错误的通知?

转载 作者:太空狗 更新时间:2023-10-30 03:52:19 24 4
gpt4 key购买 nike

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

这是针对开发环境的,因此不需要符合 SDK-kosher 标准。事实上,它真的只需要在模拟器上工作。

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

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

最佳答案

我现在找到了一种在 WebView(注意,不是 UIWebView)中使用脚本调试器 Hook 的方法。我首先必须继承 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/4001769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com