Опенсорсный клиент на SwiftUI для Mastodon: демонстрация реализованных методов и фич
IceCubesApp — это приложение с открытым исходным кодом для доступа к децентрализованной социальной сети Mastodon! Он полностью построен на SwiftUI, что делает его быстрым, легким и простым в использовании.
Проект разделен на разные пакеты Swift, чтобы упростить управление кодовой базой и ее обслуживание.
Каждый из них ориентирован на определенный аспект приложения, такой как пользовательский интерфейс, сетевое взаимодействие или модели данных.
Этот модульный подход упрощает совместную работу и гарантирует, что код организован и прост для понимания.
В большинстве случаев архитектура представляет собой простой MVVM.
📖 Thomas Ricouard написал статью, в которой рассказал о некоторых аспектах и реализованных фичах.
🛠 Приложение на Github доступно по ссылке (⭐️2 100).
@iOS Dev
IceCubesApp — это приложение с открытым исходным кодом для доступа к децентрализованной социальной сети Mastodon! Он полностью построен на SwiftUI, что делает его быстрым, легким и простым в использовании.
Проект разделен на разные пакеты Swift, чтобы упростить управление кодовой базой и ее обслуживание.
Каждый из них ориентирован на определенный аспект приложения, такой как пользовательский интерфейс, сетевое взаимодействие или модели данных.
Этот модульный подход упрощает совместную работу и гарантирует, что код организован и прост для понимания.
В большинстве случаев архитектура представляет собой простой MVVM.
📖 Thomas Ricouard написал статью, в которой рассказал о некоторых аспектах и реализованных фичах.
🛠 Приложение на Github доступно по ссылке (⭐️2 100).
@iOS Dev
👍16👏8❤3🔥3💯3🤩2🎉1
Quick actions для iOS: интеграция и примеры
🧑💻 Quick actions — отличный способ предоставить пользователям быстрый доступ к общим функциям вашего приложения на главном экране.
Пользователь может коснуться и удерживать иконку приложения, чтобы отобразить набор ярлыков или действий, которые можно выполнить прямо с хоумскрина.
📖 В этом материале вы сможете узнать, как создавать:
1️⃣ Static quick actions, которые всегда доступны для вашего приложения.
2️⃣ Dynamic quick actions, которые ваше приложение может определить в рантайме.
3️⃣ Как поддерживать оба типа быстрых действий на примере тестового приложения.
@iOS Dev
Пользователь может коснуться и удерживать иконку приложения, чтобы отобразить набор ярлыков или действий, которые можно выполнить прямо с хоумскрина.
📖 В этом материале вы сможете узнать, как создавать:
1️⃣ Static quick actions, которые всегда доступны для вашего приложения.
2️⃣ Dynamic quick actions, которые ваше приложение может определить в рантайме.
3️⃣ Как поддерживать оба типа быстрых действий на примере тестового приложения.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🔥5❤2👏2💯2
This media is not supported in your browser
VIEW IN TELEGRAM
Реализация вращения линейного градиента на SwiftUI
Оказывается, что это просто нормализованная пара X/Y под капотом, так что при выборе подходящих X и Y, можно рисовать свои градиенты под любым углом.
📖 Автор рассказывает о том, как несложно реализовать подобный эффект и приводит пример кода.
@iOS Dev
LinearGradient
принимает в качестве управления направлением аргумент типа UnitPoint
. Оказывается, что это просто нормализованная пара X/Y под капотом, так что при выборе подходящих X и Y, можно рисовать свои градиенты под любым углом.
📖 Автор рассказывает о том, как несложно реализовать подобный эффект и приводит пример кода.
@iOS Dev
🔥18👍9😍3❤1👏1🏆1🆒1
This media is not supported in your browser
VIEW IN TELEGRAM
Реализация показа аннотаций диаграмм при наведении в Swift Charts
📖 В этом посте можно узнать, как создать интерактивную гистограмму, которая показывает аннотации при наведении
Отметки столбцов будут отражать данные о продажах трех разных продуктов за год, сгруппированные по месяцам.
Кроме этого, в аннотациях будут указаны точные данные о продажах каждого продукта за определенный месяц.
🛠 Пример реализации доступен на github.
@iOS Dev
📖 В этом посте можно узнать, как создать интерактивную гистограмму, которая показывает аннотации при наведении
Отметки столбцов будут отражать данные о продажах трех разных продуктов за год, сгруппированные по месяцам.
Кроме этого, в аннотациях будут указаны точные данные о продажах каждого продукта за определенный месяц.
🛠 Пример реализации доступен на github.
@iOS Dev
👍14🔥7⚡2👏2❤1
🚨Срочно обновите fastlane!
В последние пару дней многие могли столкнуться с проблемой авторизации фастлейна, которая на самом деле ещё серьёзнее.
Дело в том, что теперь Apple требует заголовок
❗️ Отсутствие этого заголовка приводит к запрету доступа и возможной блокировке учетной записи Apple ID (некоторых, в том числе и один из моих личных аккаунтов это затронуло).
📔 Детальнее в этом пулл-реквесте: обсуждение и в этой теме.
В версии 2.212.1 эту проблему устранили, однако найстойчиво рекомендуется перейти на ключи App Store Connect API (как раз этот способ я использую в приложении Starly).
🛠Ссылка на актуальную версию fastlane здесь.
[UPD] Проблема затронула также и пользователей Xcodes.
@iOS Dev
В последние пару дней многие могли столкнуться с проблемой авторизации фастлейна, которая на самом деле ещё серьёзнее.
Дело в том, что теперь Apple требует заголовок
X-APPLE-HC
при входе в https://idmsa.apple.com/appleauth/auth/signin
. 📔 Детальнее в этом пулл-реквесте: обсуждение и в этой теме.
В версии 2.212.1 эту проблему устранили, однако найстойчиво рекомендуется перейти на ключи App Store Connect API (как раз этот способ я использую в приложении Starly).
🛠Ссылка на актуальную версию fastlane здесь.
[UPD] Проблема затронула также и пользователей Xcodes.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
😱24👍9🫡6🤯3🙏2❤1🔥1😁1
Создание приложения, похожего на стандартный iOS Timer с помощью SwiftUI
📖 В этом материале рассказывается, как повторить стандартный таймер на SwiftUI, ориентируясь на следующие 4 части интерфейса:
1️⃣
2️⃣ Элементы управления
3️⃣
4️⃣ Элемент управления
Каждый из компонентов пользовательского интерфейса создаётся по отдельности.
🛠 Исходный код проекта доступен здесь.
@iOS Dev
📖 В этом материале рассказывается, как повторить стандартный таймер на SwiftUI, ориентируясь на следующие 4 части интерфейса:
1️⃣
TimePickerView
.2️⃣ Элементы управления
StartButton
и StopButton
.3️⃣
CircularProgressView
, который виден только при активном таймере.4️⃣ Элемент управления
PauseButton
, который виден также только при активном таймере.Каждый из компонентов пользовательского интерфейса создаётся по отдельности.
🛠 Исходный код проекта доступен здесь.
@iOS Dev
👍24🔥6❤4👏2🤩1🤣1
Создание шаблонов заголовков в Xcode для Swift Packages
Если вы используете
1️⃣ Нет шаблона заголовка.
2️⃣ Нет запроса для имени файла.
📖 В этом материале есть решение для обеих проблем (вы можете использовать его и под свои рабочие процессы).
📖 А про изменение стандартных заголовков в файлах Xcode есть небольшой пост вот тут.
@iOS Dev
Если вы используете
Swift Package
, при создании нового файла возникают две неприятные проблемы:1️⃣ Нет шаблона заголовка.
2️⃣ Нет запроса для имени файла.
📖 В этом материале есть решение для обеих проблем (вы можете использовать его и под свои рабочие процессы).
📖 А про изменение стандартных заголовков в файлах Xcode есть небольшой пост вот тут.
@iOS Dev
👍8🔥6💯2❤1👏1
Три способа передачи данных при использовании WatchConnectivity
⌚При работе с
Основной точкой взаимодействия является класс
И хотя Apple рекомендует использовать собственные возможности
📖 В этом материале автор рассказывает о своём опыте работы с
@iOS Dev
⌚При работе с
watchOS
, существуют различные методы для связи между устройствами iPhone и Apple Watch. Основной точкой взаимодействия является класс
WCSession
. Этот объект используется для создания соединения между телефоном и часами.И хотя Apple рекомендует использовать собственные возможности
URLSession
для запроса данных, методы из поста предназначены для передачи небольших объемов информации.📖 В этом материале автор рассказывает о своём опыте работы с
watchOS
и плюсах и минусах каждого из способов связи между Apple Watch и iPhone.@iOS Dev
👍19🔥2❤1🥰1👏1🆒1
Зарплаты разработчиков во второй половине 2022
🟢 По сравнению с первой половиной 2022 года, зарплаты ощутимо выросли у стажеров — на 14%. Немного подросли зарплаты сеньоров и лидов — по 4%. Практически не изменились зарплаты мидлов и джунов.
🟢 Больше всего выросли зарплаты разработчиков Delphi — на 28%.
Медианная зарплата Objective-С разработчиков выросла на 4% — 260 000 ₽.
🤑 Медианная зарплата джунов на Swift — 95 000 ₽ (+9%), процентно схожий рост у мидлов, у сеньоров +3%.
💪 Среди лидов больше всего платят Swift-разработчикам — 350 000 ₽ , а меньше всего лиды получают в 1С.
@iOS Dev — о важном
🟢 По сравнению с первой половиной 2022 года, зарплаты ощутимо выросли у стажеров — на 14%. Немного подросли зарплаты сеньоров и лидов — по 4%. Практически не изменились зарплаты мидлов и джунов.
🟢 Больше всего выросли зарплаты разработчиков Delphi — на 28%.
Медианная зарплата Objective-С разработчиков выросла на 4% — 260 000 ₽.
@iOS Dev — о важном
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28🫡7❤4🔥2⚡1🥰1🆒1
С помощью нового показателя в App Analytics вы можете оценить производительность своего приложения, сравнив ее с аналогичными приложениями в App Store.
Выкатили сравнение по следующим показателям:
🔘Коэффициент конверсии.
🔘Коэффициент удержания на 1-й, 7-й и 28-й день.
🔘Показатель сбоев.
🔘Средний доход на одного платящего пользователя.
Приложения в одной и той же категории App Store группируются вместе.
🌐 На официальном сайте можно прочитать про каждый параметр подробнее, а также узнать про советы по улучшению показателей.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤3💯3👨💻2🆒2❤🔥1🔥1
Визуальное справочное руководство для документирования кода на Swift
📖 В этом огромном материале Marco Eidinger представляет полный обзор параметров для документирования.
Кроме этого, он делится советами и рекомендациями по эффективному созданию документации, а также рассматривает различия между
@iOS Dev
📖 В этом огромном материале Marco Eidinger представляет полный обзор параметров для документирования.
Кроме этого, он делится советами и рекомендациями по эффективному созданию документации, а также рассматривает различия между
Xcode Quick Help
по сравнению с DocC Renderer
и Jazzy.@iOS Dev
👍15🔥7❤2👏2💯1
Различные способы сортировки массива строк в Swift
В Swift есть два способа сортировки: тот, который мутирует исходный массив, и тот, который этого не делает.
У них обоих одно и то же требование: элемент в коллекции должен соответствовать протоколуComparable .
Типы, соответствующие этому протоколу, можно сравнивать с помощью операторов
📖 В этом материале рассказывается о различных способах сортировки, а также объясняется, в каких случаях
@iOS Dev
В Swift есть два способа сортировки: тот, который мутирует исходный массив, и тот, который этого не делает.
У них обоих одно и то же требование: элемент в коллекции должен соответствовать протоколу
Типы, соответствующие этому протоколу, можно сравнивать с помощью операторов
<, <=, >=
и >
. 📖 В этом материале рассказывается о различных способах сортировки, а также объясняется, в каких случаях
localizedStandardCompare
поможет справиться, например, с упорядочиванием имен формата Name2.txt
, Name7.txt
, и Name25.txt
.@iOS Dev
👍26🔥7❤1👏1💯1
О сложном пути и о Гунсунь Луну из царства Чжао
Пост не только о разработке, но и о том, что мне кажется важным
Если бы за последние 25 лет авиационная промышленность развивалась столь же стремительно, как вычислительная техника, то Boeing 767 можно было бы приобрести сегодня за 500 долларов и облететь на нем земной шар за 20 мин, израсходовав при этом 19 литров горючего. Цитата из журнала «В мире науки» (1983, 8 выпуск).
⏳ Когда мы видим сложную задачу или что-то, кажущееся на первый взгляд недостижимым, можно посчитать, что для достижения этой цели потребуется бесконечное количество времени или иных ресурсов. И очень часто эта возможность так и остаётся возможностью.
Это касается хардорных фич, объёмного рефакторинга, попаданию в IT в целом, или участию в каких-то контестах, в частности.
Метафорически это можно сравнить с игрой в умники и умницы, подсознательно хочется выбрать зелёную дорожку с двумя ошибками вместо красной, которая этого не прощает.
Иногда хочется быстрее прийти к финишу в одном соревновании. На мой взгляд, гораздо важнее выработать технику, которая будет с вами навсегда. Неважно, играете вы в квизы или занимаетесь спортом, стабильность важнее кратковременного успеха, а нахождение в топ-10 на протяжении сезона лучше одной случайной победы.
⚽️ В футболе такая же параллель: вчерашняя победа Ливерпуля со счётом 7-0 невероятна, но капитан Манчестер Юнайтед не должен пихать судью на 86 минуте матча. В целом, лучше проиграть один раз 7-0, чем 7 раз по 1-0.
Несмотря на то, что стремление к лучшему естественно, как известно - это враг хорошего (спасибо, Вольтер).
Гунсунь Луну сказал: «Если от палки длиной в один чи ежедневно отнимать половину, это не завершится и через 10000 поколений».
Важно знать меру. И 1 000 задач на литкоде это замечательно, но столько ли нужно на самом деле?
@iOS Dev
Пост не только о разработке, но и о том, что мне кажется важным
Если бы за последние 25 лет авиационная промышленность развивалась столь же стремительно, как вычислительная техника, то Boeing 767 можно было бы приобрести сегодня за 500 долларов и облететь на нем земной шар за 20 мин, израсходовав при этом 19 литров горючего. Цитата из журнала «В мире науки» (1983, 8 выпуск).
⏳ Когда мы видим сложную задачу или что-то, кажущееся на первый взгляд недостижимым, можно посчитать, что для достижения этой цели потребуется бесконечное количество времени или иных ресурсов. И очень часто эта возможность так и остаётся возможностью.
Это касается хардорных фич, объёмного рефакторинга, попаданию в IT в целом, или участию в каких-то контестах, в частности.
Метафорически это можно сравнить с игрой в умники и умницы, подсознательно хочется выбрать зелёную дорожку с двумя ошибками вместо красной, которая этого не прощает.
Иногда хочется быстрее прийти к финишу в одном соревновании. На мой взгляд, гораздо важнее выработать технику, которая будет с вами навсегда. Неважно, играете вы в квизы или занимаетесь спортом, стабильность важнее кратковременного успеха, а нахождение в топ-10 на протяжении сезона лучше одной случайной победы.
⚽️ В футболе такая же параллель: вчерашняя победа Ливерпуля со счётом 7-0 невероятна, но капитан Манчестер Юнайтед не должен пихать судью на 86 минуте матча. В целом, лучше проиграть один раз 7-0, чем 7 раз по 1-0.
Несмотря на то, что стремление к лучшему естественно, как известно - это враг хорошего (спасибо, Вольтер).
Гунсунь Луну сказал: «Если от палки длиной в один чи ежедневно отнимать половину, это не завершится и через 10000 поколений».
Важно знать меру. И 1 000 задач на литкоде это замечательно, но столько ли нужно на самом деле?
@iOS Dev
❤🔥29👍12🔥6🤔4👏2❤1🙏1🕊1💯1🤣1🤗1
Реализация поддержки ссылок с обработкой нажатий в UILabel на Swift
Конечно, можно реализовать это на базе
🛠 Однако реализация не так проста, и для этого нам потребуется собственные
📖 В этом материале рассказывается, как создать такие ссылки с обработкой тапов.
@iOS Dev
UILabel
поддерживает отображение строк с атрибутами ссылки, но не позволяет нажимать на них и открывать их в браузере. Конечно, можно реализовать это на базе
UITextView
, но это более тяжелый компонент и, следовательно, может быть не лучшим выбором. 🛠 Однако реализация не так проста, и для этого нам потребуется собственные
NSLayoutManager
, NSTextStorage
и NSTextContainer
.📖 В этом материале рассказывается, как создать такие ссылки с обработкой тапов.
@iOS Dev
👍27🤗3❤2🔥1👏1💯1
Генерация похожих цветов в Swift или почему RGB не всегда лучший выбор
Теоретически RGB — это группа цветовых пространств, которая позволяет указать дисплею, какое напряжение требуется каждому субпикселю.
Однако на практике теперь у нас есть телефоны с дисплеями, которые позволяют отображать более 100% красного цвета, называемым суперкрасным.
О RGB тоже трудно думать. Красный, зеленый и синий аддитивный свет ведут себя не так, как мы привыкли — вы можете видеть отдельные цвета вблизи, но по мере удаления они смешиваются вместе, и вы начинаете видеть только один цвет.
Наконец, RGB трудно манипулировать. Если вы начнете с черного, вы можете увеличить количество «красного» в палитре цветов RGB, что сделает все более красным. Все идет нормально. Затем вы начинаете увеличивать «зеленый», и вы получаете… желтый?
Но есть и другие представления цветов, которые легче поддаются изменению.
📖 В этом необычном материале автор делится своими размышлениями о генерации цветов на Swift и рассказывает о выводах, к которым пришёл.
Например, вы можете прочесть о цветовом пространстве Hue-Chroma-Luminance.
🛠 И даже немного поиграть с палитрой цветов, примеры кода: тут, тут, здесь или вот в этом gist.
@iOS Dev —в день 8 марта тема цветов выбрана неслучайно, поздравляю всех девушек с международным женским днём ❤️🔥🌹
Теоретически RGB — это группа цветовых пространств, которая позволяет указать дисплею, какое напряжение требуется каждому субпикселю.
Однако на практике теперь у нас есть телефоны с дисплеями, которые позволяют отображать более 100% красного цвета, называемым суперкрасным.
О RGB тоже трудно думать. Красный, зеленый и синий аддитивный свет ведут себя не так, как мы привыкли — вы можете видеть отдельные цвета вблизи, но по мере удаления они смешиваются вместе, и вы начинаете видеть только один цвет.
Наконец, RGB трудно манипулировать. Если вы начнете с черного, вы можете увеличить количество «красного» в палитре цветов RGB, что сделает все более красным. Все идет нормально. Затем вы начинаете увеличивать «зеленый», и вы получаете… желтый?
Но есть и другие представления цветов, которые легче поддаются изменению.
📖 В этом необычном материале автор делится своими размышлениями о генерации цветов на Swift и рассказывает о выводах, к которым пришёл.
Например, вы можете прочесть о цветовом пространстве Hue-Chroma-Luminance.
🛠 И даже немного поиграть с палитрой цветов, примеры кода: тут, тут, здесь или вот в этом gist.
@iOS Dev —
👍17❤9❤🔥6🔥3👏2🌚1💯1
Разбор нововведений в Swift 5.8: API с обратным развертыванием, улучшенные result builders и не только
Хотя многие важные изменения Swift в настоящее время можно узнать в Swift Evolution, Swift 5.8 сам по себе является более чистым релизом: есть не только дополнения, но также и улучшения функциональности.
📖 В этой статье Пола Хадсона можно узнать о самых важных изменениях, включающих примеры кода и пояснения.
Вам понадобится Xcode не ниже 14.3, но учтите: некоторые изменения требуют определенного флага компилятора до релиза Swift 6.
🛠 Можно заранее скачать playground, который используется в статье.
@iOS Dev
Хотя многие важные изменения Swift в настоящее время можно узнать в Swift Evolution, Swift 5.8 сам по себе является более чистым релизом: есть не только дополнения, но также и улучшения функциональности.
📖 В этой статье Пола Хадсона можно узнать о самых важных изменениях, включающих примеры кода и пояснения.
Вам понадобится Xcode не ниже 14.3, но учтите: некоторые изменения требуют определенного флага компилятора до релиза Swift 6.
🛠 Можно заранее скачать playground, который используется в статье.
@iOS Dev
👍27🔥4❤3👏2🤩1💯1🫡1
Загрузка данных в SwiftUI с помощью URLSession и async/await
Хотя загрузка данных с сервера может показаться разработчику простой, она зависит от нескольких компонентов.
Учитывая такую сложность управления, неудивительно, что
📖 В этом обширном материале вы сможете узнать о следующих вещах:
1️⃣ Как с помощью
2️⃣ Моделирование данных, получаемых через
3️⃣ Управление асинхронным процессом обновления от download task.
4️⃣ Создание пользовательского интерфейса для управления загрузкой данных.
@iOS Dev
Хотя загрузка данных с сервера может показаться разработчику простой, она зависит от нескольких компонентов.
Учитывая такую сложность управления, неудивительно, что
URLSession
является центральным узлом, который позволяет настроить каждый аспект для группировки нескольких запросов.📖 В этом обширном материале вы сможете узнать о следующих вещах:
1️⃣ Как с помощью
URLSession
управлять передачей данных.2️⃣ Моделирование данных, получаемых через
URLSession
.3️⃣ Управление асинхронным процессом обновления от download task.
4️⃣ Создание пользовательского интерфейса для управления загрузкой данных.
@iOS Dev
👍17🔥4❤3👌1🌚1💯1🏆1
Как написать свой первый Unit Test на Swift
Не все и не всегда пишут тесты, и этому периодически бывают самые разные объяснения (иногда вполне обоснованные).
🧑💻 Если вы новичок в Swift или iOS, вы обязательно зададите себе этот вопрос в какой-то момент.
На самом деле, первые шаги в тестировании сделать довольно просто.
📖 И в этой статье Винсент объясняет, что для этого необходимо сделать.
@iOS Dev
Не все и не всегда пишут тесты, и этому периодически бывают самые разные объяснения (иногда вполне обоснованные).
На самом деле, первые шаги в тестировании сделать довольно просто.
📖 И в этой статье Винсент объясняет, что для этого необходимо сделать.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥5❤4👏2👌2💯1
Как создавать настраиваемые виджеты с динамическими параметрами?
Существует ряд обстоятельств, когда нам понадобится настраиваемый виджет с динамическими параметрами.
Среди этих ситуаций можно выделить следующие:
1️⃣ Опции предоставляются удаленным сервером (API).
2️⃣ Параметры взяты из хост-приложения виджета.
3️⃣ Опции генерируются в рантайме.
📖 В этой статье пойдёт речь о первой ситуации. И хотя руководство посвящено этому сценарию, обсуждаемые принципы и методы также могут быть применены к двум другим.
@iOS Dev
Существует ряд обстоятельств, когда нам понадобится настраиваемый виджет с динамическими параметрами.
Среди этих ситуаций можно выделить следующие:
1️⃣ Опции предоставляются удаленным сервером (API).
2️⃣ Параметры взяты из хост-приложения виджета.
3️⃣ Опции генерируются в рантайме.
📖 В этой статье пойдёт речь о первой ситуации. И хотя руководство посвящено этому сценарию, обсуждаемые принципы и методы также могут быть применены к двум другим.
@iOS Dev
👍10👏3❤2🔥2💯1