Как Xcode 14 непреднамеренно увеличивает размер приложения
Среди других функций Xcode 14 по умолчанию отключил биткод - альтернативный способ упаковки приложения, при котором часть процесса сборки остается на стороне Apple после его отправки в App Store.
Простое объяснение заключается в том, что битовый код оптимизирует производственные сборки, частично за счет удаления двоичных символов. Без включения битового кода настройки сборки Xcode необходимо изменить, чтобы удалять двоичные символы.
Как удалить двоичные символы без биткода:
👉 Используя настройки сборки Xcode
👉 Используя скрипт
#xcode
Среди других функций Xcode 14 по умолчанию отключил биткод - альтернативный способ упаковки приложения, при котором часть процесса сборки остается на стороне Apple после его отправки в App Store.
Простое объяснение заключается в том, что битовый код оптимизирует производственные сборки, частично за счет удаления двоичных символов. Без включения битового кода настройки сборки Xcode необходимо изменить, чтобы удалять двоичные символы.
Как удалить двоичные символы без биткода:
👉 Используя настройки сборки Xcode
👉 Используя скрипт
#xcode
👍6
Как настроить Charles
Приложение Charles Proxy - большой помощник и тестировщику, и разработчику. Для меня бывает особенно полезно, когда нужно подменить данные с бэка или подебажить приложение. Об установке, настройке и интерфейсе читайте в статье
#tools
Приложение Charles Proxy - большой помощник и тестировщику, и разработчику. Для меня бывает особенно полезно, когда нужно подменить данные с бэка или подебажить приложение. Об установке, настройке и интерфейсе читайте в статье
#tools
👍8
Как устроено приложение Календарь в iPhone
Разбор реализации календаря. Навигация, экраны, Accessibility
#iOS
Разбор реализации календаря. Навигация, экраны, Accessibility
#iOS
👍9👎1
Обзор новых API навигации в SwiftUI
SwiftUI имеет новые API-интерфейсы навигации в iOS 16 и macOS 13 на основе стека и по нескольким столбцам:
👉 NavigationStack состоит из корневого вью, у которого могут быть дополнительные вью, “накладываемые” поверх него, тем самым создавая стек. Обычно используем для приложений, работающих на iPhone
👉 Программная навигация в NavigationStack. Создаем переменную State, содержащую путь навигации, и передаем привязку к ней в NavigationStack
👉 NavigationSplitView. Обычно это боковая панель слева, где пользователь может выбирать элементы, которые будут отображаться в подробном виде справа. Используем для iPad или Mac
👉 NavigationSplitView с тремя колонками
#swiftUI
SwiftUI имеет новые API-интерфейсы навигации в iOS 16 и macOS 13 на основе стека и по нескольким столбцам:
👉 NavigationStack состоит из корневого вью, у которого могут быть дополнительные вью, “накладываемые” поверх него, тем самым создавая стек. Обычно используем для приложений, работающих на iPhone
👉 Программная навигация в NavigationStack. Создаем переменную State, содержащую путь навигации, и передаем привязку к ней в NavigationStack
👉 NavigationSplitView. Обычно это боковая панель слева, где пользователь может выбирать элементы, которые будут отображаться в подробном виде справа. Используем для iPad или Mac
👉 NavigationSplitView с тремя колонками
#swiftUI
👍5👎1
Жизненный цикл UIViewController
Вспомним и закрепим еще раз с наглядной схемой:
👉 init
👉 loadView - создание view
👉 viewDidLoad - viewController создан, Outlets на месте
👉 viewWillAppear - view будет добавлено в иерархию отображения
👉 viewWillLayoutSubViews - каждый раз, когда изменяется frame
👉 viewDidLayoutSubviews - view только что разместило свои subview
👉 viewDidAppear - после того, как ViewController появляется на экране
👉 viewWillDisappear - до того, как viewController будет удален с экрана
👉viewDidDisappear - после удаления viewController'a с экрана
👉 deinit
#ui
Вспомним и закрепим еще раз с наглядной схемой:
👉 init
👉 loadView - создание view
👉 viewDidLoad - viewController создан, Outlets на месте
👉 viewWillAppear - view будет добавлено в иерархию отображения
👉 viewWillLayoutSubViews - каждый раз, когда изменяется frame
👉 viewDidLayoutSubviews - view только что разместило свои subview
👉 viewDidAppear - после того, как ViewController появляется на экране
👉 viewWillDisappear - до того, как viewController будет удален с экрана
👉viewDidDisappear - после удаления viewController'a с экрана
👉 deinit
#ui
🔥19👎2👍1
Bottom sheet: Navigation
В статье описано, как создать полноценную навигацию в рамках bottom sheet отображения, основанного на autolayout, а не на неудобном ручном расчёте высоты. Повторили анимации навигационных переходов. Добавили navigation bar как нативный способ управления навигацией.
#ui
В статье описано, как создать полноценную навигацию в рамках bottom sheet отображения, основанного на autolayout, а не на неудобном ручном расчёте высоты. Повторили анимации навигационных переходов. Добавили navigation bar как нативный способ управления навигацией.
#ui
👍10👎2
Apple ускоряет разработку гарнитуры смешанной реальности
По словам Bloomberg, компания планирует представить гарнитуру уже в следующем году вместе со специальной операционной системой и магазином приложений.
Ожидается, что его первое устройство в этой области будет намного дороже, чем существующие основные конкуренты, и будет включать в себя экраны сверхвысокого разрешения для виртуальной реальности и несколько внешних камер для обработки элементов дополненной реальности. Оно также будет иметь возможности отслеживания рук и работать на процессоре на базе чипа M2 — компонента, представленного в последних компьютерах Mac компании.
#слухи
По словам Bloomberg, компания планирует представить гарнитуру уже в следующем году вместе со специальной операционной системой и магазином приложений.
Ожидается, что его первое устройство в этой области будет намного дороже, чем существующие основные конкуренты, и будет включать в себя экраны сверхвысокого разрешения для виртуальной реальности и несколько внешних камер для обработки элементов дополненной реальности. Оно также будет иметь возможности отслеживания рук и работать на процессоре на базе чипа M2 — компонента, представленного в последних компьютерах Mac компании.
#слухи
🔥7👎2🤔2😱1
Делаем плавный скролл в нагруженных таблицах
Способы оптимизации таблицы, рассмотренные в статье:
👉 Повторное использование ячеек/хедеров и футеров — первый и важный шаг оптимизации
👉 Уменьшить общее время загрузки и вычислений, их перевод в Background-очереди — значит упростить объем подсчетов
👉 Использование стандартных компонентов Core Animation для отрисовки ячеек позволит существенно ускорить процесс отображения и повысить производительность
👉 Кеширование данных для ячеек
👉 Нет ничего плохого в комбинации Auto Layout и ручного подсчета. Там, где не хватает производительности — использовать ручной подсчет
#optimization
Способы оптимизации таблицы, рассмотренные в статье:
👉 Повторное использование ячеек/хедеров и футеров — первый и важный шаг оптимизации
👉 Уменьшить общее время загрузки и вычислений, их перевод в Background-очереди — значит упростить объем подсчетов
👉 Использование стандартных компонентов Core Animation для отрисовки ячеек позволит существенно ускорить процесс отображения и повысить производительность
👉 Кеширование данных для ячеек
👉 Нет ничего плохого в комбинации Auto Layout и ручного подсчета. Там, где не хватает производительности — использовать ручной подсчет
#optimization
👍9❤3👎2🤔1😢1
The Ultimate How-to: Build a Bluetooth Swift App With Hardware in 20 Minutes
👉 Добавляем
👉 Создайте классы
и
👉 Имплементируем протоколы их делегатов CBPeripheralDelegate и CBCentralManagerDelegate
👉 Реализуем основной метод
👉 Дальше через созданный менеджер ищем устройства с помощью метода
👉 Осталось только запомнить найденное устройства в методе
#swift
👉 Добавляем
import CoreBluetooth
👉 Создайте классы
CBCentralManager
, сервис для работы с Bluetooth и
CBPeripheral
для отслеживания работы уже подключеннного устройства, чтобы узнать, что устройство, например, отсоединилось👉 Имплементируем протоколы их делегатов CBPeripheralDelegate и CBCentralManagerDelegate
👉 Реализуем основной метод
func centralManagerDidUpdateState(_ central: CBCentralManager)
чтобы узнать влючен ли Bluetooth на устройстве👉 Дальше через созданный менеджер ищем устройства с помощью метода
scanForPeripheralsWithServices
❗️Не забудьте после найденного результата прекратить поиск с помощью метода stopScan
👉 Осталось только запомнить найденное устройства в методе
centralManagerdidDiscover
и ❗️обязательно сохранить его сильной ссылкой иначе подключение прервется#swift
👍11
How We Centrally Manage UITabBar in Our iOS Apps
(4 мин)
Иногда бывает нужно скрыть UITabBar. Авторы делятся опытом реализации и дают следующие советы по управлению UITabBar:
👉 Единый метод для показа/скрытия UITabBar вместо
👉 Управление показом/скрытием в одном месте.
#ui
(4 мин)
Иногда бывает нужно скрыть UITabBar. Авторы делятся опытом реализации и дают следующие советы по управлению UITabBar:
👉 Единый метод для показа/скрытия UITabBar вместо
hidesBottomBarWhenPushed
, tabbar.isHidden
или tabbar.frame
👉 Управление показом/скрытием в одном месте.
MainTabBarNavigationManager: UINavigationControllerDelegate
и задать его делегатом для всех navigation controller'ов#ui
👍4👎1
Управление загрузками в Xcode
Начиная с Xcode 14, симуляторы для watchOS и tvOS доступны в виде отдельных загрузок. Данное решение позволяет значительно уменьшать размер загрузки приложения, однако теперь вам придется самостоятельно управлять этими большими (3-4 ГБ) компонентами.
Автор сэкономил 32ГБ дискового пространства, подробнее в статье
#optimization
Начиная с Xcode 14, симуляторы для watchOS и tvOS доступны в виде отдельных загрузок. Данное решение позволяет значительно уменьшать размер загрузки приложения, однако теперь вам придется самостоятельно управлять этими большими (3-4 ГБ) компонентами.
Автор сэкономил 32ГБ дискового пространства, подробнее в статье
#optimization
👍5
Советы по отладке при работе над проектами Swift
👉 Настройте свой .lldbinit. Например, чтобы поменять язык или добавить дополнительные возможности к отладчику
👉 Используйте переменные фрейма: frame variable или v для сохраненных свойств вместо po
👉 Наблюдайте за системой. Брейкпоинты могут быть использованы для многих вещей, от изменения входных данных по умолчанию в поля (например, формы входа) до использования команд отладчика для создания цепочек символических брейкпоинтов
👉 Используйте
как брейкпоинт при изменении переменной
#tools
👉 Настройте свой .lldbinit. Например, чтобы поменять язык или добавить дополнительные возможности к отладчику
👉 Используйте переменные фрейма: frame variable или v для сохраненных свойств вместо po
👉 Наблюдайте за системой. Брейкпоинты могут быть использованы для многих вещей, от изменения входных данных по умолчанию в поля (например, формы входа) до использования команд отладчика для создания цепочек символических брейкпоинтов
👉 Используйте
watchpoint set variable self.homeViewController
как брейкпоинт при изменении переменной
#tools
👍8
Как провести эффективное тестирование мобильных приложений? Стратегия пятиуровневой пирамиды тестов
Взяв за основу тестовую пирамиду Мартина Фаулера, авторы создали свой вариант пирамиды, состоящий из 5 уровней. Двигаясь от нижнего к верхнему уровню, все меньше зависимостей должно быть заменено моками и все сильнее растет стоимость реализации теста (вторая картинка).
#testing
Взяв за основу тестовую пирамиду Мартина Фаулера, авторы создали свой вариант пирамиды, состоящий из 5 уровней. Двигаясь от нижнего к верхнему уровню, все меньше зависимостей должно быть заменено моками и все сильнее растет стоимость реализации теста (вторая картинка).
#testing
👍6👎1
Простые метрики по качеству: как их вести и зачем они нужны
👉 Зачем? Это поможет увидеть общую картину того, как обстоят дела с качеством на проекте, и на каком этапе у нас основные проблемы. Кроме того, это может помочь в отслеживании динамики качества, но важно понимать, что качество проекта — это суммарная работа всей команды, а не только QA отдела.
👉 Как? Для того, чтобы вести такую статистику, не нужно много ресурсов — это может сделать один человек, уделяя этой задаче ~1-4 часа в неделю. Однако для того, чтобы увидеть глобальную картину, может потребоваться около полугода, поскольку статистика — это переменная, изменяющаяся во времени.
Примеры метрик: баги после релиза, баги во время регресса
#qa
👉 Зачем? Это поможет увидеть общую картину того, как обстоят дела с качеством на проекте, и на каком этапе у нас основные проблемы. Кроме того, это может помочь в отслеживании динамики качества, но важно понимать, что качество проекта — это суммарная работа всей команды, а не только QA отдела.
👉 Как? Для того, чтобы вести такую статистику, не нужно много ресурсов — это может сделать один человек, уделяя этой задаче ~1-4 часа в неделю. Однако для того, чтобы увидеть глобальную картину, может потребоваться около полугода, поскольку статистика — это переменная, изменяющаяся во времени.
Примеры метрик: баги после релиза, баги во время регресса
#qa
👍6
The Future of Foundation
Новый open source Foundation:
👉 Благодаря нативной реализации Foundation больше не несет затраты на конвертацию между C и Swift, что приводит к повышению производительности
👉 Более мелкие и гранулированные пакеты Foundation. FoundationEssentials предоставит наиболее важные типы без системных зависимостей. FoundationInternationalization для работы с локализованным контентом. Другие пакеты будут продолжать обеспечивать поддержку XML и работу с сетью. Новый пакет FoundationObjCCompatibility будет содержать устаревшие API.
👉 Множественные реализации любого API чреваты различиями в поведении и, в конечном счете, ошибками при перемещении кода между платформами. Новый пакет Foundation будет служить ядром единой канонической реализации, независимо от платформы.
👉 Новый открытый процесс внесения изменений в API Foundation
#swift
Новый open source Foundation:
👉 Благодаря нативной реализации Foundation больше не несет затраты на конвертацию между C и Swift, что приводит к повышению производительности
👉 Более мелкие и гранулированные пакеты Foundation. FoundationEssentials предоставит наиболее важные типы без системных зависимостей. FoundationInternationalization для работы с локализованным контентом. Другие пакеты будут продолжать обеспечивать поддержку XML и работу с сетью. Новый пакет FoundationObjCCompatibility будет содержать устаревшие API.
👉 Множественные реализации любого API чреваты различиями в поведении и, в конечном счете, ошибками при перемещении кода между платформами. Новый пакет Foundation будет служить ядром единой канонической реализации, независимо от платформы.
👉 Новый открытый процесс внесения изменений в API Foundation
#swift
👍7
Не обманывайте себя: вы не «исправите это потом»
Шансы на то, что «костыль» будет исправлен, неуклонно снижаются с течением времени и вот почему:
👉 Преимущества от усовершенствования кода не перевешивают риска что-нибудь испортить
👉 Чем дольше с чем-нибудь живешь, тем сильнее привыкаешь к такому положению вещей
👉 На одной чаше весов исправление, связанное с большими рисками и малыми преимуществами. На другой – что-нибудь из нового, что мы хотели бы реализовать или доработать
👉 Новый код завязан на «плохом» фрагменте и, вероятно, выйдет из строя, если в этом фрагменте что-то изменим
Чаще всего выбор звучит так: «исправить сейчас» или «смириться с тем, что не исправим никогда».
Исходя из этого осознания мы можем точнее расставлять приоритеты и лучше выстроить процессы.
#softskills
Шансы на то, что «костыль» будет исправлен, неуклонно снижаются с течением времени и вот почему:
👉 Преимущества от усовершенствования кода не перевешивают риска что-нибудь испортить
👉 Чем дольше с чем-нибудь живешь, тем сильнее привыкаешь к такому положению вещей
👉 На одной чаше весов исправление, связанное с большими рисками и малыми преимуществами. На другой – что-нибудь из нового, что мы хотели бы реализовать или доработать
👉 Новый код завязан на «плохом» фрагменте и, вероятно, выйдет из строя, если в этом фрагменте что-то изменим
Чаще всего выбор звучит так: «исправить сейчас» или «смириться с тем, что не исправим никогда».
Исходя из этого осознания мы можем точнее расставлять приоритеты и лучше выстроить процессы.
#softskills
👍11👎2
Вышла Lottie 4.0 для iOS с поддержкой Core Animation
Lottie — это кроссплатформенная библиотека Airbnb с открытым исходным кодом для рендеринга векторной анимированной графики.
В Lottie 4.0 значительно улучшена производительность всех анимаций благодаря совершенно новому движку рендеринга на базе Core Animation.
В предыдущих версиях один раз за кадр код выполнялся в основном потоке для продвижения анимации и повторного рендеринга ее содержимого, а значит потреблялось от 5 до 20%+ CPU во время воспроизведения, оставляя меньше циклов процессора доступным для остальной части приложения.
#animation
Lottie — это кроссплатформенная библиотека Airbnb с открытым исходным кодом для рендеринга векторной анимированной графики.
В Lottie 4.0 значительно улучшена производительность всех анимаций благодаря совершенно новому движку рендеринга на базе Core Animation.
В предыдущих версиях один раз за кадр код выполнялся в основном потоке для продвижения анимации и повторного рендеринга ее содержимого, а значит потреблялось от 5 до 20%+ CPU во время воспроизведения, оставляя меньше циклов процессора доступным для остальной части приложения.
#animation
🔥11👍1👎1
Apple to Allow Outside App Stores in Overhaul Spurred by EU Laws
Apple может разрешить сторонние магазины приложений для iPhone и iPad для соблюдения требований Евросоюза.
Важно отметить, что эти изменения коснутся только Европы, однако могут быть распространены на другие страны при принятии аналогичных законов.
#слухи
Apple может разрешить сторонние магазины приложений для iPhone и iPad для соблюдения требований Евросоюза.
Важно отметить, что эти изменения коснутся только Европы, однако могут быть распространены на другие страны при принятии аналогичных законов.
#слухи
🔥11👎5
Coordinator pattern with Tab Bar Controller
Как настроить навигацию в iOS приложении, где есть различные флоу и UITabBarController?
👉 Создаем AppCoordinator - это главный координатор приложения. Он должен быть строго один❗️
👉 AppCoordinator будет открывать и хранить в childCoordinators основные флоу. Например, Login и TabBar
👉 Каждый последующий флоу может иметь собственный координатор, открывать новые флоу и сохранять их в свои childCoordinators
👉 Каждый координатор в методе start() открывает новый флоу на родительском, а в методе finish() - закрывает и говорит родительскому координатору взять на себя управление после закрытия
👉 TabBarCoordinator открывает несколько флоу одновременно для каждого таба и умеет переключать эти табы
#ui
Как настроить навигацию в iOS приложении, где есть различные флоу и UITabBarController?
👉 Создаем AppCoordinator - это главный координатор приложения. Он должен быть строго один❗️
👉 AppCoordinator будет открывать и хранить в childCoordinators основные флоу. Например, Login и TabBar
👉 Каждый последующий флоу может иметь собственный координатор, открывать новые флоу и сохранять их в свои childCoordinators
👉 Каждый координатор в методе start() открывает новый флоу на родительском, а в методе finish() - закрывает и говорит родительскому координатору взять на себя управление после закрытия
👉 TabBarCoordinator открывает несколько флоу одновременно для каждого таба и умеет переключать эти табы
#ui
❤12
This media is not supported in your browser
VIEW IN TELEGRAM
clipped() не оказывает влияния на проверку касаний
Модификатор clipped() в SwiftUI обрезает вью до своих(модификатора) границ, скрывая все, что выходит за пределы этих границ. Но обратите внимание, что обрезание не влияет на проверку касаний (hit testing); обрезанный вью по-прежнему принимает тапы / клики за пределами видимой области.
#ui
Модификатор clipped() в SwiftUI обрезает вью до своих(модификатора) границ, скрывая все, что выходит за пределы этих границ. Но обратите внимание, что обрезание не влияет на проверку касаний (hit testing); обрезанный вью по-прежнему принимает тапы / клики за пределами видимой области.
#ui
👍8👎2