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

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

#ios #mobile #swift
加入频道
Xcode поставляется со своей версией Swift, и мы всегда можем обратиться к этому списку. Иногда бывает ситуация, когда обновлять Swift для своего проекта не лучший вариант в текущий момент. Для более старой версии Swift, можно сделать следующее:

1️⃣ Проверьте версию Swift: xcrun swift --version

2️⃣ Узнайте местонахождение: xcrun -f swift

3️⃣ Установите альтернативный набор инструментов Swift, если требуется:

— На этом ресурсе можно скачать нужный вариант. Установите его, он будет располагаться тут: /Library/Developer/Toolchains

— Проверьте идентификатор: cat /Library/Developer/Toolchains/swift-5.5-RELEASE.xctoolchain/Info.plist
Например, CFBundleIdentifier для org.swift.550202109201a

— С идентификатором теперь можно выбирать, какой нужен набор инструментов:

xcodebuild -toolchain org.swift.550202109201a
xcrun -toolchain org.swift.550202109201a


Как альтернатива, можно создать переменную окружения:
export TOOLCHAINS=org.swift.550202109201a

Для проверки, что всё ок, используйте 1️⃣ и 2️⃣ шаги.

@iOS Dev
Туториал для начинаюших по Bezier Paths и Shape Layers

Существуют разные способы и разные подходы к тому, как нарисовать "экран" приложения:

— Использовать полученную графику от дизайнеров.

— Реализовать UI в коде.

— Использовать Interface Builder.

Комбинации способов выше и другие варианты.

🛠Однако иногда компоненты нужно создать программно, и тогда могут возникнуть сложности.

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

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

😉 Как говорится, от простого к сложному, шаг за шагом!

@iOS Dev
Как повысить энергоэффективность приложения, если у вас много таймеров, но не все они критичны?

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

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

🧐 Это позволяет системе выполнять timer coalescing (если попроще, то что-то вроде объединения), когда несколько событий таймера собираются вместе для экономии заряда батареи.

Например, если вы просите запустить таймер через 1 секунду с допуском 0,5 секунды, он может быть запущен через 1 секунду, 1,5 секунды, 1,3 секунды и так далее.

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

🛠 Пример кода создает таймер, который будет запускаться с допуском в 0,2 сек.

@iOS Dev
Бинго для WWDC 2022 6 июня

📺 Осталась неделя до Worldwide Developers Conference (она же даб-даб ди си, она же даб-даб).

В интернете на сегодняшний день собралось довольно много слухов и рациональных предположений.

😎 А чтобы наблюдать за событием 6 июня было интереснее, я сделал бинго с тем, что мы можем услышать или увидеть. Предлагаю его вашему вниманию.

📔 Сохраните себе, вдруг пригодится!

@iOS Dev
Перебор элементов и индексов в коллекциях Swift

🤔Автор считает, что enumerated() для получения элементов и индексов не самый правильный способ и предлагает альтернативу.

Интовое значение через enumerated() не должно использоваться в качестве индекса, если только коллекция не zero-based и не индексирована целыми числами. Это счетчик, который всегда начинается с нуля.

🧑‍💻 Для перебора элементов и индексов можно использовать функцию zip().

// Array<String>
var ingredients = ["potatoes", "cheese", "cream"]

// Array<String>.SubSequence
var doubleIngredients = ingredients.dropFirst()

for (i, ingredient) in zip(
doubleIngredients.indices, doubleIngredients
) {
// do something with the index
doubleIngredients[i] = "\(ingredient) x 2"
}


Можем отказаться от enumerated() и считать элементы с помощью функции zip(). Это можно использовать для продвинутого контроля, начинаем ли считать с 0 или с 1.

📖 Кстати! В этой статье можно почитать, как использовать zip для объединения двух массивов.

@iOS Dev
Повышаем рейтинг приложений с помощью SKStoreReviewController 💪

📖 В статье автор напоминает правила для показа системного алерта:

— Запрос на оценку будет показан пользователю не более трех раз в течение 365 дней.
— Невозможно узнать, появился ли запрос на оценку.
— Мы не узнаем выбор пользователя (нажал или скипнул).

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

— Просим оценить только тех, кто установил приложение более 7 дней назад.
— Запрашивайте оценку 1 раз для каждой версии.
— У пользователя должно быть минимальное количество сессий.
— Нужно определить, что пользователь попробовал целевые функции перед оценкой.

Кроме этого, автор показывает пример нужного конфига.

🛠 И не забывает напомнить нам, что для отзыва пользователь может и перейти по ссылке:

"https://apps.apple.com/app/idXXXXXXXXXX?action=write-review"

Здесь XXXXXXXXXX — айди нашего приложения в сторе.

@iOS Dev
Apple продолжает подготовку к WWDC, которая должна начаться в понедельник

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

🌐 Стрим также можно будет найти на этой странице.

🗓 Напоминаю дату начала: 6 июня, в 20:00 по московскому времени.
Открыта запись в Digital Lounges!

🤩 Кроме анонса WWDC, компания Apple открыла регистрацию в Digital Lounges.

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

