Telegram Web Link
Подборка крупных iOS-приложений с открытым кодом

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

Несмотря на это, некоторые по-настоящему масштабные проекты всё-таки выкладывают код. И это неплохой способ улучшить свои навыки (чтения кода, выбора архитектуры, поиска ответов на непростые вопросы).

Вот несколько приложений в опенсорсе:

1️⃣ ProtonMail — популярный почтовый клиент для зашифрованных писем.

2️⃣ Signal — если вам нужно реализовать в своем приложении какие-то фичи для чата, этот проект может стать отличным источником вдохновения.

3️⃣ VLC — едва ли не самый популярный кроссплатформенный медиаплеер с открытым исходным кодом.

4️⃣ Kickstarter — платформа для краудфандинговых проектов.
В этом приложении сделан выбор в пользу функционального подхода к программированию, который поддерживается за счет внедрения нескольких кастомных операторов.
Возможно, вам будет интересно, как такой подход сработает на примере настолько масштабного приложения.

5️⃣ Telegram iOS — далеко не всегда очевидные подходы (и иногда сложночитаемые), но при этом сложно отрицать, что телеграм остаётся невероятно быстрым при большой нагрузке. А ещё здесь можно вдохновиться эффектами и решениями сложнейших задач.

Впрочем, это можно сделать ещё и в базе знаний и в боте.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
В Apple удалили 118 000 аккаунтов разработчиков

📎 В большом отчёте Apple опубликовали целый ряд интересных статистических фактов.

🛑 За 2023 год более 100к аккаунтов были закрыты, при этом 91 000 соглашений были отклонены по причине мошенничества.

👨‍💻 Команда App Review (более 500 сотрудников) просматривает около 132 500 приложений в неделю, при этом 192 000 разработчиков впервые выпустили хотя бы один продукт за прошлый год.

😑 Каждый 10-й отзыв в сторе оказался фейковым (было удалено более 100 миллионов рейтингов из миллиарда).

Также за последние 4 года в Apple остановили потенциально мошеннические операции на сумму более $7 млрд (заблокировали 14 миллионов украденных кредитных карт).

В канале я рассматривал пару лет назад частые причины реджектов (кстати, некоторые, как например покупки на сторонних сайтах, уже не так актуальны).

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
DispatchQueue: практические вопросы

📖 Если вы давно читаете канал, то наверняка знаете про отличную подборку для того, чтобы познакомиться с аспектами, возможно, одной из самых сложных тем в разработке.

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

В iOS IQ я добавил новый раздел, в котором постарался раскрыть тему от простых задачек к более сложным (в конце даже есть со звёздочкой).

Заодно можно проверить и знания и по Dispatch Barrier.

Обновление уже доступно через бот (я бы рекомендовал этот способ) и на бусти.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Доступен ресурс со списком всех сессий WWDC

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

📖 На этом сайте перечислены все WWDC с информацией о 3428 сессиях с 2000 по 2023 год, а также различных технических докладах. Доступно и в JSON.

🔗 Кстати, на гитхабе есть альтернативный источник.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Как правильно сделать выбор между Set и Array в Swift?

🔑 Коллекции — ключевой компонент любого языка программирования.

Безусловно, в подаввляющем большинстве ситуаций мы используем Array или Set, но есть и другие виды коллекций (да взять бы даже ArraySlice, который отностися к части массива).

📖 В этой статье рассмотрены особенности Set и Array, ключевые характеристики каждого из них и кейсы использования (а также вопросы производительности).

А вот здесь можно ознакомиться не только с базовыми, но и с продвинутыми способами использования массивов.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Как измерить производительность с помощью инструментов и os_signposts

⚙️ Инструменты помогают нам не только измерять объём памяти или нагрузку на процессор, но также играют решающую роль в выявлении узких мест.

Одна из полезных функций инструментов — возможность добавлять в код указатели (signposts) для определения нужных областей при трассировке. Это особенно полезно, когда у нас много похожих вызовов, и нам нужно измерить время, затраченное на конкретную операцию.

