🇺🇦 iOS Dev UA - спільнота iOS розробників
384 subscribers
399 photos
42 videos
9 files
961 links
Перша україномовна спільнота iOS розробників 🇺🇦

👨‍💻Цікаві матеріали зі світу розробки для продуктів Apple.
Статті по розробці на Swift та SwiftUI. Огляд нових технологій в розробці від Apple.

чат: @iOSDevsUAChat
Ідеї та пропозиції: @SergeyZhuravel
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
💡Як принципи дизайну реалізуються в конкретних рішеннях

Дуже крутий огляд додатка Family, крипто-гаманця з топовим дизайном і анімаціями. У пості розглядаються всі принципи дизайну, яким слідувала команда, та те, в які патерни інтерфейсу та анімацій вони перетворювались. Якщо ви шукаєте натхнення – рекомендую!

🇺🇦 iOSDevUA
🔥3
💡Міграція проєкту на Swift 6: неповне керівництво

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

Завдання міграції завжди стоїть окремо, це кропітка, важка і зовсім не швидка робота, а одна зі складностей при оптимізації — показати цінність для бізнесу. Буває непросто пояснити, чому нам потрібно щось змінювати, якщо і так все працює. Але іноді це просто необхідно.

Звісно, при переході на Swift 6 можуть виникати проблеми, та й що казати, часто ми не все можемо контролювати напряму (ті ж залежності CocoaPods або SPM), тому доводиться шукати варіанти.

📖 У цьому матеріалі є відповіді на питання, що виникають при міграції, аналіз помилок і навіть опис багів у самому Swift.

🇺🇦 iOSDevUA
Hello iOS developers! New digest is here!

Hello everyone! New iOS weekly digest is here!

Let's start this digest with something unusual - Mac development using Go 🙂
How I build simple Mac apps using Go
https://dev.to/progrium/how-i-build-simple-mac-apps-using-go-104j

And one more about Mac development. Great article from Jordi Bruin about all the pros and benefits of development for Mac
Why macOS Development is Perfect for Indie Developers
Building apps for macOS offers developers a fantastic opportunity to expand their skills, create useful utilities to solve their problems, and begin their journey as indie developers:
https://www.avanderlee.com/swiftui/macos-development-powerful-utilities

Adding values to the SwiftUI environment with Xcode 16’s Entry macro
Adding custom values to SwiftUI’s environment has never been very hard to do to. However, the syntax for doing it is verbose and easy to forget. To refresh your mind, take a look at this post where we explain how to add your own environment values to a SwiftUI view:
https://www.donnywals.com/adding-values-to-the-swiftui-environment-with-xcode-16s-entry-macro

The video you should definitely see - the interview with Chris Lattner the creator of the Swift language and his thoughts about current Swift state:
https://www.youtube.com/watch?v=ovYbgbrQ-v8&ab_channel=ThePrimeTime

And one more about Swift problems - Data race safety
https://kean.blog/post/swift-6

If you ever wondered what is the difference between Some and Any make sure to check this article
Some vs Any
https://mfaani.com/posts/swift/some-vs-any
🔥4
SwiftUI Tip💡

Запобігайте користувачам закривати представлене вікно шляхом його свайпу вниз.

🇺🇦 iOSDevUA
🤔3🌚3👍1
💡Великий і докладний матеріал про Zoom transitions в iOS. Тут і про SwiftUI, і про UIKit. Все описано досить якісно, хоча стаття за оформленням більше схожа на статтю в жовтій пресі, звісно, але матеріал дійсно корисний! 👍

👉https://douglashill.co/zoom-transitions/

🇺🇦 iOSDevUA
1
💡Способи перевірки доступності нової версії додатка в 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.
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
}
}

Якщо ви знаєте інші способи (можливо, більш елегантні), поділіться, будь ласка, у коментарях.

