Библиотека мобильного разработчика | 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
🔥✍️ Если вы пробовали писать виджеты, то знаете, насколько это больно и неприятно.
Но с появлением Compose, начали создавать интересный фреймоврк — Jetpack Glance, который позволяет создавать виджеты, используя Compose: а это значит, что стало меньше ограничений, больше возможностей для дебага, да и вообще создавать их приятнее.

Зависимости:

Чтобы добавить зависимость от Glance, пропишите репозиторий Google Maven в проект.
А для необходимых артефактов добавьте следующие зависимости в build.gradle:

dependencies {
// Для поддержки Glance
implementation("androidx.glance:glance:1.0.0-rc01")
// Для поддержки AppWidgets
implementation("androidx.glance:glance-appwidget:1.0.0-rc01")
// Для поддержки Wear-Tiles
implementation("androidx.glance:glance-wear-tiles:1.0.0-alpha05")
}
android {
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.1.0-beta03"
}
kotlinOptions {
jvmTarget = "1.8"
}
}

Эта штука пока находится в стадии релиз-кандидата (до этого 5 альф и 1 бета), поэтому есть крупный шанс, что оно таки увидит свет, а значит, нужно готовиться 💪🧑‍💻

#софт
6👏4🥰1
Пишете под iOS или Android? Тогда скорее подавайте заявку на участие в мероприятии, которое пройдет 16–17 сентября.

Приглашаются разработчики на Swift под iOS и на Kotlin или Java под Android с опытом от трех лет.

Как проходит Mobile Weekend Offer:

Вступительная часть: 30 минут. Расскажут о проектах и процессе интервью
Кодинг и общение с экспертами: 120 минут. Попросят решить несколько задач, спросят про ваш подход к работе
Знакомство с командами: 60 минут. Познакомят вас с будущими коллегами из разных проектов
Оффер. Если все прошло хорошо, сделают оффер в течение трех дней

#мероприятие
7🥱7🤔2
😎 Очередной #дайджест по Kotlin, Swift и кроссплатформе

✍️ Простая анимация для всплывающего окна — реализация простой анимации для UIView из ViewController и кнопки

✍️ Изучаем новый Preview Macro на Swift UI и UIKit — работа с изображением с помощью PreviewProvider, UIViewController и кнопки с переходом

✍️ Кодогенерация. KAPT. KSP. Manual DI — для избавления от рефлексии, которая сильно тормозит скорость работы приложения в рантайме

✍️ Пошаговое руководство по тестированию скриншотов в Android — как реализовать тестирование скриншотов с помощью библиотеки Shot и отслеживать регрессию

✍️ Распознаем паспорт РФ в PWA — все работает через несколько скриптов: работа с камерой, передача потока изображений, сервис воркера и определение WASM сборки

✍️ Чего стоит ожидать в React Native — анализ развития опираясь на фреймворк Expo, работы группы Software Mansion, Callstack и Meta
👍21🔥42👏1
Еще лет 10 назад, только работники финансовой отрасли, помощники руководителей и менеджеры могли жаловаться на деградацию своих навыков и потерю знаний.

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

В целом по рынку труда 46% трудоустроенных россиян отмечают, что их работа позволяет развиваться в профессии, 35% не замечают роста и развития, но и не теряют навыки, 12% заявили о негативном влиянии работы на профессиональное развитие.
6👍2👏1
«Библиотека программиста» продолжает поиски контент-менеджера для ведения телеграм-каналов

Ищем человека, который грамотно пишет, разбирается в контенте и в одной из этих тем:
👉С++
👉Frontend
👉мобильная разработка
👉тестирование

Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴

Подробнее о вакансии и форма для отклика — по ссылке.

Ждем вас в команде!
4
Почему 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