Pulse 3
10 января 2023 г.
Сегодня моя 10-я годовщина программирования на платформах Apple, и что может быть лучше, чем отпраздновать это новым крупным выпуском — Pulse 3.0 вышел!
Мне нравился каждый год, когда я работал над iOS. Я начал в 2012 году с Objective-C, и теперь, благодаря Swift и SwiftUI, я могу таргетировать все платформы Apple, что невероятно. Pulse 3 — это полная переработка. Он расширяет возможности и обеспечивает почти полное равенство функций между iOS, macOS, watchOS и tvOS с одной и той же кодовой базой.
Pulse — это сетевой логгер, созданный с помощью SwiftUI. Он интегрируется на URLSession уровне, позволяя ему видеть незашифрованный трафик и записывать метрики задач, доступные только на этом уровне.
iOS
Первоначальная версия Pulse была разработана быстро и ориентировалась только на iOS, поэтому многие решения были несовместимы с другими платформами. К счастью, почти для каждой проблемы существовало наилучшее решение, которое также улучшало работу с iOS и упрощало код.
Инспектор
Наиболее кардинальные изменения, вероятно, произошли в инспекторе сети. Предыдущая версия имела запутанную навигацию с сегментированным элементом управления в панели навигации, который был труднодоступным и не масштабировался для добавления дополнительных функций. Что еще более важно, он был несовместим с другими платформами. Таким он был начиная с версии 0.1, и пришло время его улучшить.
Самое простое решение зачастую оказывается и самым лучшим. Инспектор теперь использует простой List интерфейс с навигационными ссылками. Новая версия более интуитивная и простая и содержит важную информацию. Основные области навигации, такие как средство просмотра ответов и заголовков, теперь проще найти, поскольку они расположены ближе к нижней части экрана.
Новая навигация освободила много вертикального пространства. Разница между старым инспектором и новым разительна. Раньше в средстве просмотра ответов была специальная кнопка «Показать в полноэкранном режиме». Теперь она не нужна. Когда вы нажимаете «Ответить», вы фактически уже находитесь в полноэкранном режиме.
Сам просмотрщик ответов довольно крут, потому что, в отличие от обычных HTTP-прокси, может отображать ошибки декодирования . И что еще лучше, так это то что подход с «большим количеством вертикального пространства» распространился и на него. Я адаптировал searchable API, так что панель поиска теперь исчезает, когда она не нужна. А еще я переделал панель инструментов для перехода между результатами поиска. Теперь эта панель отображается в правом нижнем углу, освобождая еще больше места по вертикали.
Экран метрик также переработан. Теперь он четко показывает все отдельные транзакции вместе с их типами выборки и другими деталями. Теперь намного проще понять время жизни запроса.
В следующем примере вы сразу увидите, что у задачи было три транзакции: первый запрос был перенаправлен с кодом 301 (перемещен навсегда), за которым последовал поиск в кэше с другим запросом для проверки, который вернул 304 (без изменений).
Текст
Текст часто является лучшим интерфейсом, и он повсюду в Pulse. Там, где раньше у вас были невыбираемые метки , теперь используются полнофункциональные текстовые представления с выделением текста, поиском и совместным использованием. Есть также два новых варианта обмена: HTML и PDF. Я уверен, что многие люди будут в восторге от PDF, особенно если вы распечатываете код на работе. Чтобы активировать эти функции, мне пришлось переработать способ создания строк, потому что предыдущий подход к написанию разных «рендереров» для разных выходных данных плохо масштабировался.
В новой системе я визуализирую вещи — сообщения, задачи, тела ответов — в атрибутивные строки. Затем строки преобразуются в запрошенный выходной формат: NSAttributedString -> HTML, NSAttributedString -> PDF, NSAttributedString -> Plain Text. Это намного проще, а также дает стабильные результаты. Пред. Просмотр в SwiftUI очень помог с репликацией на его базе.
Навигация
В Pusle 3 также изменилась основная навигация. В MainView предыдущей версии была панель вкладок, которая неплоха для большинства приложений iOS, но не для инструмента, который вы интегрируете в существующее приложение. У большинства крупных приложений уже есть собственные меню отладки, и они хотят интегрировать туда Pulse.
Навигация в Pulse 3 теперь сфокусирована вокруг одного экрана: ConsoleView его можно либо нажать, либо представить. Экраны « Сеть» и “pins » стали простыми фильтрами. А Insights и Settings теперь доступны из нового контекстного меню. Оно также обеспечивает быстрый доступ к стандартным действиям, таким как удаление журналов.
Просмотр в виде текста — еще одна новая функция. Она отображает весь вывод консоли в виде текста. Но это не статический текст: вы по-прежнему можете применять фильтры, искать, разворачивать и сворачивать сетевые запросы и многое другое. И точно также как просмотрщик ответов, эта функция отображает встроенные ошибки декодирования (см. «id», выделенный красным).
Хранилище
Усовершенствования системы хранения были в центре внимания Pulse 2: значительная экономия места, улучшенный формат документов для совместного использования и полностью совместимое с SQL хранилище — это лишь некоторые из внесенных изменений. Благодаря этому прочному фундаменту в этом релизе я смог сфокусироваться на PulseUI, но тем не менее также реализовал и несколько улучшений framework. Например, в NetworkLogger теперь есть удобные API для фильтрации конфиденциальных данных или чего-то, что вы не хотите логировать по другим причинам.
let logger = NetworkLogger {
// Includes only requests with the given domain.
$0.includedHosts = ["*.example.com"]
// Exclude some subdomains.
$0.excludedHosts = ["logging.example.com"]
// Exclude specific URLs.
$0.excludedURLs = ["*/log/event"]
// Replaces values for the given HTTP headers with "<private>"
$0.sensitiveHeaders = ["Authorization", "Access-Token"]
// Redacts sensitive query items.
$0.sensitiveQueryItems = ["password"]
// Replaces values for the given response and request JSON fields with "<private>"
$0.sensitiveDataFields = ["password"]
}
Оба шаблона include и exclude поддерживают базовые подстановочные знаки (*), но вы также можете превратить их в шаблоны регулярных выражений, используя isRegexEnabled.
tvOS
Теперь поговорим о большом экране — Apple TV. Первоначальный дизайн, ориентированный на iOS, был в значительной степени несовместим с другими платформами. Но с новой упрощенной навигацией я смог использовать сетевой инспектор и консоль почти без изменений на tvOS (и других платформах, но об этом позже). Я был ошеломлен, когда запустил новую кодовую базу SwiftUI на других платформах — она просто работала. Мне нужно было внести лишь небольшие коррективы. Ну, конечно, я тоже использую нативный дизайн, так что многое приходит бесплатно.
Главное, что я в конечном итоге настроил в tvOS, — это навигация, позволяющая использовать преимущества большого экрана. Я объединил два стека навигации на одном экране, как в консоли, так и в инспекторе сети. Таким образом, вы можете получить доступ к общим функциям, таким как фильтры, даже не выходя из консоли. Он также обеспечивает приемлемую ширину для списков, чтобы существующие ячейки из iOS хорошо работали в данной области.
watchOS
Версия для watchOS также была полностью переработана и теперь почти полностью соответствует функциям iOS. Если вам нравится ходить в походы с Apple Watch Ultra и у вас есть приложение для watchOS для тестирования — отлично. Вы можете записывать и просматривать журналы прямо на устройстве. И когда вы будете готовы, вы можете легко поделиться ими и просмотреть их на большом экране.
Вы также можете удаленно подключаться к любому устройству, на котором работает Pulse, с помощью Pulse Pro и просматривать журналы в режиме реального времени на своем Mac.
Многие функции я получил «бесплатно» после переработки версии для iOS. Например, консольные и сетевые фильтры, изначально разработанные для Pulse Pro , теперь работают на всех платформах (и почти без условного кода). Но есть также несколько новых API-интерфейсов SwiftUI, которые я интегрировал в watchOS: AttributedString, searchable, графики, ShareLink моноширинные цифры для Text, деструктивные кнопки buttonBorderShape и многое другое.
macOS
Версия для macOS вернулась к своему оригинальному дизайну с тремя столбцами из App Kit is Done , но теперь с новыми NavigationSplitViewAPI и 90% кроссплатформенного кода.
Версия macOS, вероятно, больше всего изменилась за последние пару лет.
Первая версия Pulse 0.x была почти до безобразия плохой, но я добавлю ее в качестве ориентира — приятно видеть прогресс. В версии 1.0 я добавил правильную поддержку macOS с окнами, панелями инструментов и навигацией в три столбца. Следующим важным достижением стало автономное приложение Pulse Pro, в основном AppKit, для просмотра журналов, удаленно передаваемых с других устройств. С выпуском Pulse Pro я почти полностью вырезал версию консоли PulseUI для macOS. Но с недавними улучшениями SwiftUI я начал возвращать PulseUI на Mac. В Pulse 2 я переработал некоторые экраны Pulse Pro в SwiftUI и собрал все вместе в простом представлении .
Pulse 3 — это естественный шаг в SwiftUIfication кодовой базы macOS. Я уверен, что это еще не окончательная форма, поэтому я не хочу сейчас так сильно на этом зацикливаться. Мой следующий шаг — полностью переписать Pulse Pro на SwiftUI — следите за обновлениями!
Заключительные мысли
Я думаю, что наконец-то разобрался со SwiftUI — написание на нем казалось таким же естественным, как написание UIKit. Я использую его для всего: дизайна, прототипирования и разработки. Все меньше и меньше мест, где мне приходится использовать UIKit или AppKit.
SwiftUI хорошо работает, когда вы ориентируетесь только на одну платформу, но при этом вы создаете мультиплатформенное приложение, это полностью меняет правила игры, и я надеюсь, что Pulse тому доказательство. Но есть одно условие – все упирается в дизайн. Вы должны придумать простые дизайнерские решения, совместимые с другими платформами, что зачастую правильно, потому что более простые вещи легче использовать.
Разработка Pulse 3 была совершенно безумной: всего за 2 недели было изменено 215 файлов, добавлено 8 597 и удалено 8 044 файла. Для меня сейчас время остыть. Надеюсь, вы оцените Pulse 3 и он вам понравится.