Обновить
256K+

iOS *

Мобильная ОС компании Apple

110,97
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

XCUI, Tests & Robots. Разбираем нативную автоматизацию iOS на винтики. Часть 1

Уровень сложностиПростой
Время на прочтение29 мин
Охват и читатели4.9K

Привет, Хабр! На связи снова Максим из ATI.SU.

В прошлых статьях мы разобрались, как искать логи и креш‑отчёты на iOS‑устройствах — и делали это вручную. Этот навык остаётся базовым на проекте любого размера: без него невозможно понять причину сбоя. Но есть и вторая часть работы — сами проверки, то есть прогон пользовательских сценариев. Пока приложение небольшое, их можно прокликивать руками. По мере роста количество однотипных проверок увеличивается, и повторять их вручную перед каждым релизом становится всё дороже.

Возникает логичный вопрос: можно ли автоматизировать именно эту рутину — прогон сценариев, — чтобы проверки проходили без нашего участия, а нам оставалось разбираться с причинами сбоев, если такие возникнут? Здесь нам помогут нативные автотесты на XCUITest. Они позволяют системно, а не от случая к случаю, прогонять пользовательские сценарии, отслеживать падения и проверять стабильность. А когда тест краснеет, в дело снова вступают логи и креш‑отчёты — те самые, что мы научились искать в предыдущих статьях.

Этой статьёй мы открываем цикл о UI‑тестировании iOS приложений. Начнём с основ: разберёмся, какое место UI‑тесты занимают в пирамиде тестирования, познакомимся с инструментами и постепенно перейдём к построению устойчивых тестов с применением проверенных паттернов.

Отвёртки на изготовку!

Новости

Лента роликов на iOS: опыт работы с AVPlayer

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели6K

Привет, Хабр! На связи Дмитрий Андриянов, iOS-разработчик команды Медиа Платформы в Т-Банке. Одна из наших ключевых задач — разработка видеоплеера для стриминговых видео, в том числе для приложения T-Инвестиций, где есть лента тематических роликов и обучающие видео в Академии.

В T-Инвестициях на iOS лента коротких роликов — это 90% трафика, именно ее оптимизации мы уделяем больше всего внимания. В первой версии пользователи могли ждать старта видео больше 15 секунд. Мы разобрались в ограничениях AVPlayer, оптимизировали буферизацию и снизили задержки на 12% в хвосте распределения. Рассказываю, как мы улучшали пользовательский опыт и почему AVPlayer не лучшее решение для ленты роликов.

Читать далее

Мобильная разработка за неделю #636 (22 — 28 июня)

Время на прочтение4 мин
Охват и читатели8.3K

В этом выпуске хардкорная агентская разработка под iOS и Preview-Driven скриншот тестирование для Android, кольца-расстояния и инерция пальца, пять ошибок начинающих Android‑разработчиков и пять ошибок при работе с Jetpack Compose, динамические иконки приложения на Flutter, ручной DI в Kotlin Multiplatform, расширенные возможности оплаты и низкие комиссии в Google Play, и многое другое. Заходите!

Читать далее

Тап по тысяче точек за O(log n): QuadTree и сферическая геометрия в гео-соцсети

Время на прочтение8 мин
Охват и читатели7K

9 лет назад я разрабатывал геолокационную соц.сеть на заказ, где мы отображали чаты на карте. До релиза не дошло, но интересного опыта было получено много. В очередной статье из серии рассказываю про то, как обрабатывать нажатия на MapBox и любой другой карте (Google, Yandex – не важно) и находить нужные объекты на ней, привязанные к координатам.

Читать далее

«Люди вокруг» на SpriteKit: кольца-расстояния, инерция пальцем и виртуализация аватаров

Время на прочтение6 мин
Охват и читатели5.2K

Продолжение истории про проект геолокационной соцсети: “как мы людей в круги расставляли”. Рассказываю о том, как можно красиво отобразить пользователей, которые рядом с вами на карте, чуть менее тривиальным образом с помощью SpriteKit

Читать далее

