Как отлаживать расширения iOS 8 с помощью NSLog?

- (void)viewDidLoad
{
    NSLog(@"%s", __func__);
    // ...
}

в viewDidLoad расширения iOS 8. NSLog ничего не выводит в Xcode. NSLog работает как обычно в приложении-контейнере.

Как я могу получить вывод из отладочных сообщений из расширения?

Ответ 1

  • Отладка работает для расширений приложений.
  • Он также работает на симуляторе.
  • Если ваше приложение ext аварийно завершает работу в симуляторе, вы можете обнаружить, что перезагрузить приложение не просто. Перезапуск вашего симулятора - это быстрое решение.
  • Шаги по отладке расширения приложения:

    1) Запустите приложение-контейнер. На этом этапе Xcode загружает приложение контейнера и расширение приложения на устройство или симулятор.

    2) Остановите приложение контейнера. Этот шаг важен при отладке в симуляторе. Если вы этого не сделаете, Xcode скажет вам, что симулятор используется.

    3) В Xcode нажмите меню Debug → Attach to Process → Идентификатор процесса (PID) или Name..., введите идентификатор ext ext приложения, например. com.abc.ContainerApp.MyExtension, чтобы начать отладку. Не забудьте установить точки останова. (Обновление от 25 августа 2014 года: вы можете напрямую ввести MyExtension (имя добавочного номера).)

    4) В устройстве или симуляторе откройте расширение приложения.


Обновления от 23 августа 2014 года:

Я обнаружил, что этапы отладки выше не работают на Xcode 6 beta 6 с бета-версией IOS 8 SDK на симуляторе.

Решение:

  • Запустите расширение в симуляторе.
  • Меню Xcode Отладка → Прикрепить к процессу → Выберите "MyExtension (ваше расширение)" в разделе "Система" в меню.

Работает точка останова. Но я не знаю, почему журналы не отображаются в окне вывода.

Ответ 2

У меня тоже такая проблема. Он работает для меня, если вы заходите в свой симулятор в меню Debug → Open System Log...

Здесь вы можете увидеть все журналы iPhone Simulator (включая журналы расширений).

enter image description here

Ответ 3

NSLog работает отлично.

Вы просто не видите, что регистрируется в области отладки Xcode, потому что отладчик Xcode не подключен к вашему расширению. Расширения почти полностью независимы от их приложения. Например, у них есть отдельные идентификаторы связки, и они также являются отдельными процессами в ОС.

У меня был большой успех в получении Xcode для присоединения к расширениям. Предположительно кажется, что он будет автоматически подключаться, и он появляется в навигаторе отладки как "Ожидание присоединения", но никогда не присоединяется.

Иногда я могу запустить свою цель расширения в Xcode:

enter image description here

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

enter image description here

И тогда он иногда прикрепляет отладчик к моему расширению. Обратите внимание, что этот метод работает только на физических устройствах.

Если он не используется, вы можете использовать метод ручной привязки в ответе @VinceYaun,

У меня также был большой успех, используя другие методы привязанности. Большинство из них были безуспешными, и, похоже, это просто ошибки, которые будут исправлены позднее.

Чтобы просмотреть сообщения журнала, перейдите в WindowDevices в верхней панели и выберите свое устройство. Вы можете открыть журнал устройства в нижней части этого окна. Если вы тестируете симулятор, вы можете использовать @BalestraPatrick answer.

Некоторые из ошибок были исправлены в Beta 2, и я предполагаю, что в конечном итоге отладчик автоматически подключится при запуске расширения.

Обновление: В iOS 8 Beta 4 примечания к выпуску:

Расширения

Исправлено в бета-версии 4

  • Расширения иногда не запускаются при отладке из Xcode.
  • Когда расширение с пользовательским интерфейсом убито, оно перезапускается и не увольняется.
  • Иногда расширение "Расширение" или "Действие" может зависать.
  • Повторное развертывание расширения может отключить его в Центре уведомлений.

Ответ 4

У меня тоже такая проблема. Xcode никогда не присоединяет мой отладчик к расширению или не отображает сообщения NSLog. Если вы присоедините свой отладчик Xcode вручную к процессу расширения, по крайней мере, точки останова работают как заклинание:

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")

Ответ 5

  • Создайте схему для расширения
  • Схема запуска
  • В диалоговом окне выберите контейнерное приложение
  • Enjoy

Это работает для меня:)

Ответ 6

