Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck
9.74K subscribers
1.52K photos
72 videos
52 files
4.3K links
Все самое полезное для мобильного разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
Почему Swift может заменить Python в мл?

Статья про перспективы языка Swift, поддержку от некоторых популярных фреймворков (TensorFlow) и плюсы языка относительно Python.

Основные тезисы:
🔸 Поддержка от передовых фреймворков из мл
🔸 Математические функции
🔸 Скорость
🔸 Импортируемость Python в Swift
🔸 Возможность писать как высокоуровневый, так и низкоуровневый код

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

Ссылка на статью
8👍2🔥2🥱2
В iOS 17 появилось несколько очень интересных улучшений, которые значительно упростят работу с картами в SwiftUI и MapKit. На примере небольшого компонента карты с возможностью поиска, попробуем разобраться, что тут к чему.

Создание map view

Делается это с помощью создания нового Swift UIView с Mapkit Map view внутри и автоматическим масштабированием и панорамой:

import SwiftUI
import MapKit

struct SearchableMap: View {
@State private var position = MapCameraPosition.automatic

var body: some View {
Map(position: $position)
.ignoresSafeArea()
}
}

Теперь необходимо добавить sheet overlay на custom view, которое позволит выполнять поиск местоположений (вставляем после .ignoresSafeArea):

.sheet(isPresented: $isSheetPresented) {
SheetView()
}

Вот так должен выглядеть SheetView.swift на данный момент:

import SwiftUI
import MapKit

struct SheetView: View {
@State private var search: String = ""

var body: some View {
VStack {
// 1
HStack {
Image(systemName: "magnifyingglass")
TextField("Search for a restaurant", text: $search)
.autocorrectionDisabled()
}
.modifier(TextFieldGrayBackgroundColor())

Spacer()
}
.padding()
// 2
.interactiveDismissDisabled()
// 3
.presentationDetents([.height(200), .large])
// 4
.presentationBackground(.regularMaterial)
// 5
.presentationBackgroundInteraction(.enabled(upThrough: .large))
}
}

struct TextFieldGrayBackgroundColor: ViewModifier {
func body(content: Content) -> some View {
content
.padding(12)
.background(.gray.opacity(0.1))
.cornerRadius(8)
.foregroundColor(.primary)
}
}

Читать статью

#туториал
👍27👏21
🤩Подборка бесплатных API на любой случай жизни

Здесь вам и база данных продуктов/рецептов для приложений о ЗОЖ, и коллекция цитат знаменитых людей, и база данных с видеоиграми, и многое другое. Одним словом, маст хэв для ваших проектов.
8👍3😁2🤔2
🤨💥 Еще один подход к дебагу приложений на iOS. LLD-команды могут значительно помочь в отладке приложений для iOS, особенно когда вы сталкиваетесь со сложными проблемами, которые стандартные средства отладки могут не полностью устранить.

🔹 frame variable -T
Use Case: когда у вас есть переменная с неясным типом и необходимо быстро определить ее тип данных.
Пример: если у вас есть переменная с именем response и вы хотите узнать ее тип, используйте переменную frame -T response.

🔹 settings set target.language swift
Use Case: когда вы отлаживаете смешанный проект Swift и Objective-C и хотите обеспечить правильную оценку выражений.
Пример: settings set target.language swift.

🔹 expr -l Swift — myArray.map { $0 + 1 }
Use Case: для вычисления выражения Swift без изменения кода.
Пример: если у вас есть массив myArray, вы можете использовать expr -l Swift -- myArray.map { $0 + 1 }, чтобы добавить 1 к каждому элементу.

🔹 image list -o -f
Use Case: для просмотра списка загруженных модулей с путями к их файлам для устранения неполадок.
Пример: использование image list -o -f, для просмотра всех загруженных модулей и путей к ним.

🔹 register read
Use Case: когда нужно проверить значения регистров процессора, чтобы понять состояние софта.
Пример: использование register read для проверки значений регистра во время сбоя или неожиданного поведения.

🔹 memory write -s 4–0x12345678 0xdeadbeef
Use Case: для изменения определенного адреса памяти во время отладки.
Пример: использование memory write -s 4 -- 0x12345678 0xdeadbeef, чтобы изменить данные по адресу 0x12345678 на 0xdeadbeef.

