2009-05-21 2 views
5

Я пишу приложение iPhone, которое можно запустить с помощью настраиваемого URL-адреса. Итак, я переопределяю - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)urlКак отлаживать при реализации сообщения handleOpenURL?

Чтобы проверить мои изменения, я должен запустить приложение в симуляторе, а затем выйти и запустить Safari. Затем я ввожу свой собственный URL-адрес в адресную строку, чтобы запустить приложение.

Но каждый раз при запуске приложения происходит сбой. Я пытаюсь понять, почему, но когда я установил точку останова и запустил приложение с главного экрана (вместо XCode), он, похоже, не прикрепляется.

Я даже попытался представить инструкции NSLog в сообщении handleOpenURL, но они не печатаются на консоли.

Я полагаю, что я мог бы создать UIAlertViews, но ... да, yikes. Любой другой способ подключения к сеансу отладки в Simulator?

ответ

14

В Xcode 4, вы можете отредактировать схему вашей цели и в разделе «Выполнить» на вкладке «Информация» вы можете выбрать опцию «подождите MyApp.app для запуска»:

enter image description here

Это заставит отладчик не ждать до следующего раза, когда ваши пусков приложения, а затем приложить к этому процессу, а не создавая новый процесс для вас. Это позволит вам запускать приложение вручную из Safari и использовать отладчик.

+0

Это должен быть новый ответ теперь, когда Apple исправила это в Xcode 4. Намного проще! – ageektrapped

+1

Это делает крючок отладчика, но NSLog и stdout выглядят потерянными :( –

7

Открыть Console.app (в папке «Утилиты»). Должны появляться сообщения журнала.

+0

Чтобы расшифровать это, утверждения 'NSLog' не будут отображаться в стандартной консоли XCode, если приложение не было запущено из XCode (т. Е. На телефоне или в симуляторе). –

+0

Это не сработало для меня, но с помощью вкладки «Консоль» в окне «Организатор XCode» было сделано ... –

1

Можете ли вы написать модульный тест, который будет использовать функциональность вашего AppDelegate?

+0

Я действительно пробовал другой способ, похожий - я поместил вызов handleOpenURL в сообщение запуска приложенияDidFinish, а затем запустил его как обычно , и я смог пройти. И делать это так, чтобы это не разрушило ничего, это было только сбой с помощью описанных выше шагов. – bpapa

+0

Ваш обработчик handleOpenURL полагается на то, что настроено в applicationDidFinishLaunching? –

+0

Кроме того, вместо того, чтобы пытаться войти в консоль, вы можете сохранить некоторую информацию в файл? –

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, когда вы закончите!

Смежные вопросы