Debugging on-launch Javascript in UIWebView
我目前正在调试嵌入在 UIWebView 中以在应用程序中显示的网页。
它使用了一些精心设计的加载 Javascript,在 Android 应用程序中运行良好,但在 iOS 应用程序中中断。
这个答案将我指向 UIWebView 的 Safari Web Inspector - 但是,由于损坏的 Javascript 在页面加载时运行,我实际上无法及时附加检查器以捕获出现的任何问题。
现在我正在通过手动在页面中插入延迟来解决它,但是有没有更好的方法(不需要我对页面代码本身进行更改,启动应用程序,急于加载它在 Safari 中启动,然后再等待一段时间以继续)?
重要编辑:在 Safari 7.0 中,您可以通过选择"资源"视图并单击顶级页面旁边的刷新箭头来重新加载页面。 [似乎您至少可以在 Safari 6 的某些版本中执行此操作,方法是选择文档选项卡,单击顶级页面以选择它,然后按 Command R(与普通 Safari 中用于刷新页面的快捷键相同)。 ] 如果您从 Safari Web Inspector 刷新页面,您设置的断点仍然存在,因为这样做不会导致 SWI 分离从您的应用程序或 Xcode 调试器重新加载页面的方式。这意味着只要页面不执行 Javascript 重定向或在应用程序本身中触发副作用,您可以通过加载页面一次,在此处设置断点,然后从内部重新加载页面来逐步执行 onload Javascript SWI.
原始帖子:我能找到的唯一解决方案是对
添加一个脚本(不是onload,同步的)作为页面头部的第一个元素:
1 2 | <script type="text/javascript"> window.location ="myapp://catchme"; |
在
中设置 XCode 断点
编辑断点设置条件:
1 | (bool)[[[request URL] absoluteString] isEqualToString:@"myapp://catchme"] |
(如果没有这种情况,它将在初始
开始页面加载,当它遇到 (Xcode) 断点时,切换到 Safari,并使用 Develop > iPhone Simulator > (my page) 启动 Mobile Web Inspector,然后切换回 Xcode 并在一个短窗口内恢复执行在页面上的所有资源请求超时之前。
Weinre 帮我解决了这个问题,因为它从一开始就是连接的,你可以完全控制页面。
与 OP 提出的问题不是 100% 相关,但我在一个移动应用程序中遇到了与 Android WebView 类似的问题,它的本机代码我无法控制(但启用了 WebView 调试)。
-
document.reload() 和所有其他类似的重新加载页面的方法对我不起作用 -
我想把
alert() 放在页面的最顶部,这在理论上是一个阻塞调用,但它对我也不起作用。 - 最后,我选择了一个阻塞的、同步的 XHR。
为了在页面加载时注入人为延迟,我在我控制下的端点添加了一个假调用,该调用在 15 秒后返回 200 OK。
把它放在
的最顶部
1 2 3 4 5 6 7 8 | try { var request = new XMLHttpRequest(); request.open('GET', 'https://whatever/please-freeze', false); // false = sync XHR request.send(null); } catch (err){ debugger; }; debugger; |
例如,您可以创建自己的简单 http 服务器,其端点行为如下,但这有点矫枉过正。
无论出于何种原因,
适用于 Windows (Fiddler) 用户的 hack
由于我在 Windows 上,我使用 Fiddler 创建了一个有延迟的自动回复。
我还用Fiddler编辑了原始页面请求的HTML,注入了前面提到的
为什么不在 shouldStartLoadWithRequest 中设置断点然后打开检查器?