🔹 watchpoint modify -c ‘(old_val != new_val)’ variable
Use Case: когда необходимо отслеживать изменения значения переменной с определенным условием.
Пример: изменение watchpoint в myVariable, чтобы она запускалась при изменении ее значения, используя watchpoint modify -c '(old_val != new_val)' myVariable.

🔹 disassemble -c 10 — name functionName
Use Case: для проверки ассемблерного кода конкретной функции, чтобы понять ее поведение.
Пример: разбор первых 10 инструкций функции с именем myFunction с помощью disassemble -c 10 --name myFunction.

🔹 breakpoint command add — one-shot true 1.1
Use Case: когда необходимо выполнить определенную команду один раз при достижении точки останова.
Пример: добавление команды в точку останова 1.1, которая выводит сообщение с помощью breakpoint command add --one-shot true 1.1.

🔹 type lookup -r ‘^Swift.Array’
Use Case: необходимо найти все типы Swift, соответствующие определенному шаблону.
Пример: найти все типы, начинающиеся со Swift.Array, используя поиск по типу -r ^Swift.Array.

#туториал
👍112
😎💪🔥 Интеграция Jetpack Compose UI в существующую базу Epoxy

Шаг 1: Рассмотрим модель Epoxy в текущей кодовой базе, которая имеет Epoxy RecyclerView для отображения списка элементов:

@EpoxyModelClass(layout = R.layout.epoxy_item_layout)
abstract class SampleEpoxyModel : EpoxyModelWithHolder() {

@EpoxyAttribute
lateinit var title: String

override fun bind(holder: Holder) {
holder.titleTextView.text = title
}

class Holder : EpoxyHolder() {
lateinit var titleTextView: TextView

override fun bindView(itemView: View) {
titleTextView = itemView.findViewById(R.id.titleTextView)
}
}
}

Шаг 2: Создадим простой компонент compose, который нужно интегрировать в приведенную выше модель:

@Composable
fun ComposeItem(name: String) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
) {
Text(text = "Hello, $name!")
}
}

Шаг 3: Теперь интегрируем компонент UI Jetpack Compose в существующую модель:

@EpoxyModelClass(layout = R.layout.epoxy_item_layout)
abstract class ComposeEpoxyModel : EpoxyModelWithHolder() {

@EpoxyAttribute
lateinit var title: String

override fun bind(holder: Holder) {
// Set up the Compose UI within the existing view holder
val composeContainer = holder.itemView.findViewById(R.id.composeContainer)
composeContainer.setContent {
ComposeItem(title = title)
}
}

class Holder : EpoxyHolder() {
lateinit var itemView: View

override fun bindView(itemView: View) {
this.itemView = itemView
}
}
}

Шаг 4: Создадим контроллер Epoxy, который заполняет RecyclerView экземплярами модели Epoxy

class MyEpoxyController : TypedEpoxyController>() {
override fun buildModels(data: List?) {
data?.forEach { name ->
composeEpoxyModel {
id(name)
name(name)
}
}
}
}

Шаг 5: Интегрируем контроллер Epoxy с RecyclerView в активити или фрагмент:

class MainActivity : AppCompatActivity() {

private val epoxyController = MyEpoxyController()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val recyclerView: EpoxyRecyclerView = findViewById(R.id.recycler_view)
recyclerView.setController(epoxyController)

val data = listOf("Alice", "Bob", "Charlie")
epoxyController.setData(data)
}
}

#туториал
👍16🔥21
😎 Очередной #дайджест по Kotlin, Swift и кроссплатформе

✍️ Лучшие практики обработки ошибок в Kotlin — реализация обработки ошибок с помощью Sealed классов, функций высшего порядка, Retrofit и прочих инструментов

✍️ Простой Jetpack Compose Tabs на фрагментах — создание для приложения верхнего меню из табов на фрагментах и активити

✍️ AppFlowy — опенсорсная альтернатива Notion

✍️ Тестирование Flutter-приложений c помощью Appium — автоматизация тестирования опенсорсным клиент-серверным инструментом

✍️ Продвинутые акторы в Swift — вариант использования акторов на примере приложений с аутентификацией

✍️ Как стать лучшим разработчиком iOS — некоторые интересные и важные советы разработчика для развития
👍27🥰31
Swift 6: готовьте ваши Xcode проекты

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

Чего ожидать от Swift 6?