📖 В этой статье можно посмотреть на пример использованиях таких указателей.

Полезно будет напомнить и про:

🔗 ETTrace — опенсорсный инструмент для измерения производительности.
🔗 Способы измерения производительности Swift-кода.
🔗 Продвинутые трюки lldb для Swift.

А в ноушне есть дополнительные источники для улучшения арсенала наших инструментов:

➡️Поиск и устранение retain cycle.
➡️Советы по повышению производительности.
➡️Как улучшить отклик приложения: советы инженеров Apple.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Как избежать распространенных ошибок при переходе с UIKit на SwiftUI

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

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

📖 В этой статье показан пример рефакторинга SwiftUI. Также в процесе разбираются ошибки, которые допускают разработчики, уже привыкнувшие к UIKit.

О других важных подходах при разработке можно прочитать вот тут.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Паттерн «Репозиторий» в Swift: разбор и примеры кода

🐱 Шаблон проектирования «Репозиторий» действует как промежуточный уровень между бизнес-логикой приложения и хранилищем данных.

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

При этом можно взаимодействовать с данными, не зная, хранятся ли они в памяти или где-то ещё (у нас может быть и Core Data, и Realm, и кейчейн, да хоть отдельный файл в tmp).

Это создает четкое разделение задач и значительно упрощает тестирование.

Например, мы можем юзать резервное хранилище в памяти для тестов (при использовании Core Data в проде).

Также сам уровень данных будет гораздо более гибким, поскольку появляется возможность заменить используемое хранилище данных без необходимости изменения кода приложения на уровне реализации.

Делюсь двумя вариантами применения паттерна:

📖 Шаблон с примерами кода.
📖 Core Data + Repository pattern. Детали реализации.

🍏 А на бусти можно познакомиться с двумя большими разделами по паттернам:

🔗 Структурные паттерны проектирования.

🔗 Порождающие паттерны проектирования (с примерами на Swift).

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Реализация навигации в SwiftUI с помощью NavigationPath и NavigationDestination

🗺 Вообще, одной из основных проблем в SwiftUI была как раз навигация.

До появления NavigationPath существовали некоторые способы решения этой проблемы, но не слишком удобные.

📖 В этом посте рассматриваются особенности NavigationPath (доступной с iOS 16), принципы работы и отличия от UINavigationController в UIKit.

Некоторое время назад я обновлял таргет для Apple Watch в одном из своих приложений, как раз применяя это сочетание.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉 У меня День Рождения

[-Onone]

Быть профессионалом, безусловно, важно. Желание, а вместе с ним и стремление смотреть вглубь — необходимое качество не только на нашей работе, но и в жизни.
Без оптимизации источников за кажущейся ширмой лёгкого контента часто скрываются киллеры времени.

[-Osize]

В нашем канале я продолжаю делать акцент на технической составляющей, а не на видео из тик-тока или других филлерах личного пространства.
В первую очередь, я разработчик, и только затем — автор канала. Я не распыляюсь на суждения о других блогах и едва ли употребляю слово "самый" чаще, чем это необходимо по причине контрпродуктивности. Нужна ли агрессивная оптимизация?

[-O]

Иногда приоритет нужно отдать производительности вместо общения в чате. Это может быть непростым выбором, но на дистанции это принесёт свои результаты.

🐾 Спасибо вам за вашу оценку постов, комментарии и за то, что вы здесь.

⬇️One more thing (in progress...).
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему загрузка пакетов с помощью Swift Package Manager занимает слишком много времени?

Когда мы добавляем зависимость в проект через spm, он извлекает весь репозиторий пакета со всеми ветками и полную историю git, которая может представлять собой годы git-снапшотов.

Суть проблемы тут.

Но почему?

На вопрос ответил инженер по инфраструктуре GitHub (обратите внимание на дату комментария), схожая проблема была и в Cocoapods:

Поверхностное клонирование по какой-то причине обходится намного дороже, чем клонирование всего репозитория. К тому же GitHub ограничивает скорость в таких репах, что приводит к значительному увеличению времени.