Хардкорная агентская разработка под iOS, часть 1: отдельный Mac Mini для агентов

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели6.9K

Агентская разработка развивается семимильными шагами. Но не всё идёт так радужно, как хотелось бы. Например, ИИ-агенты по умолчанию заваливают разработчика вопросами: а можно я сделаю вот так? а если скриптик написать? а можно я на гитхаб схожу? а можно я соседний проект гляну?

Это приводит к consent fatigue — я не раз ловил себя на мысли, что я уже давно только и делаю, что жму “allow”, “allow everytime”, редко вникая в суть того, что спрашивает агент, но полностью доверить агенту делать всё, что ему заблагорассудится, мне как-то боязно. Всё-таки на основном макбуке много личных и рабочих данных, которые агент может случайно (или через prompt injection) удалить или слить в сеть. Стрёмно. Поэтому я какое-то время играл в игру “я типа читаю, что ты у меня спрашиваешь”.

Хотя правильное решение — запуск агента в режиме YOLO (в случае claude — с флагом --dangerously-skip-permissions). И тогда при правильной постановке задачи агент может часами сам работать и делать то, что нужно, уведомляя меня только по выполнении.

Это первая статья цикла. Здесь — базовая настройка Mac Mini и вся возня с SSH, чтобы YOLO-агент работал на отдельной машине без ручного ввода паролей и переживал разрывы сети. Специфику iOS-разработки (git worktree, параллельное тестирование, idb, прогон приложения, грабли симулятора и прочее) я вынес в следующие части, так что статья будет полезна не только iOS-разработчикам, но и всем, кто хочет запускать YOLO-агентов и не париться о безопасности. С некоторыми оговорками, разумеется, подробности ниже.

Читать далее

Opaque types vs Existential Types vs Generics

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели6.4K

Привет! Сегодня хочу поделиться, как мне кажется, очень полезной информацией о такой важной теме, как Opaque types vs Existensial Types vs Generics — что это такое, в чем разница и что выбрать. Я действительно считаю эту тему важной, поскольку это мощнейшие инструменты, которые нам дает swift, чтобы сделать код более гибким, поддерживаемым, универсальным и без лишнего дублирования. Итак, погнали. 

Читать далее

Чем является ваша работа сегодня?

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели6.3K

В декабре 2025 года многие ведущие инженеры мира все-таки высказались вслух о том, о чём боялись даже думать: «Кажется, LLM пишет код лучше меня».

Фархан Тавар, руководитель инженерного направления Shopify (3000 инженеров, 10% мирового e-commerce), рассказал, как они к этому готовились — и что делать дальше. Спойлер: сокращать команду они не только не собираются, но и наняли уже 1000 интернов. Но обо всем – в статье

Понять, кто я теперь

Что такое Apple Declarative Device Management?

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели7.3K

В рамках WWDC 2026, а если быть точнее, то в ролике What’s new in managing Apple devices, инженер Device Management team, Cyrus Daboo, заявляет о том, что "Declarative Device Management уже здесь" и используется в продакшене для управления парками корпоративных устройств Apple по всему миру.

Что касается классического MDM, то ранее компания Apple уже обозначала некоторые команды MDM как Deprecated, например, ScheduleOSUpdate, которая отвечает за установку обновлений macOS. Информацию об этой команде уже не найти на сайте Apple Developer | Device Management , но она все еще присутствует в репозитории Device management schema data for MDM на Github Apple. В следующей macOS 27 Golden Gate эта команда точно не будет работать, и без функционала DDM установить обновления "тихо и незаметно" не получится. В системе пока еще присутствует терминальная команда softwareupdate, но там есть нюансы, о которых можно прочитать в одной из статей, опубликованной в корпоративном блоге Ринго на Хабре.

Так что же такое DDM?

Как нарисовать тысячи объектов на карте и не убить FPS: эволюция рендера на Mapbox GL

Время на прочтение7 мин
Охват и читатели8.2K

