iOS Такой 🍏
3.39K subscribers
423 photos
10 videos
2 files
303 links
IT | Подкасты | Apple | iOS Материалы | Swift

Реклама: @new_repository

Тёплый чат: https://t.me/+tzWmsOMTPpFjMzAy

Бусти: boosty.to/dimov_ios
Download Telegram
Всем привет! Возвращаемся к Вам после выходных с новой прямой трансляцией!

В это воскресенье у нас круглый стол на тему "Chat GPT и Нейронные сети". Поговорим про полезность нейронок, ответим на вопросы и попытаемся порассуждать что будет дальше. А главным гостем будет - Senior JS Разработчик Илья Юркин

По традиции за круглым столом вместе с нашим гостем будет следующий состав.

Сергей Ирбеткин, iOS Lead РНКБ Банка.
Максим Анохин, Senior iOS Санлайт.
Даниил Димов, iOS Dev at Улыбка Радуги.


Если ты хочешь чтобы ответили на твой вопрос - пиши мне в лс @new_repository 🙂

Встречаемся в 18-00 по Москве в воскресенье 14 мая по ссылке.

#diges #круглыйстол
👍136🔥4🤡2
Реализуем Универсальные ссылки на iOS

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

Разница между глубокими ссылками и универсальными ссылками

Прежде чем мы погрузимся в Универсальные ссылки, необходимо понять разницу с глубокими ссылками. Разницу лучше всего объяснить, взглянув на формат URL:

Глубокая ссылка: recipeapp://open-recipe?name=recipename
Универсальная ссылка:
www.recipes.com/recipename

Глубокая ссылка использует пользовательскую схему с путем, определяющим действие для выполнения. Универсальные ссылки — это веб-адреса, которые открывают веб-страницу, если приложение не установлено. Другими словами: глубокие ссылки работают только в том случае, если приложение существует, а универсальные ссылки, если приложения нет, возвращаются к веб-сайту.
Для пользователей лучше использовать универсальные ссылки, чтобы гарантировать, что они найдут то, что ищут. Если вы не можете предоставить веб-вариант контента, на который вы ссылаетесь, вы можете рассмотреть возможность создания App Clip и повторного использования кода вашего основного приложения.

Вы можете использовать универсальные ссылки для создания интегрированного пользовательского опыта, открывая веб-адреса непосредственно в вашем мобильном приложении. В отличие от глубоких ссылок, пользователи будут перенаправлены на веб-страницу, если приложение не установлено. Entitlement внутри вашего приложения в сочетании с файлом, связанным с доменом, обеспечивает связь между вашим сайтом и приложением. Более подробно прочитать можно в данной статье. Автор рассказывает цель применения, код написания. Берите, пользуйтесь ;)

#digest #Универсальныессылки
👍122🔥2🤮2
Собеседование iOS разработчика: вопросы и задания

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

- Управление памятью
- Autorelease Pool
- Blocks and Closures
- Event Handling & Responder Chain
- Singletons
- Dependency Injection
- Многопоточность
- Автолояут


#digest #собеседование
🔥21👍32👏1🤮1
Сетевые запросы и REST API в iOS с использованием Swift (протокол-ориентированный подход)

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

Поймете, как работает удаленная веб-служба.
Поймете, как работает протокол HTTP.
Поймете, как использовать систему загрузки URL в iOS SDK.
Выполните сетевой запрос, чтобы получить необходимые данные в вашем приложении.
Поймете как обрабатывают асинхронный характер сетевых вызовов в Swift.
Поймете, используйте полученные данные в своем приложени


А так же все про архитектуру REST. Очень понятная, доступная и большая статья для тех, кто только начинает и для всех, кто хочет освежить свои знания.

#digest #сетевыезапросы
👍12🔥3🤮21🍓1
Проектируем уведомления в iOS: 104 гайдлайна

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

Структура статьи:
- Запрос доступа
- Заголовок уведомления
- Текст уведомления
- Использование emoji
- Медиа-контент
- Кнопки действия
- Бейдж в иконке приложения
- Время и частота отправки
- Применение в e-commerce


Рекомендую данную статью👍

#digest #уведомления
👍143🔥1👏1🤔1🤮1
Всем привет! Возвращаемся к Вам с новой прямой трансляцией!

В это воскресенье у нас интерессный гость - Даниил Стрижов. Тема доклада " Собеседование в FAANG (личный опыт Google Apple Amazon Pinterest Atlassian ) сравнение с российским рынком. Послушаем маленький доклад, потом поговорим про зарубежный рынок, сравним с российским рынком.

На докладе будут присутствовать и задавать вопросы:
Сергей Ирбеткин, iOS Lead РНКБ Банка.
Максим Анохин
, Senior iOS
Кирилл Геллерт, Senior iOS


Если ты хочешь чтобы ответили на твой вопрос - пиши мне в лс @new_repository 🙂

Встречаемся в 18-00 по Москве в воскресенье 28 мая по ссылке.

