通过推送通知启动时调试应用


135

我目前正在开发一个接收推送通知的应用程序。我通过PHP页面使所有这些工作都100%进行。我的应用程序可以接收几种不同类型的推送通知。PHP会处理此问题,并将不同的信息包发送到我的应用程序,这些信息包都可以正常接收。

但是,当用户“查看”通知并启动我的应用程序时,我显然希望采取与用户手动启动应用程序不同的操作-最重要的是,根据推送通知类型采取不同的操作。从结构上讲,我的工作正常。

我的一种推送类型应该打开一个UIView,该UIView与多个不同的服务器建立多个连接并来回协商数据。例如,从主菜单触发时,此UIView可以正常工作-但是,当我的推送通知触发此UIView出现时,套接字连接无法按预期方式工作。

现在我的问题不是关于套接字的,而是更多-您如何调试这样的问题?据我所知(相对较新),当应用程序从推送通知启动时,无法将执行链接到调试器/控制台/等...我在尝试使用以下代码进行调试时遇到了非常困难的时间UIAlertViews,因为各种服务器之间有许多来回的通讯线路。

您对我的任何建议将不胜感激。

Answers:


147

现在,在XCode <4.0(对于XCode> = 4,请参见下面的delirus回答)中,您可以配置Xcode在启动调试器后将其附加到应用程序,而不是通过调试器启动应用程序。这使您可以调试根据应用程序的启动状态而有所不同的内容,例如URL方案,粘贴板和推送通知。

  1. 在Xcode中,在“源”栏中查找,在“目标”下方将有“可执行文件”。
  2. 在可执行文件中调出应用程序的检查器。
  3. 单击检查器中的“调试”选项卡。
  4. 取消选中“启动调试器后启动可执行文件”
  5. 选中“等待下一次启动/推送通知”

现在,当您从Xcode单击调试而不是启动应用程序时,将显示一个窗口,告诉您它正在等待应用程序启动。然后,您可以在手机上正常启动该应用,并将Xcode附加到该应用


37
我知道这可能不合适,但我爱你。:)
Dutchie432

17
当您以这种方式启动应用程序的stdin,stdout,stderr时,不会将它们路由到GDB的控制台中,它们会指向它们在正常应用程序启动中的位置。通过在管理器中查看设备,可以在设备的系统控制台中看到NSLog()。
Louis Gerbarg

1
您在这里教给我一些非常有价值的观点。谢谢。我花了过去两天的时间来调试可以在您发布帖子后20分钟内解决的问题。
Dutchie432'2009年

1
@stigi为我在模拟器中工作,用于测试URL方案。我正在使用xcode 4.5(如果有问题的话)
dreyln 2012年

1
@dreyln我的评论来自2009年:)此后发生了很多变化。但是感谢您的注意!
stigi

124

对于Xcode 4,您必须:

  1. 通过“方案”下拉菜单编辑您的活动方案。(+ <
  2. 比选择您的产品-左侧的“运行MyApp.app”。
  3. 选择右侧的“信息”标签。
  4. 最后选择“等待MyApp.app启动”选项。

更多节“自定义可执行的方案编辑器”。

编辑:
如果您错过了GDB中的日志,请参阅Louis Gerbarg 对他的回答的评论


1
我使用的是适用于Lion的Xcode 4.2,尽管该应用程序已从URL方案正确启动,并且调试器的执行未停止,但控制台未显示任何内容。我想念什么吗?
LoDani 2011年

@LoDani同样在这里,你有没有想过为什么?
戴维斯

3
@LoDani,戴维斯·G:您是否看到路易斯对已接受答案的评论?stackoverflow.com/questions/1239000/…以这种方式启动时,不会将stdin / out / err重定向到控制台。
IvanVučica'12

谢谢,您拯救了我的一天!尝试修复仅在由URL处理程序启动我的应用程序时发生的错误。
艾略特(Eliot)2012年

@delirus -感谢更新本作的XCode 4
Dutchie432

112

对于XCode 10、9、8、7和6:

  1. 选择工具栏上的“方案 ”(位于调试设备的左侧)
  2. 选择编辑方案
  3. 在左侧面板中选择运行
  4. 对于“ 启动”选项,选择“ 等待可执行文件启动”
  5. 关闭方案编辑器并运行您的XCode项目

现在,您可以从通知,自定义网址或触摸应用程序图标启动时进行调试。


9
尽管这通常使我走上正确的道路,但这个答案给我带来了很多麻烦。步骤3有点误导。当然,您必须这样做;选择左侧面板中的运行。但是,还应该有一个第5步,其概念用语非常相似:在期望结果之前,单击xcode的“运行”按钮...由于一开始它不适用于我,所以我要求其他同事的建议...他们要求如果我执行了“运行”操作,我回答了“是”,则考虑了选项no。3 ...应该真的,真的,真的要迈出第5步...
Florin Odagiu

@FlorinOdagiu好的电话。添加了第5步。谢谢!
bgolson

如果Xcode还原了其他方案标签,则“启动”选项位于“信息”标签下。
Nate Whittaker '18

3
手动启动应用程序时,在调试器窗口中没有任何输出。
dvdblk

3

我不使用推送通知,所以我不知道推送通知的确切工作方式。但是,我尝试通过让程序的主方法假装发布通知来模仿推送通知的接收,或者在applicationDidFinishLaunching:方法中调用application:didFinishLaunchingWithOptions:UIApplicationDelegate方法。

HTH-大安干杯


这也是一个好主意,但是模仿总是调试真实事物的第二好方法!编码愉快!
Dutchie432

3

在Xcode 6中:

  1. 使用USB将iPhone连接到Macbook
  2. 通过点击图标在iPhone上启动应用程序
  3. 在Xcode的菜单,Debug> Attach to Process>选择您的应用程序

1
您将无法使用这种方法调试关键的启动路径。
Zorayr

2

对于XCode 11和10,可以执行以下操作:

  1. 选择方案选项。
  2. 选择编辑方案。

  3. 从左侧面板中选择“运行”选项

  4. 在启动部分中,选择等待可执行文件启动,然后关闭对话框。

  5. 生成并运行项目。现在,您可以通过点击应用程序图标或点击通知消息来启动该应用程序。

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.