关于 ios:在 UIWebView 中调试 on-launch Javascript

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.

原始帖子:我能找到的唯一解决方案是对 shouldStartLoadWithRequest: 进行"额外"调用,如下所示:

  • 添加一个脚本(不是onload,同步的)作为页面头部的第一个元素:

    1
    2
    <script type="text/javascript">
        window.location ="myapp://catchme";
  • shouldStartLoadWithRequest:

    中设置 XCode 断点

  • 编辑断点设置条件:

    1
    (bool)[[[request URL] absoluteString] isEqualToString:@"myapp://catchme"]

    (如果没有这种情况,它将在初始 shouldStartLoadWithRequest: 调用时停止,这不是您想要的,因为在此阶段该页面还不能用于附加 Mobile Web Inspector。)

  • 开始页面加载,当它遇到 (Xcode) 断点时,切换到 Safari,并使用 Develop > iPhone Simulator > (my page) 启动 Mobile Web Inspector,然后切换回 Xcode 并在一个短窗口内恢复执行在页面上的所有资源请求超时之前。


  • Weinre 帮我解决了这个问题,因为它从一开始就是连接的,你可以完全控制页面。


    与 OP 提出的问题不是 100% 相关,但我在一个移动应用程序中遇到了与 Android WebView 类似的问题,它的本机代码我无法控制(但启用了 WebView 调试)。

    • document.reload() 和所有其他类似的重新加载页面的方法对我不起作用
    • 我想把 alert() 放在页面的最顶部,这在理论上是一个阻塞调用,但它对我也不起作用。
    • 最后,我选择了一个阻塞的、同步的 XHR。

    为了在页面加载时注入人为延迟,我在我控制下的端点添加了一个假调用,该调用在 15 秒后返回 200 OK。

    把它放在<head>

    的最顶部

    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 服务器,其端点行为如下,但这有点矫枉过正。

    无论出于何种原因,debugger 语句都没有在 Chrome 中触发断点,但在动态加载的代码(之前创建的)中手动定义的断点工作正常。

    适用于 Windows (Fiddler) 用户的 hack

    由于我在 Windows 上,我使用 Fiddler 创建了一个有延迟的自动回复。

    fiddler

    为什么不在 shouldStartLoadWithRequest 中设置断点然后打开检查器?