iOS Dev
7.72K subscribers
1K photos
84 videos
1 file
1.16K links
🍏Канал об iOS-разработке, необычных подходах и решениях.
👨‍💻Автор: Виктор Грушевский (@Viktorianec)
Темы:
⭐️ Подготовка к собеседованиям.
⭐️ Архитектуры и алгоритмы.
⭐️ Код. Много кода.

⚒️База знаний: https://boosty.to/ios_dev

#ios #mobile #swift
加入频道
💸Динамика зарплат разработчиков в первой половине 2024 года

🤩 Зарплаты разработчиков на Objective-С продолжают оставаться самыми высокими в этом исследовании (несмотря на снижение до 342 000 ₽), далее идут разработчики на Elixir и Scala.

🔼 В целом, зарплаты выросли почти по всем языкам программирования. У Swift весьма существенный рост, аж на +11% (272 000 ₽).

По компаниям: самой щедрой компанией считается Авито — медиана 351 000 ₽. Также в пятерке лидеров — Райффайзенбанк, Холдинг Т1, Иннотех и VK.

🔗 Вся статистика доступна на хабре.

💰 Сравнить динамику можно с этим постом.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
21🔥11👍8👌2🎄2❤‍🔥1
Вышло мощнейшее интервью с Крисом Латтнером

Такие видео появляются крайне редко. Поэтому если у вас найдется время, обязательно постарайтесь взглянуть на диалог с создателем Swift, LLVM, Clang и других продуктов.

Интересно, что Крис отвечает не только на очевидные вопросы, но и делится инсайдами, а также рассказывает, как проект из потенциально интересного лишь паре сотен человек с 2010 до 2016 года прошел огромный путь и стал опенсорсным. Кстати, затрагиваются и интересные моменты, когда приходилось рассказывать профессионалам с годами опыта на Objective-C о преимуществах нового языка и какие сложности были на этом пути.

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

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥2612👍7🤩4💯33🔥21🆒1
Как решить проблему missing package product

🔨 Один из самых неприятных багов в Xcode возникает, когда случайно удаляется файл Package.resolved, что и приводит к ошибке missing package product.

Это возможно, например, при изменении веток в гите, а в зависимости от размера проекта — таких ошибок могут быть десятки (иногда даже сотни).

Большинство возможных решений на форумах сводятся к магической комбинации очистки проекта (cmd-shift-K), удаления DerivedData/, или использования File > Packages > Reset Package Caches (или закрытия и повторного открытия Xcode).

📖 Все это занимает время, но Джесси Сквайрс советует проверить настройки git, или даже автоматизировать это с помощью Makefile.

📖 Напомню, что в канале есть разбор того, почему загрузка пакетов с помощью Swift Package Manager занимает слишком много времени.

А про основы Git для iOS-разработчиков можно почитать вот тут.

И, конечно, подписывайтесь на iOS IQ — там ещё больше полезного контента.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍6🔥2👏2🎅2🎄211
Миграция проекта на Swift 6: неполное руководство

Наверняка, многие проходили несколько итераций апгрейда кодовой базы (кто-то даже с Objective-C, и до сих пор какой-то процент кода может быть написан на нём и в ваших текущих проектах).

Задача миграции всегда стоит особняком, это кропотливая, тяжёлая и совсем не быстрая работа, а одна из сложностей при оптимизации — показать ценность для бизнеса. Бывает непросто объяснить, почему нам нужно что-то менять, если и так всё работает. Но иногда это просто необходимо.

Конечно, при переходе на Swift 6 могут быть проблемы, да и что говорить, часто мы не всё можем контролить напрямую (те же зависимости CocoaPods или SPM), поэтому приходится искать варианты.

📖 В этом материале есть ответы на вопросы, возникающие при миграции, разбор ошибок и даже описание багов в самом Swift.

📖 А шаги, которые можно предпринять уже сейчас — описаны в этом посте.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍8🔥4💯21🎉1👌1🆒11
Способы проверки доступности новой версии приложения в AppStore

У многих пользователей может быть выключена опция автообновления, но часто нам необходимо как-то сообщить, что наше приложение пора обновлять. Что делать?

Пол Пиелла делится двумя популярными способами в своей статье:

1. Использовать iTunes Lookup:
Вариант, который можно использовать не только для получения версии, но и для других параметров.

import Foundation

struct LookUpResponse: Decodable {
let results: [LookUpResult]

struct LookUpResult: Decodable {
let version: String
let minimumOsVersion: String
let trackViewUrl: URL
}
}