#digest #доклад
👍15🔥41💩1
Короче, Proxyman: краткий обзор самого яблочного сниффера

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

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

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

#digest #proxyman
👍64🔥2💩1💊1
Async/await против GCD

Task в Swift — это новая асинхронная конструкция, которая была добавлена в Swift 5.5. Task — это единица асинхронной работы. Когда вы создаете экземпляр Task, вы предоставляете замыкание содержащее какую-то работу, которую эта задача должна выполнить. Только код, выполняющийся как часть задачи, может взаимодействовать с этой задачей, а вот чтобы взаимодействовать с текущей задачей, вы вызываете один из статических методов Task. Кроме того, Task также предоставляет дополнительные возможности, такие как отмена задачи, проверка статуса выполнения и управление приоритетом выполнения.

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

Основываясь на вышеприведенном статье, в которой приведены множество примеров реализации GCD и Async/await и их различия, можно с уверенностью заявить, что использование async/await сильно упрощает разработку, а также делает код более простым и читаемым, что видно невооруженным глазом и несомненно оказывает самый благоприятный эффект на долгосрочную судьбу проекта.

#digest #asyncawait #gcd
👍105💩2🔥1
Лучший способ структурировать iOS-проект

1. Модуль

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

У нас есть папка для каждого модуля, эти папки содержат View Controller, View Model и модель для конкретного модуля. Затем все модули группируются вместе в папке /Modules. При такой организации мы знаем, что все модули находятся в папке /Modules, а все файлы, относящиеся к конкретному модулю, находятся в папке с названием модуля, например, /SomeModule.

2. Переиспользуемые представления

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

В первом случае все эти представления должны находиться в одной папке, например, /UIComponents. И внутри этой папки вы можете сгруппировать их в зависимости от их суперклассов, например, /Buttons и /Textfields.

3. Сервисы

Вы помещаете все службы в папку /Services или /Managers. А внутри корневой папки сервисов вы создаете новую папку для каждой службы, которая у вас есть. Вы создаете папку для каждого сервиса, поскольку у вашего сервиса может быть еще несколько файлов, связанных с ним.

4. Прочие файлы

Внутри папки /Common вы создаете другие папки для имеющихся у вас файлов, например, /Resources, /Extensions, /JsonFiles и так далее.

#digest #структурапроекта
👍213❤‍🔥2🔥2🤡2🙉1
Как масштабировать все элементы экрана в SwiftU

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

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

А на самом деле все просто - нужно просто умножить параметр на коэффициент экрана)

Возьмем изначальные размеры нашего фрейма и умножим на коэффициент экрана. То есть мы берем размер экрана, на котором запускаем программу, и нужный нам размер экрана из Figma и делим друг на друга. Как итог - получаем коэффициент масштабирования

#digest #swiftui
👍113🔥3💩2
Ориентированный на продукт инженер-программист

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

Каковы ключевые черты инженеров, ориентированных на продукт, и как вы можете работать над тем, чтобы стать более ориентированными на продукт?

1. Активно использовать идеи / мнения о продукте
2. Интерес к бизнесу, поведению пользователей и данным по этому
3. Любопытство и острый интерес к вопросу "почему?"
4. Сильные коммуникаторы и отличные отношения с неинженерами
5. Заранее предлагать компромиссы между продуктом и разработкой
6. Прагматичная обработка крайних случаев
7. Быстрые циклы проверки продукта
8. Владение сквозными функциями продукта
9. Сильное представление о продукте благодаря повторяющимся циклам обучения

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

1. Поймите, как и почему ваша компания успешна
2. Постройте прочные отношения со своим менеджером по продукту.
3. Занимайтесь исследованиями пользователей, поддержкой клиентов
4. Представьте на стол хорошо обоснованные предложения по продуктам
5. Предлагайте компромиссы между продуктом и разработкой
6. Регулярно запрашивайте отзывы у вашего менеджера по продукт


#digest #развитие
👍83🔥2🤮2
Queryable: асинхронный показ View в SwiftUI

Queryable — библиотека асинхронных представления View в SwiftUI. Это property wrapper, который может инициировать представление View и ожидать завершения от асинхронной функции, при этом полностью скрывая обработку состояния от самого представления.

Это не только освобождает View от любого вида контекста (оно просто предоставляет ответ на запрос), но вы также можете передать buttonConfirmation вниз по иерархии представлений, чтобы любое дочернее представление могло удобно вызвать подтверждение без необходимости иметь дело с фактически отображаемым пользовательским интерфейсом. Queryable работает с оповещениями, диалогами подтверждения, sheets, fullScreenCover и кастомными оверлеями.

Queryable на GitHub: https://github.com/SwiftedMind/Queryable
Платформа: iOS

#digest #библиотека
👍8🔥21🤡1
UICollectionViewCompositionalLayout

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