Хуже того, фетч может вообще завершиться ошибкой по таймауту.

Так в чем же заключается решение?

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

Например airbnb/lottie применила этот подход и уменьшила размер своего репозитория с +300 МБ до менее 500 КБ!

Signal сделал то же самое: отсюда OneSignal-iOS-SDK пришли к оптимизированной версии OneSignal-XCFramework.

📖 Про другой интересный кейс можно прочитать на хабре.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Что означает spacing = nil в SwiftUI?

Понимание принципов Spacing важно при работе со сложной версткой, а владение определенными техниками может помочь добиться эффектов, которые сложно реализовать традиционными методами.

Как можно видеть на гифке, когда используется nil, расстояние между Text и соседними элементами больше не равны.

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

При установке nil расстояние должно быть дефолтным по умолчанию для каждой пары subviews.

Но, как оказывается, это значение не фиксировано.

📖 В этой статье объясняется, что на самом деле означает значение nil по умолчанию для параметра Spacing.

Кроме того, рассматриваются и другие аспекты, связанные с этим свойством.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Подготовка к собеседованиям: Swift Concurrency

Подготовил вопросы, которые помогут новичкам и опытным разработчикам, знакомым с концепциями параллелизма и заинтересованным в изучении синтаксиса и API Swift Concurrency.

Можно узнать что-то новое о приоритетах, выполнении нескольких задач одновременно и многом другом. Задачи постарался по максимуму покрыть примерами с кодом. Некоторые из вопросов уже добавлены в приложение.

Доступ можно получить здесь или тут сразу на год.

Больше важных тем:
🔗 Блок вопросов: многопоточность (и бонус)
🔗 Собеседования: вопросы на понимание кода
🔗 DispatchQueue: практические вопросы

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Как сделать иконку приложения анимированной?

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

Bryce Bostwick, разработчик, знакомый по великолепным постам о реверс-инжиниринге, попробовал покопать глубже, и написал большое исследование о том, как создать иллюзию анимации (на самом деле для этого нужно достаточно часто менять эти иконки).

📖 Почитать увлекательную статью можно здесь (и рекомендую посмотреть остальные статьи блога).

📺 В формате видео вот тут.

🛠 Демо-проект (посмотреть и попробовать повторить) доступен на github. Напоминаю про этот пост, если захотите выложить в стор.

Больше крутых эффектов можно увидеть здесь или тут.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Объяснение использования @preconcurrency в Swift

Если включить -strict-concurrency для своих существующих проектов, то, вероятнее всего, при первой компиляции проекта Xcode выдаст множество предупреждений и/или ошибок.

Этого можно избежать с использованием @preconcurrency, можно использовать для:

📼 functions
📼 types
📼 protocols
📼 imports

С помощью @preconcurrency появляется возможность импортировать старые модули в новый код.

Это отличный способ начать постепенно внедрять строгий параллелизм по мере приближения выпуска Swift 6.

📖 В этом посте рассмотрены примеры использования и ошибки, которые могут встретиться.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Настраиваемая кнопка с разными состояниями в SwiftUI

Конечно, задача мобильных разработчиков далеко не только в покраске кнопок, но знать несколько подходов и обладать арсеналом таких навыков необходимо.

SwiftUI в несколько раз упрощает создание переиспользуемой кнопки (и добавление конфигов).

📖 Вот тут можно увидеть подходы к созданию такого элемента на реальных примерах.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Протоколы в iOS: назначение и примеры

Даже при частом использовании протоколов начинающие разработчики могут не знать все особенности.

Например, Identifiable постоянно нужен в SwiftUI, но почему он обычно применяется для списков? Или CustomStringConvertible, который вполне подойдёт для более удобного дебага наших моделей.

📖 В этой статье разбираются популярные протоколы на примерах кода.

🧠 Ах да, кстати, приложение уже в тестфлайте и вы можете получить ранний доступ.

Кстати, проголосовавшие в опросе будут приятно удивлены списку тем внутри.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
2024/09/27 13:19:36
Back to Top
HTML Embed Code: