有什么方法可以在UIWebView中调试Javascript?


136

我试图弄清楚为什么用Javascript的东西不能在UIWebView内部工作。据我所知,没有办法在XCode内为js文件设置断点。没问题,我将回到2004年并使用警报管理员-哦,等等,他们似乎也无法在UIWebView内部工作!

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

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

Answers:


277

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

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

而已 !


6
仅当在模拟器中运行应用程序时,此方法才有效。如果必须使用iOS设备进行调试,看看这种方法mobiarch.wordpress.com/2013/04/06/...
RajV

7
@RajV您可以在物理设备上调试UIWebView,但是只能调试直接用XCode放置在设备上的UIWebView,而不能从Appstore调试。
alecail 2013年

1
很明显,但这可能会有所帮助。我已经在运行OSX 10.9 Mavericks和Safari 7的iOS7模拟器上对此进行了测试-表现出色。谢谢你
2013年

1
@refaelos谢谢!如果我使用开发临时配置文件,则它与我的物理设备一起工作。
umang2203 2015年

11
不确定是否在模拟器上,但是要使其在设备上正常工作,必须在设置中启用一个选项。 Settings> Safari> Advanced> Web Inspector< -启用此
哈德森

31

该查询排在Google的首位,因此值得链接到隐藏在iOS5中remoteInspector-到目前为止,这是调试UIWebViews的最佳方法-仅在发送给Apple之前有条件地编译出来。


3
仍然可以正常工作,请按以下方式使用它:[NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)];切记在构建发行版时删除该呼叫!
rpitting

1
这是一个很棒的技术。但是请注意,调试器似乎只能在Safari中工作。我在其他浏览器(例如chrome)上尝试了一下,但没有显示任何内容。
Sagi Mann

3
我以前曾经使用过它,但是自从Mountain Lion出现以来,它现在显然不起作用(这里可能的解决方法):iwebinspector.com/help.html#ml
Omer,

9

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是很有创意的,令我惊讶的是我之前从未考虑过,因为我已经做了一些!谢谢。:)
bpapa 2010年

是的,alert()可以正常工作。也许不是在旧版本上?但是我只是尝试了一下,然后得到一个弹出窗口,看起来与在objC端使用UIAlertView完成的弹出窗口几乎相同。

8

我得到了调试UIWebViewSFSafariViewController的绝佳方法

希望对您有所帮助。

第1步: 
 在Mac上打开Safari VC(哈哈哈,别露脸,如果我在Macbook中说,请按照我的步骤进行)



步骤2:转到Safari偏好设置,然后单击“高级”。您将在MacBook屏幕上获得此设置。

在此处输入图片说明

现在,在菜单栏中启用“显示以开发”菜单。现在,您的所有工作都已完成。您是否在想我在开玩笑:P:P没人... 



步骤3:在“设备”或“模拟器”中运行您的应用程序。(不要认为只是运行)然后进入您要打开Webview或SFSafariViewController的应用程序。到现在为止您还不了解我所知道的。冷静点,看看我的下一步。

步骤4:在MacBook中打开Safari,然后从菜单栏中单击Develop Option。MacBook,iPad / iPhone的显示正确吗?

在此处输入图片说明



步骤5:完成。单击您的设备,然后单击URL。这样会弹出新弹出窗口。 在此处输入图片说明




步骤6:您现在在看什么,这里是所有步骤。

现在,在此控制台上调试网页。喝杯茶或咖啡进行编码时,要快乐并享受美好的一天。

IMP:不要忘记启用请参见下图 在此处输入图片说明 









6

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

看起来非常有前途。


weinre很酷,但是请注意,它没有逐步的JS调试器。它只是一个“网络检查器”。(直到我在iPhone上进行设置时遇到很多麻烦,我才注意到这一点。)
Dan Fabulich 2011年

自Lion以来,Weinre似乎已停止工作:我再也无法建立连接,可能是沙箱问题。
rpitting 2012年

看来Adobe现在已经与Weinre达成协议,并提供了一个名为Adobe Shadow的应用程序来实现它。效果很好。
阿德里安·哈里斯·皇冠

我通过npm(node.js程序包管理器)安装了weinre,它在Mountain Lion中为我工作。npm install -g weinre
wprl

2
仅链接的答案更适合作为注释。
Joris Meys 2013年

4

这是一个老问题。但是我仍然想分享我的两分钱。

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


3

旧问题,但是我想我找到了最好的解决方案,就我而言,您需要调试uiwebview,但是我无权访问IOS应用程序,而只能访问html内容,并且必须查看一些JS日志,因此添加了以下代码加载轻型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>

-1

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

您可以利用以下事实:UIWebView是WebView的大多数委托。WebKit在技术上没有针对iPhone的文档记录,但与桌面WebKit标头中指定的大部分相同,可能包括WebScriptObject。我使用它进行调试,但是在提交给Apple之前,请确保先删除此代码。

要从UIWebView获取WebView,请像-(void) webView:(id)inWebView didFinishLoadForFrame:(id)inWebFrame在UIWebView的子类中一样实现委托方法。如果使用超级电话,请致电超级。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.