Xcode 8 способен отлаживать расширения:

  • Выберите схему расширения в комбо рядом с кнопкой остановки и запустите ее.
  • Выберите родительское приложение в появившемся диалоговом окне.

Результат: точки останова и журнал работают как обычно.

Ответ 7

Я фактически получил журналы, которые можно было запустить довольно просто в Xcode 6.3. Во-первых, создайте и запустите содержащее приложение. После того, как приложение будет запущено на устройстве, создайте и запустите расширение приложения, изменив схему на расширение приложения.

Apple имеет документацию, напрямую связанную с отладкой, профилированием и тестированием расширения вашего приложения.

Ответ 8

Единственный способ отладки работает для меня, выбрав Debug- > Attach To Process By PID или Name Затем введите PID не имя расширения. Вы можете найти PID, запустив расширение на устройстве, перейдите в Window- > Devices. Найдите устройство и просмотрите консоль. Когда вы видите имя своего расширения, его следует 5-значное число. Это PID

Я также добавил кучу NSLog в расширение, чтобы найти PID. Это на xCode 7

Ответ 9

Что в конечном итоге позволило мне увидеть журнал в области отладки на основе предложения Майкла и Документация Apple:

Создайте и запустите расширение приложения в симуляторе и, при появлении запроса на хост-приложение, выберите конкретное приложение, которое вы собираетесь называть добавлением от. В моем случае я запускал расширение Action из Safari, потянув вверх лист акций в PDF.

То, что раньше не работало, заключалось в том, что другие люди предлагали использовать Today в качестве хоста, но затем оставляли это приложение и переходили в Safari для вызова моего расширения. Мне больше не нужно запускать мое приложение, прежде чем запускать расширение.

Из документации Apple:

В вашей фазе продления срока запуска вы укажете хост-приложение как исполняемый файл. При доступе к расширению через указанный указанный UI хостов отладчик Xcode присоединяется к расширению.

Ответ 10

Как и в Xcode 6 Beta 5, я смог использовать фактическое устройство под управлением iOS8 для отладки моего расширения. Попробуйте запустить его на устройстве и выберите Safari для запуска в

Ответ 11

Ясно, что что-то сломано в Xcode6-B5.

Если я пытаюсь запустить расширение Photo на симуляторе, я не вижу никаких Photos.app в качестве опции для процесса добавления расширения.

debug options within simulator

То же самое, работая на реальном устройстве, дайте мне правильное поведение.

debug options withing a real device

В первом случае любая точка останова не считается почетной. В последнем случае точки останова работают как шарм.

Ответ 12

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

Вы можете решить большинство проблем методом @Vince Yuan.

Однако, моя проблема заключается в том, что Xcode-отладчик вряд ли подключается к моему расширению клавиатуры как на iOS-симуляторе, так и на устройствах, например, 1 раз в 7-8 прогонах. Это полностью вопрос вероятности. Метод @Vince Yuan также работает только иногда.

Мой маленький опыт заключается в том, что при запуске вашей схемы отладки, если отладочный сеанс на левой панели показывает, что "Нет сеанса отладки", нет необходимости открывать расширение и тестировать его, отладчик не подключался, просто запустите снова, чтобы повезло.

но когда вы увидите, что com.xxx.xxx.xxx ждет Attach, расширение может определенно получить отладочную версию.

Это небольшой трюк, для которого невозможно отладить расширение iOS, особенно расширение клавиатуры.

Ответ 13

Чтобы преодолеть все состояния, вызванные постоянно меняющейся средой IDE, я использую консоль iOS с помощью lemonjar.com - она ​​отображает консольное окно для любого подключенного устройства iOS, отображающего сообщения syslog, независимо от идентификатора процесса. Здесь вы можете сразу увидеть сообщения об ошибках приложений и расширений.

Ответ 14

Трюк, который работает для меня (хотя и довольно уродливый), заключается в том, чтобы поместить манекен UILabel где-то в нижнем углу моего расширения. Обычно я называю это logLabel. Затем можно обновить текст этой метки любым оператором журнала, который вы хотите зарегистрировать. Такой подход не очень хорош, если вам нужно записывать заявления из экземпляров разных классов. И, очевидно, это загромождает ваш пользовательский интерфейс.

Однако, если у вас довольно простой виджет, и вы не возражаете против небольшого загромождения пользовательского интерфейса, это делает трюк. Я пробовал все другие решения, изложенные в этом обсуждении, и, к сожалению, ни один из них не работал у меня.