Compositional layouts - это декларативный вид API, который позволяет нам создавать большие макеты путем объединения небольших групп макетов. Compositional layouts имеют иерархию, состоящую из Item, Group, Sections, and Layout.

Подробно как создавать интерфейсы с помощью CompositionalLayout с примерами кода в статье.

#digest #полезное
13👍6🔥2👎1
📒 Настройка CI/CD с Никитой Стрельченко

Про CI/CD говорят постоянно: разработчики с разработчиками, разработчики с техлидами. Никита проведет в эту пятница доклад, и расскажет что такое CI/CD и как внедрить его в ваш продукт.

Смотреть наш прямой эфир и запись можно по данной ссылке
Эфир проведем в эту пятницу в 21:00 по мск🙂

Если у вас будут вопросы к гостю/докладу, вы можете задать вопрос мне @new_repository

#digest #доклад
13👍4🔥4🤡3
5 причин, по которым люди, находящиеся на крутой траектории роста, работают плохо (и что с этим делать)

* Эта статья о низкой производительности при стремительном росте была адаптирована из книги Radical Candor: будьте крутым боссом, не теряя своей человечности.

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

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


#digest #полезное
👍112👎2🔥1
Если вы хотите стать гостем на iOS Такой и выступить с докладом, возможно рассказать нам о чем-то интересном. То ждем ваших предложений @new_repository
💩1🤡1
Уважаемые подписчики!

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

Но сначала мы готовим для Вас контент "Своя игра" по iOS. Это отличная возможность проверить свои знания и навыки в области мобильной разработки. А если вы хотите стать участником доклада по одной из тем, которые мы будем рассматривать, то обязательно пишите нам.

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

Подписывайтесь на нас в телеграмме
Подписывайтесь на нас в YouTube
👍224🔥3🤡2🤣1
Императивный UIKit‍ vs Декларативный SwiftUI

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

Цель статьи
Помочь разработчикам приложений для iOS понять различия между императивным и декларативным подходами к программированию, а также рассмотреть плюсы и минусы фреймворков UIKit и SwiftUI. Знакомство с ними необходимо для оптимизации процесса разработки и создания продукта высокого качества.

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

Всем советую данную статью, контент огонь🔥

#digest #полезное
🔥21👍32👏2💩2👨‍💻2🤩1
Многопоточность в iOS-разработке

В этой статье разбираются с основами многопоточности и знакомятся с такими инструментами Swift, как Grand Central Dispatch (GCD), OperationQueues, NSLock. А также существующими низкоуровневыми технологиями, такими как pthread и NSThread. Бонусом вам расскажут про async/await. Мы обсудим, как эти инструменты помогают управлять асинхронными и параллельными операциями, и посмотрим на некоторые примеры их использования.

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

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

Swift предлагает различные методы реализации многопоточности, такие как Grand Central Dispatch (GCD), OperationQueue, NSLock. И низкоуровневые технологии, такие как pthread и NSThread.

Реализация каждой из технологий в статье.

#digest #многопоточность
👍145🔥2👎1
Немного о перечислениях в Swift

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

Из коробки нам доступен сразу весь спектр решений знакомых программистам, от классических С-подобных, до "современных" перечислений, с уникальными ассоциативными значениями для каждого варианта. Помимо этого, в любом перечислении можно объявить дополнительные вычисляемые свойства.

Может показаться, что за подобную функциональность обязательно придётся заплатить либо производительностью, либо памятью. На самом деле, чтобы максимально избежать подобных издержек, под капотом в языке имеется шесть разных реализаций перечислений. Решение о том какую из них использовать, принимается автоматически во время компиляции на этапе формирования промежуточного представления кода для llvm, ну и иногда в рантайме. Таким образом, вы можете быть уверены в том, что при использовании классических С-подобных перечислений, компилятор не потащит вместе с ними весь скрытый багаж функциональности для работы с ассоциативными значениями, и наоборот, если вы работаете с перечислениями с ассоциативными значениями, то там уж всё будет оптимизировано как надо.

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

#digest #enum #перечисления
👍133🔥3👎1
Как использовать UIContentUnavailableConfiguration для управления пустыми состояниям

В этом году на WWDC Apple удивила разработчиков неожиданным улучшением UIKit. Представление UIContentUnavailableConfiguration было направлено на упрощение процесса создания пустых состояний для контроллеров представления.

По словам Apple, UIContentUnavailableConfiguration представляет собой composable описание пустого состояния и может быть снабжено содержимым-заполнителем, например, изображением или текстом.

Существует 4 способа создания UIContentUnavailableConfiguration:

1. Создание с нуля
2. Использование предопределенной конфигурации загрузки
3. Использование предопределенной конфигурации поиска
4. Использование конфигурации UIHostingConfiguration

В статье есть пример кода, а так же реализация на swiftUI. Единственная проблема, которую я вижу, это использование UIContentUnavailableConfiguration с 17 оси😥

#digest #состояние_экранов
🔥64👍3👎2