✍️ Участники программы Apple Developer Program и победители конкурса Swift Student Challenge 2022 могут зарегистрироваться в Digital Lounges на сайте WWDC или в приложении Apple Developer.
This media is not supported in your browser
VIEW IN TELEGRAM
А ещё на странице мероприятия доступно открытие паков с карточками в дополненной реальности.

🤗 Каждая карточка это Memoji с разработчиком, генерятся случайно.

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

@iOS Dev
Пример создания приложения Todo list для iOS с использованием VIPER

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

Существует множество архитектур на выбор: MVC, MVVM, MVP, View State, VIPER и многие другие.
Архитектура, которую мы выберем, будет определять, как будет построено программное обеспечение и как оно будет масштабироваться по мере роста.

📖 Одной из архитектур, о которой идёт речь в этой статье, является архитектура VIPER.
VIPER разделяет структуру приложения на компоненты внутри модуля/экрана с принципом единой ответственности.

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

👌 Юнит-тестирование и интеграционное тестирование становятся намного проще из-за границ (протокол/интерфейс) между каждым компонентом.

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

@iOS Dev
Генерация собственного QR-кода (и не только) в Swift

📖 Давайте посмотрим, как мы можем использовать Swift для создания различных типов штрихкодов и QR-кодов.

Вам не нужны сторонние библиотеки, которые могли бы поддерживать эту функциональность, ведь вы можете создавать самые разные типы QR и штрих-кодов сами, используя родной Swift 😉.

В рамках этого туториала приводятся примеры генерации для:

1️⃣ Aztec Barcode.

2️⃣ QRCode.

3️⃣ PDF417.

4️⃣ Code128.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Как симулировать изменение местоположения в реальном времени с помощью Xcode?

😎Автор этого туториала работал в Porsche, а большую часть своего времени посвящал работе над новым навигационным SDK.

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

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

ℹ️ Кстати! Если захотите сделать собственный кастомный путь, то можно воспользоваться этим сайтом.

@iOS Dev
Почисти Derived Data

🤔 Часто слышали/говорили эту фразу?

Удаление Derived Data — известный способ, о котором мы вспоминаем, когда Xcode ведет себя странно.

📖 Автор статьи до сих пор помнит, как ему в первый раз рассказали об этом трюке. И хотя DerivedData может меняться с каждой версией Xcode, почему бы не уделить пару минут и не почитать, что там внутри?

Я решил пойти дальше, и посмотреть, к чему приводит игнорирование особенностей DerivedData.

Здесь рассказывается о сложностях при работе с Jenkins CI server, запущенным как Launch Daemon.

Практический совет на будущее — регулярно чистить DerivedData Xcode на CI-сервере.

📺 Хотите копнуть глубже? Есть годное видео с WWDC 2018, которое объясняет, что происходит за кулисами в процессе сборки.

@iOS Dev
Генерация кода запроса с помощью Postman за 10 секунд

😎 Уверен, что многие разработчики использовали Postman для тестирования своих запросов, да и вообще для проверки того, что API работает. Так вот, знали ли вы о возможности генерить код запроса, в том числе для Swift, прямо из приложения?

🛠 Если вам лень, то вы можете нажать на кнопку Code, и в выпадающем списке выбрать нужный язык, в нашем случае — Swift.

@iOS Dev
Туториал по custom transitions в iOS. Прокачиваем стандартные push, pop и modal

📖 В этом руководстве вы узнаете, как заменить push, pop и modal анимации пользовательскими переходами.

🛠Примеры кода находится в репозитории, в нем вы найдете возможности замены стандартных анимаций навигации push & pop на собственные.

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

😉 Очевидно, что есть много разных возможностей, но в этой статье даётся понимание, с чего начать.

@iOS Dev
Воскресный лайтовый пост

Для тех, кто придет сегодня на день открытых дверей в Developer Center на #WWDC22, уже приготовлены кофе и пончики от Caffè Macs 😋

☺️ Приготовьте нам новую iOS, пожалуйста!

@iOS Dev
Полное руководство по архитектуре VIPER

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

Я согласен с автором по многим пунктам.

🧐 Во-первых, НЕ стоит думать, что VIPER — это плохо потому, что кто-то неправильно им воспользовался. MVP хорош для приложения с небольшим объёмом экранов, и я согласен с тем, что не следует использовать VIPER для таких приложений.

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

Если в ваших планах небольшое приложение, можно начать с MVC. Позже можно решить проблему массивных контроллеров с помощью MVVM, также подойдет MVP или паттерн координатора.

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

🛠Чтобы писать по-настоящему масштабируемые приложения, можно познакомиться с VIPER с конструктором модулей = VIPER(B).

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Wave — опенсорсное решение для анимаций

Wave — это анимационный движок для iOS и iPadOS. С его помощью легко создавать плавные, интерактивные и прерываемые анимации, которые приятно выглядят.

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

😉 Основная особенность Wave заключается в том, что все анимации являются ретаргетируемыми. Например, вы можете изменить конечную точку в процессе, и анимация будет изящно перенаправлена на это новое значение.

🛠 Код и пример приложения доступен на Github.

#opensource

@iOS Dev
Делюсь тем, что происходит на трансляции!

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

Ух, попрограммируем, чувствую, теперь😂

Кстати, уведомления теперь можно будет группировать снизу