struct LatestAppStoreVersion {
let version: String
let minimumOsVersion: String
let upgradeURL: URL
}

final class LookUpAPI {
private let session: URLSession
private let jsonDecoder: JSONDecoder

init(session: URLSession = .shared, jsonDecoder: JSONDecoder = .init()) {
self.session = session
self.jsonDecoder = jsonDecoder
}

func getLatestAvailableVersion(for appID: String) async throws -> LatestAppStoreVersion? {
let url = URL(string: "https://itunes.apple.com/lookup?appId=\(appID)")!
let request = URLRequest(url: url)
let (data, _) = try await session.data(for: request)
let response = try jsonDecoder.decode(LookUpResponse.self, from: data)

print(response)

return response.results.first.map {
.init(version: $0.version,
minimumOsVersion: $0.minimumOsVersion,
upgradeURL: $0.trackViewUrl)
}
}
}


2. Использовать App Store Connect API

Можно использовать свою обёртку или использовать SDK, которую, например, я применил для Starly.

3. От себя бы я добавил, что весьма популярный способ — держать файл с обновлениями где-то ещё (или иметь собственное API для запроса актуальной версии в сторе).

4. Можно использовать ещё Firebase Remote Config (по сути повторение третьего способа, просто от Google).

После того, как мы получим данные приложения, сравнить новую версию можно с локальной:

extension LatestAppStoreVersion {
var shouldUpdate: Bool {
guard let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else {
return false
}
let systemVersion = ProcessInfo().operatingSystemVersion
let versionString = "\(systemVersion.majorVersion).\(systemVersion.minorVersion).\(systemVersion.patchVersion)"

let isRemoteVersionHigherThanLocal = currentVersion.compare(self.version, options: .numeric) == .orderedAscending
let isSystemVersionAllowed = versionString.compare(self.minimumOsVersion, options: .numeric) == .orderedDescending

return isRemoteVersionHigherThanLocal && isSystemVersionAllowed
}
}


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

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍10🔥62👏2👌1🏆1🎄1🆒1
Компилятор Swift: архитектура, оптимизации, флаги, ресурсы

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

Я уже писал небольшую статью с разбором. Пришло время расширить её вопросами и дополнить другими важными источниками.

Доступ уже можно получить на бусти и в телеграм-боте (можно даже на год).

🧠 Что вы получите, подписавшись сегодня:
➡️Вопросы на чтение кода
➡️Многопоточность
➡️DispatchQueue: практические вопросы
➡️Swift Concurrency
➡️Алгоритмы: терминология и примеры
➡️Память: ARC, side table, флаги, утечки
А также доступ в закрытый чат, ранние релизы приложения iOS IQ, тонну теории и многое другое.


Кстати, на хабре есть великолепный разбор устройства компилятора, который стоит добавить в закладки:

📖 Устройство компилятора Swift. Часть 1 (общий обзор компонентов).
📖 Устройство компилятора Swift. Часть 2 (разбор частей, отвечающих за анализ исходного кода).
📖 Устройство компилятора Swift. Часть 3 (разбор Swift Intermediate Language).
📖 Устройство компилятора Swift. Часть 4 (генерация LLVM IR из AST и что выдаёт настоящий фронтенд).

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
19👍6🔥41💯1🎅1🆒1
Разбор Grid View в SwiftUI: LazyVGrid, LazyHGrid, Grid, GridRow

Для создания нужного лэйаута в SwiftUI можно использовать LazyVGrid, если нужно вертикальное отображение, и LazyHGrid (если горизонтальное). Тем самым мы сможем добиться нужного эффекта, при этом адаптируемого к различным ориентациям и размерам экрана.

Начиная с iOS 16, нам также доступен вариант создания Grid с использованием GridRow.

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

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
18🔥7👍5💯22👏1🎄1
Async await в Swift: набор инструментов

📖 В блоге Emerge Tools вышла объёмная статья, в которой рассмотрено множество методов из Swift Concurrency.

Из важного: для каждого инструмента приведены примеры кода и рассмотрена теория.

Больше материалов по Swift Concurrency:

🔗 Практические решения проблем с помощью Swift Concurrency
🔗 Изучение Swift Concurrency за 2 часа
🔗 Task и structured concurrency в swift (серия статей на хабре)
🔗 Swift Concurrency — вещи, о которых вам не говорят

В приложении доступен целый блок вопросов (который будет расширяться).

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


😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
22👍10🔥9❤‍🔥2👏2💯1🎄1🆒11
Загрузка UIImage с диска: разбор сценариев и импакт на память

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

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

На основе этого уже можно принимать решение, как именно стоит работать с картинками, и нужен ли, например, тут кэш.

📖 Антуан в своей статье описал несколько таких сценариев и привёл пример использования кэширования в этих ситуациях.

📖 А в этом посте вы можете узнать некоторые причины и способы правки out of memory exception при работе с изображениями.

📖 Кстати, вот тут можно почитать про эффективный способ загрузки больших изображений в основном потоке.

Больше интересных кейсов и ситуаций доступно здесь.


😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
16👍5🔥5💯21👏1🆒1
Развёрнутый гайд по работе с App Store Connect API

Выполнение действий вручную на сайте App Store Connect, вероятно, наиболее распространенный способ для разработчиков управлять и отслеживать состояние приложений в App Store.

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

Вот библиотеки, которые могут помочь при работе с App Store Connect API:

🔗 appstoreconnect-swift-sdk (c её помощью я написал собственное решение для управления отзывами и частичной автоматизации обновлений в аппсторе)
🔗 Bagbutik
🔗 asc-swift

Ниже перечислил статьи, демонстрирующие способы создания собственных средств автоматизации с помощью App Store Connect API

1️⃣ Как отправлять запросы к App Store Connect API.

2️⃣ Расчет среднего рейтинга отзывов.

3️⃣ Работа с provisioning profiles.

4️⃣ Создание и удаление сертификатов.

Кстати, если вы хотите узнать, что скрывается за сертификатами для Code Signing, в канале есть общий пост, а здесь большой разбор.

Например, вы можете узнать подробнее про понятия .der и .pem, цепочку доверия, Certificate signing request, что происходит при переподписывании кода в App Store и многое другое.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥7👍4💯21👏1👌1🏆1🎄1
Media is too big
VIEW IN TELEGRAM
Swift Translation API: примеры реализации

Для перевода до анонса этого фреймворка в пет-проектах я использовал или Google Translate API, или DeepL (знаю, что многие юзают решение от OpenAI).

📶 Но для них нужно интернет-соединение (что логично), и деньги (DeepL, например, имеет премиум-акк, на котором нужно платить за объём знаков).

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

Посмотрим, что будет после выхода в прод, будет ли перевод на платную модель, как с Weather API или оставят все фичи, как есть.

📖 А уже сейчас можно посмотреть на пример создания приложений с новым фреймворком и почитать прекрасный разбор API здесь.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2210👍5💯2111👏1
This media is not supported in your browser
VIEW IN TELEGRAM
Анимации в SwiftUI — подборка репозиториев на Github

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

В этой подборке добавил несколько популярных репозиториев на Github, где можно посмотреть на анимации и поискать вдохновение:

🔗 Open SwiftUI Animations — 4 000

🔗 SwiftUI-Animations — 1 800

🔗 kavsoft-swiftui-animations — 460

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
20🔥9👍72👏2❤‍🔥111🏆1🎅1🆒1
Паттерны навигации в SwiftUI

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

📖 В этой статье рассмотрены общие варианты навигации, которые можно использовать при создании приложений:

🔘 Базовая навигация при использовании List
🔘 Динамическая программная маршрутизация
🔘 Глобальная маршрутизация в SwiftUI
🔘 Реализация навигации c использованием Environment Values.
🔘 Реализация навигации для TabView.

📖 А вот тут можно почитать про особенности NavigationPath, принципы работы и отличия от UINavigationController в UIKit.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
21👍5👏5🔥31🤩1😎11
This media is not supported in your browser
VIEW IN TELEGRAM
Ещё один шаг вперёд

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

К такому можно отнести работу с криптографией, для кого-то многопоточку, а для кого-то сложную вёрстку.

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

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

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

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

Этот канал — способ поделиться самыми разными областями знаний мобильного сообщества.

🎆 Сегодня я хотел бы анонсировать новый раздел для тех, кто саппортит развитие канала.

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

Сделайте ещё один шаг вперёд уже сегодня, подпишитесь на бусти или в телеграме (код шейдера с видео уже там).

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
18🔥8👍2🤯2🤩2💯211👏1🎅1
This media is not supported in your browser
VIEW IN TELEGRAM
🥳 Создание файла из кода в буфере обмена в Xcode 16