Когда-то давно я разрабатывал геолокационную соцсеть, где на карте живут «облака» — посты, привязанные к точке. И этих облаков на экране могло быть очень и очень много. Наивный подход «одно облако = одна аннотация-UIView» упирается в потолок уже на десятках точек: карта превращается в слайд-шоу. Здесь история о том, как я пять раз упёрся в производительность и в итоге переехал на GL-слои с data-driven выражениями: три движка рендера на разных зумах, круги постоянного реального размера в метрах через metersPerPixel, а вся zoom-зависимость считается на GPU. И отдельно — как анимировать прозрачность GL-слоя, у которого вообще нет анимируемого свойства

Читать далее

Realtime-чат без WebSocket: long-polling, гонки переподключения и дубли пушей

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели7.6K

Бывает, что realtime на проекте уже нужен, а WebSocket по каким-то причинам нет. Остаётся long-polling: клиент шлёт «бесконечный» HTTP-запрос, сервер держит его, пока не появятся новые сообщения, отвечает - и клиент тут же открывает следующий. Звучит просто, ровно до первого запуска на живом устройстве где-нибудь в метро. Дальше начинается то, ради чего и написана статья: гонки при переподключении, дубли локальных пушей и два независимых потока сообщений в одном ответе. Разбираю на примере реального iOS-сервиса, который я разрабатывал более 5 лет

Читать далее

Backend-Driven UI для умного дома: как обучить сервер верстать интерфейсы

Время на прочтение10 мин
Охват и читатели7.1K

Привет, Хабр! 

Я Дмитрий, iOS-разработчик из команды Салют — мы делаем устройства и программное обеспечение для Умного дома Сбер. У нас много собственных устройств и ещё больше устройств брендов-партнёров, которые поддерживает платформа. Релизный круговорот фичей и интеграций заставляет думать: как оптимизировать процесс доставки новых функций пользователям?

В статье расскажу про опыт разработки, внедрения и поддержки нашей собственной backend-driven UI парадигмы (BDUI) — подхода, в котором сервер управляет не только данными, но и вёрсткой интерфейсов.

Читать далее

Мобильная разработка за неделю #635 (15 — 21 июня)

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели8.4K

В новом дайджесте вопросы доступного пространства в условиях ненадежного поведения horizontalSizeClass и выход Android 17, гид в смешанной реальности с использованием Android XR и живой космос на Metal, иерархия корутин в Android, приложение с расписанием автобусов, скам сети с подписками, домашний сервер с Qwen Code за 25к и многое другое. Подключайтесь!

Читать далее

Ближайшие события

Свой NavigationBar на iOS: large title, поиск и списки на Texture

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели6.5K

Разбор того, как отказаться от системного UINavigationBar и собрать собственный навигационный бар на обычном UIView: с коллапсирующим large title как у Apple, встроенной строкой поиска и произвольными панелями под заголовком — и так, чтобы он работал и с UITableView, и со списками на Texture (AsyncDisplayKit). Внутри — устройство компонента и честный разбор компромиссов из реального продакшена.

Читать далее

Нетривиальные анимации в мире iOS-разработки

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели5.7K

Для простых анимаций хватает UIView.animate и CABasicAnimation, но для сложных синхронных цепочек этого мало. Разбираю, почему Timer на 1/60 секунды рвёт анимацию под нагрузкой, и как CADisplayLink решает это, синхронизируясь с реальным обновлением экрана. Показываю свой DisplayLinkAnimator: строго согласованные констрейнты нескольких view, кастомные timing-функции и многоточечные кривые Безье (которых не даёт CAMediaTimingFunction), пауза и возобновление — с примерами кода.

Читать далее

«Это уже тысячу раз делали»: как мы добавили медиаленту в Яндекс Еду для iOS. А потом переделали

Время на прочтение27 мин
Охват и читатели9K

На первый взгляд, медиалента в мобильном приложении выглядит как стандартная задача: список карточек, автоплей, предзагрузка соседних роликов, несколько состояний загрузки. На практике это оказался один из самых сложных iOS‑компонентов, с которыми мне доводилось работать.

Проблема в том, что медиалента — это не один виджет и не просто плеер внутри ячейки. Это система, которая живёт на пересечении сразу нескольких тяжёлых доменов: динамически собираемый интерфейс, сетевые ограничения, декодирование медиа, менеджмент памяти, жизненный цикл вложенных контейнеров, UX‑требования к мгновенному старту, интеграция в чужие экраны и такие сложные системы, как BDUI, рекомендации, пагинации, и при этом — высокий трафик на массовом сценарии. 

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

Самое интересное в таких задачах начинается не на этапе «как добавить медиаленту», а на этапе ограничений и деградаций. В статье я разберу именно эту сторону задачи на примере приложения Яндекс Еды: как мы проектировали медиаленту, какие архитектурные решения не сработали, какие баги всплыли только на реальных данных, как мы строили observability для дебага и какие компромиссы в итоге оказались эффективнее красивой реализации.

Читать далее

Живой космос на Metal: как я переписывал фон мобильной игры и поднимал FPS с 20 до 120

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели6.3K

В мобильной разработке мы привыкли, что красивый анимированный фон — это либо видео, либо пара слоёв с CAGradientLayer и медленным параллаксом. Для большинства задач этого хватает. Но иногда хочется большего: настоящий живой космос — туманности, которые медленно перетекают друг в друга, планеты с кольцами, звёзды разных классов и в центре — чёрная дыра с аккреционным диском, как в «Интерстелларе».

У меня есть небольшая аркада-раннер про полёт сквозь космос. Фон там — не картинка, а процедурная сцена, которую целиком рисует фрагментный шейдер: каждый пиксель экрана вычисляется математикой из шума. Сначала всё это жило на SpriteKit, а потом я переписал на Metal — и вот тут началось самое интересное, потому что красивая сцена на десктопе и та же сцена на телефоне — это две очень разные истории.

Расскажу, как я это делал, на какие грабли наступил, и почему в итоге пришлось рисовать фон… полосками.

Читать далее

Пишем кодинг‑агента на Swift с нуля: неочевидные сложности очевидной идеи

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели5.9K

Я долго пользовался разными кодинг‑агентами, и на их фоне Claude Code для меня заметно выделялся: качеством решений, удобством работы и вниманием к деталям. В какой‑то момент мне захотелось не просто пользоваться таким инструментом, а понять, что на самом деле происходит у него под капотом. Так я сел писать собственного агента на Swift, с нуля, без использования готовых решений.

Довольно быстро стало понятно, что сложность не в том, чтобы вызвать модель и попросить ее сгенерировать код. Настоящая сложность начинается там, где система должна стабильно работать: удерживать контекст, пользоваться инструментами, справляться с ошибками и непредсказуемыми ответами модели. На обвязку вокруг модели и уходит почти все время.

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

Читать далее

LLM на iPhone: от llama.cpp до Foundation Models

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели9.7K

В 2025 году вместе с iOS 26 компания Apple представила разработчикам Apple Foundation Models. Теперь порог входа для on-device AI упал до нескольких строк, и далее в статье мы рассмотрим как он выглядит. 

А в январе 2026 года Apple заключила сделку с Google в рамках которой следующее поколение Apple foudation models будет основано на технологии Google Gemini. По данным Bloomberg стоимость этой сделки составляет 1 млрд долларов в год. Apple по-прежнему держит контроль над пользовательскими данными, запросы будут выполняться локально, что-то сложное, с чем не может справиться локальная модель - будет отправляться в облако Apple Private Cloud Compute. 

Читать далее

Мобильная разработка за неделю #634 (8 — 14 июня)

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели8.8K

В этом выпуске новинки WWDC26 - обновления в UIKit и SwiftUI, App Store, Xcode и Foundation Models. Кроме того, SMTP с нуля на сокетах и исследования RuStore, оптимизация Adapter и миграция навигации на Compose, один файл CLAUDE.md из 4 простых правил, который получил виральное распространение, мобильный рынок Ближнего Востока и многое другое. Заходите!

Читать далее
1
23 ...