Все релизы Swift 5.x готовятся к выпуску Swift 6 и достижению целей, поставленных на пути к Swift 6. Первоначальный выпуск поддержки конкурентности улучшен за счет proposals. Вы можете ожидать аналогичных улучшений для выпуска Swift 5.8 existentials и opaque types, который последовал за манифестом, а также для новой поддержки макросов в Swift 5.9.

Готовьтесь заранее

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

Подробнее

#обновление
🥰8👍3🌚2
👈 🧠 👉 Расширенное управление памятью с помощью Unsafe Swift

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

В статье рассматриваются расширенные возможности Swift по управлению памятью посредством использования его «небезопасных» конструкций, таких как UnsafeMutablePointer и UnsafeRawPointer.

Роль Unsafe Swift

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

Меры предосторожности и предостережения

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

Соединение Swift и C

Когда дело доходит до взаимодействия с библиотеками C из Swift, решающее значение имеет фундаментальное понимание структуры памяти и структур данных. UnsafeMutablePointer и UnsafeRawPointer в Swift предлагают способы устранить разрыв между высокоуровневым управлением памятью в Swift и низкоуровневым манипулированием памятью в C.

Управление указателями для вызовов функций C

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

Подробнее

#обучалка
6👍4
🎉🎉 Можете юзать Android 14. Кодовое имя в этот раз: Upside Down Cake. В релизе более 60 обновленных фич, среди них: интернационализация, переработанный UI/UX и графика, кастомные экшены, обновления в OpenJDK 17и масса другого.

И еще немного новостей в формате видео:

Predictive Back Gesture
Ограничение на установку старых приложений
Нелинейное масштабирование размера текста
Foreground Service
BroadcastReciever
Data Safety в системе
Унификация работы Foreground Service

#новости
6🎉2🥰1👏1
Предлагаем рассмотреть возможности Android Studio, позволяющие быстрее ориентироваться в коде: находить нужные фрагменты и выявлять связи между ними.

Что тут как

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

Хлебные крошки для блоков кода

Как воспользоваться: кликнуть ПКМ на любой номер строки -> Breadcrumbs -> Top/Bottom.
После активации Breadcrumbs появляется динамическое отображение «хлебных крошек» блока кода в фокусе.
Удобно использовать, если в одном файле несколько классов: сразу видно, в каком классе расположен блок кода.

Открыть текущий файл в древе

Первый вариант: чтобы Android Studio развернула древо до открытого в редакторе файла, нужно нажать кнопку Select Opened File.
Второй вариант: Ctrl (Windows) / Command (macOS) + кликнуть ЛКМ на название пакета. Студия развернёт выбранную папку.

Умный поиск

Как воспользоваться:
Дважды нажать кнопку Shift.
В появившемся окне можно написать:
название файла/класса/функции/переменной;
id View/ресурса;
название функции Android Studio;
название функции VCS (например, Compared with Branch).

Подробнее

#туториал
🥰2118🤩11🔥10👏10
В ролике пойдет речь о Swift, а конкретно — о простой реализации архитектурного паттерна MVVM на примере табличного приложения с запросами, парсингом данных и отображением их на экране.

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

Смотреть

#туториал
5👍3🥰2
Нашли для вас видос о судьбе программиста, живущего в Новой Зеландии — 1С-разработчик, который красил заборы, доил коров, а потом стал мобильным разработчиком 😂😂😉

Он приехал на 1 год для учебы в IT, получил рабочую визу, нашел работу и подал на резидентство. Через 5 лет можно получить гражданство и ехать в Австралию — цель гостя ролика.

Смотреть
👍7👏42
На митапе от Ozon Tech подробно обсудили дизайн-систему — продукт, который структурирует набор компонентов и гайдлайнов. Это позволяет дизайнерам и разработчикам создавать последовательный и согласованный визуальный язык для продуктов и услуг компании.

Программа встречи:

🔹 «Декларативная дизайн-система: Figma + SwiftUI/Jetpack Compose». Рассказ об особенностях дизайн-системы, разрабатываемой с помощью декларативных технологий – SwiftUI и Jetpack Compose. Общую структуру компонентов дизайн-системы, как компоненты в Figma соотносятся с кодом.
🔹 «Snapshot-тесты и как они помогают тестировать дизайн-систему». Внедрение snapshot-тестов, тестирование дизайн-системы и как решаются возникающие проблемы.
🔹 «Дизайн-система с BDUI, как готовить». Какие ограничения BDUI добавляет на дизайн-систему и особенности такой дизайн-системы. Какие ошибки совершаются и советы, как готовить с BDUI и без.

