2009-05-21 58 views
5

我在寫一個可以通過自定義URL啓動的iPhone應用程序。所以,我重寫 - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url如何在執行handleOpenURL消息時進行調試?

爲了測試我的變化,我必須運行在模擬器應用程序,然後退出並啓動Safari瀏覽器。然後我在地址欄中輸入我的自定義URL以啓動應用程序。

但每次啓動時,應用程序都會崩潰。我試圖弄清楚爲什麼,但是當我設置斷點並從主屏幕(而不是XCode)啓動應用程序時,它似乎沒有附加。

我甚至試圖把的NSLog語句在handleOpenURL消息,但他們沒有得到打印到控制檯。

我想我可以創建UIAlertViews但...是啊,讓人驚訝。任何其他方式連接到模擬器中的調試會話?

回答

14

在Xcode中4,您可以編輯您的目標的方案和「運行」一節中,「信息」選項卡,你可以選擇「等待MyApp.app啓動」選項:

enter image description here

這將導致調試器等待下一次你的應用程序啓動完成,然後附加到這個過程,而不是創建新的過程給你。這可以讓你從Safari手動啓動你的應用程序並使用調試器。

7

打開Console.app(在Utilities文件夾中)。你的日誌消息應該出現在那裏。

+0

要在此展開,`NSLog`語句將不會在標準的XCode控制檯顯示,如果應用程序沒有從推出的XCode(即手機或模擬器內)。 – 2009-12-24 06:28:52

+0

這並沒有爲我工作,但在Xcode管理器窗口使用控制檯選項卡沒有... – 2010-01-07 22:12:11

1

你可以寫一個單元測試,將行使您的AppDelegate的功能?

+0

我真的試圖另外一種方式類似 - 我把電話給handleOpenURL在applicationDidFinish推出的消息,然後啓動正常,我能夠穿過。這樣做並沒有使任何事情崩潰,它只是通過上述步驟崩潰。 – bpapa 2009-05-21 22:12:44

1

我還沒有試過,但怎麼樣在你的代碼中加入斷點指令在線:

#if TARGET_CPU_ARM == 1 
#define breakpoint() __asm__ volatile ("bkpt 0") 
#else // !ARM - assume INTEL. Everything else will break 
#define breakpoint() __asm__ volatile ("int3"); 
#endif 
1

添加以下作爲hadleOpenURL第一行:

[NSThread sleepForTimeInterval:30.0 和之後把斷點上的下一行。

您的應用程序被調用後,您將有30秒去的XCode,並從菜單中選擇:運行/「附加到進程」,然後從列表中選擇您的應用程序名稱。 你的調試器應該停在你的斷點處。

當您完成時,不要忘記刪除sleepForTimeInterval!