【问题标题】:Debugging on-launch Javascript in UIWebView在 UIWebView 中调试启动 Javascript
【发布时间】:2013-02-27 01:47:15
【问题描述】:

我目前正在调试嵌入在 UIWebView 中以在应用中显示的网页。

它使用了一些精心设计的加载 Javascript,在 Android 应用中运行良好,但在 iOS 应用中中断。

This answer 将我指向 UIWebView 的 Safari Web Inspector - 然而,由于损坏的 Javascript 正在页面加载时运行,我实际上无法及时附加检查器以捕获任何问题。

现在我正在通过手动在页面中插入延迟来解决它,但是有没有更好的方法(不需要我对页面代码本身进行更改,启动应用程序,急于加载它在 Safari 中启动,然后再等待一段时间以继续)?

【问题讨论】:

    标签: ios uiwebview javascript-debugger safari-web-inspector


    【解决方案1】:

    重要修改:在 Safari 7.0 中,您可以通过选择“资源”视图并单击顶级页面旁边的刷新箭头来重新加载页面。 [似乎您至少可以在 Safari 6 的某些版本中执行此操作,方法是选择文档选项卡,单击顶级页面以选择它,然后按 Command+R(与普通 Safari 中用于刷新页面的快捷键相同) .] 如果您从 Safari Web Inspector 刷新页面,您设置的断点仍然存在,因为这样做不会导致 SWI 分离从您的应用程序或 Xcode 调试器重新加载页面的方式。这意味着只要页面不执行 Javascript 重定向或在应用程序本身中触发副作用,您可以通过加载页面一次,在此处设置断点,然后重新加载来逐步执行 onload Javascript SWI 中的页面

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

    1. 添加一个脚本( onload,同步)作为页眉的第一个元素:

      <script type="text/javascript">
          window.location = "myapp://catchme";
      </script>
      
    2. shouldStartLoadWithRequest:中设置XCode断点

    3. 编辑断点设置条件:

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

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

    4. 开始页面加载,当它遇到 (Xcode) 断点时,切换到 Safari,并使用 Develop > iPhone Simulator >(我的页面)启动 Mobile Web Inspector,然后切换回 Xcode 并在其中恢复执行页面上的所有资源请求超时之前的一小段时间。

    【讨论】:

    • 好吧,我遇到了一个问题,即使如果请求 url 是 myapp://catchme 我返回 NO,我的原始页面也没有加载
    • 供参考:如果您正在运行最新的软件,只需在 safari 检查器上按 cmd + r 即可重新加载 webview
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 不幸的是,当调用 shouldStartLoadWithRequest: 时,无法在 Safari > Develop > iPhone Simulator 中检查 webview。而当 webViewDidFinishLoad: 被调用时,window.onload 事件已经被触发了。您知道是否有任何其他事件可能足以用于断点。
      【解决方案4】:

      与 OP 提出的问题不是 100% 相关,但我在一个移动应用程序中遇到了类似的问题.

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

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

      把它放在&lt;head&gt;的最顶部

        <script>
          try {
            var request = new XMLHttpRequest();
            request.open('GET', 'https://whatever/please-freeze', false); // false = sync XHR
            request.send(null);
          } catch (err){
            debugger;
          };
          debugger;
        </script>
      

      例如,您可以创建自己的简单 http 服务器,其端点行为如下,但这有点矫枉过正。

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

      适用于 Windows (Fiddler) 用户的 hack

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

      我还用Fiddler编辑了原始页面请求的HTML,注入了前面提到的&lt;script&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-06
        • 2010-09-09
        • 2011-02-15
        • 2015-09-29
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多