#мероприятие
5🔥3👏3
😎 Очередной #дайджест по мобильной разработке

✍️ 10 советов по повышению качества вашего iOS-кода — шаблоны расширения для группировки фрагментов кода, создавать переменные и функции с описательными именами и прочие.

✍️ Что происходит, когда вы запускаете программу — как работает процессор, как несколько процессов работают одновременно, зачем нужен libc, как идет взаимодействие с памятью

✍️ Рефакторинг многомодульного проекта с Konsist — как использовать Konsist в реальном проекте

✍️ Продвинутые трюки lldb для Swift — хороший разбор возможностей, вспомогательных методов и их сочетания с брейкпоинтами

✍️ Потокобезопасность swift через - lock — блокировка доступа к переменной во время чтения или записи для гарантированного эксклюзивного доступа
🥰84👏4🔥3😁3
Совместимость версий Gradle и Java: Руководство для начинающих

Независимо от того, как долго вы работаете с Android, вы всегда сталкиваетесь со странными ошибками. Чем больше времени вы потратите, тем больше нестандартных ситуаций и новых вещей вы узнаете.

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

#туториал
👍73
🧑‍🎓✍️ Объяснение, понимание и использование размеров SwiftUI

В Swift UI чрезвычайно важная концепция размеров стала несколько загадочной. Установка размеров или их получение не так интуитивно понятны, как можно было бы ожидать.
Эта статья должна сделать более понятным, что творится с размерами в SwiftUI с точки зрения компоновки, помогая вам понять и освоить значения и способы их использования. А еще, это даст более глубокое понимание механизма компоновки SwiftUI, создав копии модификаторов frame и FixedSize view, которые соответствуют протоколу компоновки.

А в этой статье вы больше углубитесь в понимание механизма компоновки SwiftUI, имитируя модификаторы вида frame и FixedSize, и познакомитесь на нескольких примерах с нюансами, о которых следует помнить при верстке.

#гайд
👍63🔥2
😱💰 Unity вводит новую систему оплаты для разработчиков

C 1 января 2024 года будет введена схема ценообразования принципу «плати за загрузки».

🔹 Плата за Unity Runtime будет взиматься каждый раз, когда игра, отвечающая требованиям, загружается конечным пользователем.
🔹 Для Tier-1 рынков это 20 центов за каждую установку.
🔹 Чтобы попасть под такое налогообложение игра должна достичь пороговых значений - для Unity Personal и Unity Plus это $200,000 дохода и 200,000 установок за все время. После этого за каждые 100,000 загрузок нужно будет платить $20,000.
🔹 Изменения вступают в силу 1 января 2024 года и все начнет считаться только с этого момента.
🔹 Изменения ожидаемо вызвали бурления. Под действие новых тарифов могут попасть пиратские игры, демоверсии, загрузки с нескольких устройств. Кроме того, существует опасение, что злоумышленники смогут манипулировать оплатой, постоянно снова скачивая игры в знак протеста или недовольства.
🔹 Правда, Unity планирует внедрит средства обнаружения мошенничества и позволит разработчикам сообщать о возможных случаях злоупотреблений.
🔹 Отказаться от новой оплаты для уже вышедших или находящихся в стадии релиза игр уже фактически никто не может, так как менять движок (вероятно) будет дороже, чем платить Unity.

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

#новость
👏6🔥4
Когда использовать Swift Concurrency

🔹 Асинхронные операции. Конкурентность упрощает написание кода для таких операций, как сетевые запросы, файловый ввод-вывод или запросы к БД и управление им.
🔹 Адаптивные пользовательские интерфейсы. Используйте при разработке UI, чтобы он оставался адаптивным при выполнении фоновых задач. Например, извлечение данных из Интернета должно выполняться асинхронно, чтобы избежать блокировки основного потока.
🔹 Параллельная обработка. Если у вас есть задачи, требующие больших вычислительных затрат, которые можно распараллелить, рассмотрите возможность использования конкурентности для распределения рабочей нагрузки между несколькими задачами или потоками, используя преимущества многоядерных процессоров.
🔹 Предотвращение дэдлоков. Конкурентность может помочь избежать дэдлоков, когда нескольким задачам требуется одновременный доступ к общим ресурсам, используя структурированную конкурентность и акторы.

Подробнее

#туториал
8