Одна из наиболее приятных (если не топовых) фич в новом Xcode — новая возможность рефакторинга (и не только).

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

При этом Xcode ещё и сам подберёт и задаст подходящее название (например, как на гифке).

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
49🔥25👍11👌211💯1🎄1🆒11
Барбара Лисков — об абстракции данных и ООП

Барбара — профессор MIT, автор языков Клу и Argus, лауреат премии Тьюринга, и вы все наверняка её знаете из-за изучения SOLID.

Рекомендую посмотреть интересное видео, в котором Барбара отвечает на необычные вопросы не только о прошлом, но и о будущем ООП. А ещё затрагивает технические нюансы принципа подстановки Лисков в контексте SOLID.

🤩 Ведь как известно, лучше всего — получать ответы на свои вопросы из первоисточников.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
23👍9💯6🔥5❤‍🔥111🏆1🎅1😎1
🧠 Массивы в Swift: вопросы и техники

В iOS IQ добавлен новый раздел с практическими вопросами по работе с массивами.

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

Кроме этого, в отдельной секции внутри уникальной базы знаний уже сегодня доступны:
➡️Вопросы на чтение кода
➡️Многопоточность
➡️DispatchQueue: практические вопросы
➡️Swift Concurrency
➡️Алгоритмы: терминология и примеры
➡️Память: ARC, side table, флаги, утечки
Также вы получите доступ в закрытый чат, ранние релизы приложения iOS IQ, тонну теории, разбор крутых эффектов и многое другое.


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

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
21🔥6👍42💯2🏆1🎅1🎄1
Swift Navigation: инструменты навигации от PointFree

PointFree выкатили в опенсорс либу Swift Navigation — набор мощных инструментов для всех платформ Swift (в качестве вдохновения использовались принципы SwiftUI).

С помощью библиотеки можно управлять навигацией в SwiftUI, UIKit и AppKit. Более того, её можно использовать и для платформ, отличных от Apple, таких как Windows, Linux, Wasm и т.д..

🛠 Инструментарий уже доступен на GitHub (1 800 )

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

📖 Case Studies — коллекция примеров SwiftUI и UIKit, демонстрирующих API этой библиотеки.
📖 Inventory — многоэкранное приложение со списками, всплывающими окнами и алертами.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥168👍4❤‍🔥2👏2🎉1🤩1💯1🆒1
Как решить проблему с констрэинтами или как быть с ошибками вида «will attempt to recover by breaking constraint»?

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

Хотел бы напомнить про трюк, а если быть точнее, мастхэв-навык при поиске подобных проблемных вьюх с помощью стандартных инструментов Xcode.

Если вы встретите такую ошибку (или её вариации):

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xb82d450 H:[UIButton:0xb82ad50]-(NSSpace(20))-| (Names: '|':UIView:0xb82f360 )>


Запустите View Debugger и вставьте айдишник проблемной вьюхи в поле поиска слева внизу. Xcode автоматически подсветит её и уже после вы спокойно сможете устранить эту проблему.

⭐️ А ещё есть полезнейший сайт, который часто может помочь в таких ситуациях.

⭐️Кстати, в базе знаний я делюсь своим опытом, и стараюсь наполнять разные разделы, один из которых — разбор различных проблем в разработке.

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
32👍8🔥5❤‍🔥4👏42💯2🎉1
This media is not supported in your browser
VIEW IN TELEGRAM
Как автоматически обнаруживать утечки памяти с помощью UI-тестов

📖 Пол Пиелла написал отличную развёрнутую статью о том, как можно юзать функциональность, доступную нам аж с Xcode 13 (тогда появилась опция xcodebuild, генерирующая memory graph всякий раз, когда фэйлится тест XCTMemoryMetrics).

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

Саму статью можно разбить на несколько важных частей:

1️⃣ Написание самого теста, чекающего использование памяти.

2️⃣ Генерация memory graph.

3️⃣ Разбор результатов и анализ графа.

Тут пригодится ещё один материал про разбор содержимого XCResult.

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

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
24👍12🔥4🤯2💯2❤‍🔥11👌1🎄1🆒1
This media is not supported in your browser
VIEW IN TELEGRAM
Ещё одно приятное нововведение в Xcode 16

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

Использование: щелчок правой кнопкой мыши + Find References to Item.

Легко можно найти лишние ресурсы + избежать потенциальных опечаток (ну и сэкономить немного времени).

😃 iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
48🔥32👍5🎉3🎄21👏1💯1🏆1😎11