🇺🇦 iOSDevUA
👍2🌚1
💡Розбір Grid View у SwiftUI: LazyVGrid, LazyHGrid, Grid, GridRow

Для створення потрібного макету у SwiftUI можна використовувати LazyVGrid, якщо потрібно вертикальне відображення, і LazyHGrid (якщо горизонтальне). Це дозволяє досягти бажаного ефекту, при цьому адаптованого до різних орієнтацій і розмірів екрану.

Починаючи з iOS 16, нам також доступний варіант створення Grid з використанням GridRow.

📖 У цій статті розглядаються не тільки види макетів, але й опції кастомізації, включаючи інтервали, вирівнювання і багато іншого.

🇺🇦 iOSDevUA
2
This media is not supported in your browser
VIEW IN TELEGRAM
💡Цікава стаття від Daniel Kuntz про реалізацію real-time фазового вокодера.
У статті він детально розповідає про кожен етап розробки, з якими проблемами він стикався і як їх зрештою вирішив.

Найкрутіше, що фінальна реалізація викладена у відкритому доступі на GitHub.

🔗 Посилання на статтю
🔗 Посилання на GitHub

🇺🇦 iOSDevUA
👍2
💡Використовуємо SwiftUI з CLI

Приклад того, як за допомогою класу ImageRenderer зі SwiftUI можна створити консольний інструмент, який буде додавати бейджі на іконку додатка.

🇺🇦 iOSDevUA
Завантаження картинок з диска 🏞

Річ, про яку рідко замислюєшся в процесі розробки, але вона може мати дуже несподівані й негативні наслідки.
Ось стаття, де автор розбирає, як це працює і скільки пам’яті споживає 👍

👉 https://www.avanderlee.com/swiftui/memory-consumption-loading-uiimage-from-disk/

🇺🇦 iOSDevUA
💡Async await у Swift: набір інструментів

📖 У блозі Emerge Tools вийшла велика стаття, в якій розглянуто багато методів зі Swift Concurrency.

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

🇺🇦 iOSDevUA
👍43
💡Розгорнутий гайд по роботі з App Store Connect API

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

Але деякі завдання можуть займати невиправдано багато часу, оскільки для їх виконання потрібно постійно повторювати одні й ті ж дії. Також сайт не завжди показує коректний опис помилок (наприклад, при завантаженні скріншотів).

Ось бібліотеки, які можуть допомогти при роботі з App Store Connect API:

🔗 appstoreconnect-swift-sdk
🔗 Bagbutik
🔗 asc-swift

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

1️⃣ Як надсилати запити до App Store Connect API.

2️⃣ Розрахунок середнього рейтингу відгуків.

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

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

🇺🇦 iOSDevUA
👍1
Media is too big
VIEW IN TELEGRAM
💡Swift Translation API: приклади реалізації

До анонсу цього фреймворка в пет-проєктах я використовував або Google Translate API, або DeepL (знаю, що багато хто використовує рішення від OpenAI).

📶 Але для них потрібне інтернет-з’єднання (що логічно), і гроші (наприклад, DeepL має преміум-акаунт, де потрібно платити за обсяг символів).

Тому анонс рішення Apple виглядає як криптоніт для багатьох проєктів і водночас можливість реалізації власних рішень.

Подивимося, що буде після виходу в продакшн, чи перейдуть на платну модель, як з Weather API, чи залишать всі фічі, як є.

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

🇺🇦 iOSDevUA
👍1
🚀 Live Activity в Uber

Uber поділилися своїм досвідом розробки Live Activity. З технічної сторони все досить тривіально, а ось продуктові результати цікаві:

👉 На 2,3% менше скасувань замовлень водієм
👉 На 2,1% менше скасувань замовлень пасажиром

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

🇺🇦 iOSDevUA
👍2
Hello iOS developers! New digest is here!

Hello everyone! New iOS weekly digest is here!

If you ever thought about going indie do not miss this article from Antoine var der Lee about this success story:
https://www.avanderlee.com/general/from-side-project-to-going-indie

A Paywall Optimization Success Story
The motivation, process, and results of a recent paywall experiment that significantly boosted conversions for Foodnoms:
https://ryanashcraft.com/paywall-optimization-success-story/

Async await in Swift: The Full Toolkit
Today, we're going through the many techniques in the Swift Concurrency toolkit. We'll discuss theory when it's appropriate, but for each tool we'll also provide a context where it might be the best solution:
https://www.emergetools.com/blog/posts/swift-async-await-the-full-toolkit

Unfold's Modern Mobile Release Process and the Subtle Art of Making Them Boring
On the Unfold team at Squarespace, we build our mobile app for both iOS and Android, and our releases don't require much in the way of manual intervention or human oversight. In fact, we don’t have to give releases much thought at all:
https://engineering.squarespace.com/blog/2024/unfolds-modern-mobile-release-process-and-the-subtle-art-of-making-them-boring

If you ever worked with Objective-C, you probably have some opinion about using it, check this article about comparison Objective-C and Swift
Swift vs. Objective-C: Which is Better for iOS Development:
https://dev.to/ravi_makhija/swift-vs-objective-c-which-is-better-for-ios-development-om3

Unobtrusive and testable issue reporting
Developers from PointFree are happy to anounce about creating a new library: Issue Reporting. This library provides tools to report issues in your application and library code as Xcode runtime warnings, breakpoints, assertions, and do so in a testable manner:
https://www.pointfree.co/blog/posts/147-unobtrusive-and-testable-issue-reporting
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

🇺🇦 iOSDevUA
Please open Telegram to view this post
VIEW IN TELEGRAM
4
💡Патерни навігації у SwiftUI

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

📖 У цій статті розглядаються загальні варіанти навігації, які можна використовувати при створенні додатків:

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

🇺🇦 iOSDevUA
🚀Анонсовано Swift Homomorphic Encryption, новий пакет, який підтримує обчислення в приватній хмарі з використанням найсучасніших криптографічних технік. 🕵️🤐

Детальніше читайте: https://www.swift.org/blog/announcing-swift-homomorphic-encryption/

🇺🇦 iOSDevUA
1🤯1
This media is not supported in your browser
VIEW IN TELEGRAM
💡Створення файлу з коду в буфері обміну в Xcode 16

Одна з найбільш приємних (якщо не топових) функцій у новому Xcode — нова можливість рефакторингу (і не тільки).

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

При цьому Xcode ще й сам підбере та задасть підходящу назву (наприклад, як на гіфці).

🇺🇦 iOSDevUA
7
This media is not supported in your browser
VIEW IN TELEGRAM
💡Думаю, багато хто знайомий з CAEmitterLayer, чи не так?

Натрапив на стару, але досить корисну статтю про CAEmitterBehavior. З допомогою цього класу можна гнучкіше налаштувати параметри анімації частинок CAEmitterLayer. Наприклад, Telegram використовує зв’язку з кількох behavior об’єктів для створення ефекту “спойлер”.

Цікаво, що з якоїсь причини Apple приховує існування такого інструменту, а документацію та доступ до неї можна отримати тільки за наявності Xcode 8.x.

🔗 Посилання на статтю

🇺🇦 iOSDevUA
👍21
💡Автор, чиї статті ми часто публікуємо, розповідає про те, як він наважився залишити основну роботу та піти у вільне плавання. У цьому йому, звичайно, допоміг його pet-проєкт, про який ми тут теж часто розповідали.

Тепер він заробляє на ньому і планує розвивати далі. І в цілому розповідає про шлях розвитку цього проєкту та як він дійшов до точки, коли і чому вирішив піти з компанії, де пропрацював 7,5 років 👍

👉https://www.avanderlee.com/general/from-side-project-to-going-indie/

🇺🇦 iOSDevUA