【问题标题】:What are some methods to debug Javascript inside of a UIWebView?有哪些方法可以在 UIWebView 中调试 Javascript?
【发布时间】:2011-02-15 14:38:28
【问题描述】:

我试图弄清楚为什么使用 Javascript 的东西在 UIWebView 中不起作用。据我所知,没有办法在 XCode 中为 js 文件设置断点。没问题,我会回到 2004 年并使用警报语句——哦,等等,它们似乎也不能在 UIWebView 中工作!

我唯一能想到的就是将我的 HTML 和 JS 文件导出到我的桌面,然后在 Safari 中进行调试。那行得通!但当然,我在 UIWebView 中遇到的错误不会发生在 Safari 中。

还有其他方法可以在 UIWebView 内部进行调试,或者我可以使用类似于使用老式警报方法的任何技巧吗?

【问题讨论】:

    标签: javascript iphone html uiwebview


    【解决方案1】:

    如果您使用的是 iOS >= 6,并且您有山狮 (10.8) 或 Safari >= 6,您可以:

    1. 在模拟器中打开应用程序(或在 XCode >= 4.5.x 中打开您的设备)。
    2. 打开 Safari(转到 Preferences -> Advanced 并确保“在菜单栏中显示开发菜单”已打开。
    3. 从(Safari 的)菜单栏中选择Develop -> iPhone Simulator -> [your webview page]

    就是这样!

    【讨论】:

    • 这仅适用于在模拟器中运行应用程序的情况。如果一定要使用iOS设备进行调试,看这个方法mobiarch.wordpress.com/2013/04/06/…
    • @RajV 您可以在物理设备上调试 UIWebViews,但只能调试您直接使用 XCode 在设备上放置的那些,而不是来自 Appstore 的那些。
    • 很明显,但这可能会有所帮助。我已经在运行 OSX 10.9 Mavericks 和 Safari 7 的 iOS7 模拟器上对此进行了测试——运行良好。谢谢你。
    • @refaelos 谢谢!!如果我使用开发临时配置文件,它甚至可以与我的物理设备一起使用。
    • 不确定是否在模拟器上,但要使其在设备上运行,您必须在设置中启用一个选项。 Settings > Safari > Advanced > Web Inspector
    【解决方案2】:

    此查询在 google 上名列前茅,因此值得链接到 remoteInspector hidden in iOS5 - 迄今为止发现的调试 UIWebViews 的最佳方法 - 只需在发送给 Apple 之前进行条件编译。

    【讨论】:

    • 仍然有效,像这样使用它:[NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)]; 记得在构建发布时删除调用!
    • 这是一项很棒的技术。但是,请注意,调试器似乎只在 safari 中工作。我在其他浏览器(例如chrome)上尝试过,但什么也没显示。
    • 我以前用过这个,但显然自从 Mountain Lion 出现后它现在就不能工作了(可能的解决方法在这里):iwebinspector.com/help.html#ml
    【解决方案3】:

    alert() 当然对我有用。

    但是,您还可以做很多其他事情,例如制作您自己的 DHTML 警报并在图层中弹出。这很好,因为您可以对单个 div 执行多个警报,而无需停止您的应用程序。您还应该能够向其写入堆栈跟踪(堆栈跟踪位于异常对象中,您始终可以抛出自己的异常)。

    或者,如果在模拟器上运行,您的自定义“alert()”可以调用目标 C,并在 iPhone 模拟器的控制台窗口中显示字符串:

    document.location.href = "http://debugger/" + 
       encodeURIComponent(outputString);   
    

    在目标 C 方面:

    //--------------------------------------------------------------------
    - (BOOL)webView:(UIWebView*)webView 
           shouldStartLoadWithRequest: (NSURLRequest*)req 
           navigationType:(UIWebViewNavigationType)navigationType {
        if ([[[req URL] host] isEqualToString:@"debugger"]){
            // do stuff with [[req URL] path] 
           }
    }
    

    也就是说,我有一个应用程序很重 UiWebView / javascript 的东西,我倾向于在 Chrome 中进行大多数 javascript 开发(模拟 iPhone 环境中的必要功能)

    【讨论】:

    • 你是什么意思“alert()”当然对我有用?调用 Objective-C 是有创意的,很惊讶我之前没有考虑过,因为我已经做了一点!谢谢。 :)
    • 是的,alert() 工作得很好。也许它没有在旧版本上?但我只是试了一下,得到了一个看起来与在 objC 端使用 UIAlertView 完成的几乎相同的弹出窗口。
    【解决方案4】:

    我得到了调试 UIWebView 的绝妙方法或者 SFSafariViewController.

    我希望它会有所帮助。

    第 1 步: 在您的 Mac 中打开 Safari VC(哈哈哈,不要做鬼脸,如果我在您的 Macbook 中说,请按照我的步骤操作)

    第 2 步:进入 Safari 偏好设置,然后点击高级。您将在 MacBook 屏幕上获取此设置。

    现在在菜单栏中启用 Show to development 菜单。现在你的所有工作都完成了。你以为我在开玩笑吗 :P :P 没有人...

    第 3 步: 在设备或模拟器中运行您的应用程序。 (不要想只是运行)然后进入您打开 Webview 或 SFSafariViewController 的应用程序。 到现在你还不明白我知道。冷静点,看看我的下一步。

    第 4 步: 在 MacBook 中打开 Safari,然后单击菜单栏中的开发选项。您的 MacBook、iPad/iPhone 是否显示正确????

    第 5 步: 完成。单击您的设备并单击 URL 新弹出窗口将像这样出现。

    第6步:你现在在看什么,所有步骤都在这里。

    现在在此控制台上调试您的网页。 在编码的同时快乐并享受你的一天喝杯茶或 咖啡。

    IMP:不要忘记启用查看下图

    【讨论】:

      【解决方案5】:

      我还没有尝试过,但是看看这个Weinre

      看起来很有希望。

      【讨论】:

      • weinre 很酷,但要注意它不附带逐步 JS 调试器;它只是一个“网络检查员”。 (直到在我的 iPhone 上设置它遇到了很多麻烦,我才注意到这一点。)
      • Weinre 似乎已经停止工作,因为 Lion:我无法再获得连接,可能是沙盒问题。
      • Adobe 现在似乎与 Weinre 达成了交易,并提供了一个名为 Adob​​e Shadow 的应用程序来实现它。效果很好。
      • 我通过 npm(node.js 包管理器)安装了 weinre,它在 Mountain Lion 中为我工作。 npm install -g weinre
      • 仅链接的答案更适合作为评论。
      【解决方案6】:

      这是一个老问题。但我还是愿意分享我的两分钱。

      我一直在使用jsconsole.com 进行远程调试。这很容易。只需包含一个脚本标签并使用控制台日志通过打印进行调试。这也可以用于在真实设备上进行调试。

      【讨论】:

        【解决方案7】:

        老问题,但我想我找到了最好的解决方案,在我的情况下,你需要调试 uiwebview,但我无法访问 IOS 应用程序,只能访问 html 内容,我必须查看一些 JS 日志,我补充说下面的代码加载light firebug JS并自动显示:

        从 JS 调用它

        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = 'https://getfirebug.com/firebug-lite-debug.js';
        document.head.appendChild(script);
        

        或从 html 加载它

        <script type="text/javascript" src="https://getfirebug.com/firebug-lite-debug.js"></script>
        

        【讨论】:

          【解决方案8】:

          您可以设置一个类似PhoneGap 中使用的系统,将消息从 JavaScript 发送到 Objective-C 并从那里记录。简而言之,他们正在使用自定义方案设置 document.location 并在委托回调中阻止该方案。

          您可以利用 UIWebView 是 WebView 的大多数委托这一事实。 WebKit 在技术上没有用于 iPhone 的文档,但与桌面 WebKit 标头中指定的大部分相同,可能包括 WebScriptObject。我用它来调试,但一定要在提交给 Apple 之前去掉这段代码。

          要从 UIWebView 获取 WebView,请在 UIWebView 的子类中实现类似 -(void) webView:(id)inWebView didFinishLoadForFrame:(id)inWebFrame 的委托方法。如果您使用那个,请调用 super。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-04-02
            • 1970-01-01
            • 1970-01-01
            • 2010-11-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多