Подключайтесь к нашему Telegram-каналу Mobile Insights, где подборки статей и новостей выходят каждый день.
![](https://webcf.waybackmachine.org/web/20220529221243im_/https://habrastorage.org/webt/dn/bf/c5/dnbfc5ql4jbslrlrb1yq_jgtlsy.png)
Популярная мобильная ОС
А также зачистки всего связанного с пользователем и созданного им контента.
Пользователям AppStore Connect разлетаются письма с просьбой заглянуть на свои App Review Page, чтобы прочесть письмо счастья. Если коротко, то приложения без кнопки создания запроса на удаление аккаунта и всех связанных с ним данных, включая сгенерированный пользователем контент, в AppStore больше не пропустят.
Всем привет! Меня зовут Никита, я работаю в компании Технократия и занимаюсь iOS-разработкой. С сегодняшнего дня мы начинаем регулярный выпуск статей, в которых я буду рассказывать о современном подходе к написанию асинхронного кода в Swift.
Данный мини-курс будет логически разбит на серию небольших статей, в которых мы постепенно будем усложнять темы и смотреть на все более интересные примеры с использованием новой технологии.
Заказать пиццу — задача вроде бы простая, но всегда что-то может пойти не так. У пользователей могут возникнуть трудности на всех этапах: начиная с того, какую пиццу выбрать, и заканчивая получением заказа. В Додо Пицце есть контакт-центр, который помогает решать возникающие трудности. Раньше в него можно было только позвонить или написать по почте, а теперь можно связаться в чате.
Я разрабатываю мобильное приложение Додо Пиццы для iOS. В этой статье расскажу, как устроен процесс разработки фич в Додо Пицце на примере интеграции чата в приложение. Как наша кросс-функциональная команда поняла, что он нужен, через какие этапы прошла и зачем программисты операторами в контакт-центр работать ходили.
Захват self в замыкании — обычная вещь в Swift, которая скрывает множество нюансов. Нужно ли делать его weak, чтобы избежать цикла ссылок? И является ли проблемой сделать его weak постоянно?
На момент публикации - 10 мая 2022, SwiftUI имеет всего лишь refreshable(action:) модификатор для List компонента, чтобы пользователь имел возможность обновить контент на экране (так называемый pull to refresh). Очевидно, что если разработчику потребуется отобразить список в виде отличном, от того, который предоставляет List (например, в несколько колон), то, к сожалению, придется смириться с тем, что контент на экране обновить с помощью pull to refresh будет нельзя. Или же все-таки можно?...
В этой статье я продемонстрирую, как можно использовать паттерн Flow Coordinator (далее флоу-координатор) в SwiftUI, чтобы отделить логику навигации от логики представления.
Один из распространенных UI элементов в iOS является UICollectionView.
Часто при построении таких коллекций возникает необходимость обновления данных, например добавления новых ячеек в коллекцию.
Рассмотрим простой пример - список новостей, вертикальный UICollectionView. При пролистывании списка вниз, необходимо подгружать старые новости. В данном случае все просто - нужно обновить данные и выполнить один из методов:
В своей предыдущей статье я рассказал о том, почему считаю, что мы можем значительно улучшить управление UI State (состояние пользовательского интерфейса) между View (представление) и ViewModel (модель представления) в Android, используя архитектуру Model-View-Intent (модель-представление-намерение) (MVI) с помощью Finite State Machine (машина с конечным числом состояний. конечный автомат) (FSM).
В этой статье я подскажу вам шаги, необходимые для модернизации этого решения до уровня Kotlin Multiplatform Mobile (KMM), где можно воспользоваться общим исходным кодом, содержащим MVI+FSM, так что обе платформы — Android и iOS — могут унаследовать его преимущества, отвечая только за платформозависимые реализации: UI/UX.
Мобильным разработчикам давно знакома конференция Mobius, но в этот раз она пройдёт в необычном формате. В конце мая поучаствовать можно будет в онлайне (как в предыдущие два года), а вот в июне будет ещё и офлайн-день в Петербурге.
Онлайновая часть будет сосредоточена на докладах, а офлайновая на живом общении: там будет сделано всё, чтобы участники могли вдоволь пообщаться и друг с другом, и со спикерами. Но понятно, что без докладов не обойдётся и в офлайне.
И сейчас, когда большинство тем докладов уже известно, расскажем Хабру, о чём именно они будут.
Привет! Меня зовут Владислав Сединкин, я работаю iOS-разработчиком в СберМаркете. Сегодня я расскажу, как мы проводим юнит-тестирование, с какими сложностями сталкивались при написании тестов и как их решали.
Я выступал с этим докладом на iOS Meetup | СберМаркет Tech, здесь его сжатая версия.
В этой статье я расскажу о проблемах с которыми я столкнулся при подключении тяжелых зависимостей к iOS проекту с помощью Swift Package Manager и о способе их решения.
Достаточно плотно разработкой программного обеспечения для часов я занимаюсь с 2017 года. За этот период сменилось 4 версии WatchOS (5, 6, 7, 8). Появилось больше функционала и исправлено множество баг с внедрением каждой новой версии Swift. Complications стали более самостоятельной частью приложения.
За 5 лет работы в сфере разработки приложений для часов мне пришлось столкнуться с множеством различных проблем и задач. Я хотел бы поделиться опытом и получить критические замечания относительно проделанной работы. Заранее сделаю оговорку, что решения, используемые в моей разработке, не претендуют на истинно верные. Не буду спорить, что что-то можно было бы сделать по-другому и лучше.
Главным событием этой недели было Google I/O, на которой представили некоторые нововведения, зарелизили ряд новых версий библиотек и инструментов. Из интересного: вышла вторая Beta Android 13, запустили сервис Google Play SDK Index, представили Flutter 3, выложили исходники приложения Now in Android. Все ссылки в дайджесте.
Дайджест и другие полезные материалы для мобильных разработчиков доступны в моем тг-канале Mobile Native, присоединяйтесь.
Android 🤖
• 13 Things to know for Android developers at Google I/O!
• Google Play SDK Index
• Что нового в инструментах Android-разработки
• Что нового в Jetpack Compose (Beta 1.2)
• Now in Android - a new, open source, real-world sample app
• Вышла вторая Beta Android 13
• Android Lint. Подборка
• Fragula – swipe-to-dismiss extension for navigation component library for Android
• Письмо счастья: как мы разделили наши сборки для AppGallery и Google Play
• Compose performance
• Jetpack DragAndDrop Released 1.0.0
• Here's a productivity hack to save tens of engineering hours* when working with Jetpack Compose!
• Android Studio Chipmunk Released
• Understand Proguard Generated Files and Manually De-obfuscate Stacktrace
• Build a Custom IntelliJ Code Inspection Plugin
• How To Use Android’s Proto DataStore With Kotlin Support
• The Guide To Your First Annotation Processor with KSP (And Becoming A Kotlin Artist)
• Airbnb uses Jetpack Compose to empower devs to do their best work
iOS 🍏
• Apple отключила оплату в App Store со счёта мобильного у «Мегафона», Yota и Tele2
• Write Beautiful Code With Swift Result Builder
• Modeling errors in Swift
• A flexible way to handle and alert errors in SwiftUI
• How do we use SwiftUI in the Medium iOS application
• Заполнители типа в Swift: что это такое и когда их следует использовать
• On iOS applications architecture
• 5 актуальных расширений Xcode для оптимизации разработки
• 10 Tips and Tricks for Swift Developers
• How to Read Websites in SwiftUI — Data Scraping in iOS
• Swift: A few tips for improving code quality
• SSL/Certificate Pinning — iOS 14.0 Never easy before
• Clean Architecture: iOS App
• Creating hex-based colors in UIKit, AppKit and SwiftUI
• Core Data Relationship in Swift 5— made simple
• Building a document scanner in SwiftUI
• Bottom Sheet, shall we drop the formalities?
• Introduction to Dependency Injection with Needle - The Uber Way
• SwiftUI Still Isn’t Production-Ready
Заполнители типа (type placeholders) — это новая языковая фича, представленная в Swift 5.6 (Xcode 13.3).
Сама концепция очень проста - вместо указания конкретного типа мы можем поставить _ (заполнитель типа), который предписывает компилятору самому определить заполняемый тип.
В следующем примере я использую заполнитель типа для name
, который впоследствии разрешается в String
.
Привет! Меня зовут Саша Свиридов, я руковожу отделом мобильной разработки в Ozon. В моей команде чуть больше 80 человек — это Android- и iOS-разработчики и QA-инженеры. Мы делаем основное приложение Ozon для покупателей. Моя команда состоит из семи кроссфункцинальных групп разработки, каждая из которых отвечает за определенный скоуп задач. Спектр наших задач очень широк: мы разрабатываем чаты на сокетах, работаем с картографией, с потоковым видео, пушами, с аналитикой, со сложным UI. Пожалуй, у нас нет только GameDev:)
Всего в Ozon больше 150 мобильных инженеров, которые развивают приложения для покупателей, продавцов, Ozon Fresh, FinTech, курьеров и сотрудников пунктов выдачи заказов. Словом, нам есть что рассказать.
Чем поделимся на митапе:
— Какие метрики собираются и как мы боремся за перформанс приложения.
— Как мы делали плавный скролл для нагруженного UI, и при этом не переверстали все приложение. Рассмотрим необычные подходы, которые мы опробовали на практике, и расскажем, что из этого получилось.
— Как работает новая модель многопоточности. На примерах разберём, что нового появилось в Swift и как это подружить со своим кодом.
— Круглый стол, на котором мы обсудим темы, предложенные вами при регистрации на мероприятие.
Подробнее про наш стек и программу — под катом.
Привет, Хабр! Каждую неделю, в своем телеграм-канале Mobile Native, я публикую дайджест с интересными и полезными материалами (новости, статьи, инструменты, библиотеки и т.д.) для мобильных разработчиков. Решил попробовать публиковать эту рубрику и на Хабре. Посмотрим, что из этого получится.
Android 🤖
• Dependency Inversion Principle: How Google Developers write code
• Как мы используем фича-флаги в мобильном приложении QIWI Кошелек
• Google запускает бесплатный курс Android Basics with Compose
• Опубликована программа Google I/O
• The first developer preview of Privacy Sandbox on Android
• Google Play запретил разработчикам загружать и обновлять платные приложения в России
• Learn Dagger 2 to Hilt for Android Easily in under 10 Minutes
• Jetpack Compose Dropdown
• S.O.L.I.D Principles (Examples in Kotlin)
• Kotlin-inline, crossline, noinline function and reified: Everything you need to know(Android) — Part 1
• 7 things to keep in mind while building jetpack composable’s.
• Architecture MAD Skills series wrap up
• Топ вопросов работодателю от Android-разработчика
• Isolate Koin Within an Android Module
• Kotlin, обрабатываем исключения в корутинах правильно
• The curious case of crashing Workers
• Material Components Android 1.6.0 Released
• Конвергенция в многомодульном приложении
• Passive Views: keep your UI code simple and stupid
• CI-CD: Firebase App Distribution with Fastlane on Android
• Creating reliable tests for Android notifications
iOS 🍏
• I replaced my native iOS app with a cross platform web app and no-one noticed
• Measuring app performance in Swift
• Types of memory in swift
• Improve Performance in Your iOS Applications — Part 1
• Swift 5.7: Unwrapping Optionals Gets an Improvement
• Clarifying criteria & new timing extension for App Store Improvements process
• Тест-ревью: как прошли два года написания unit-тестов
• Is It Possible to Have a Half-modal View in SwiftUI?
• Swift visitor design pattern
• Two Ways to Unit Test Notification Center in Swift
• Send Events from SwiftUI to UIKit and Vice Versa
• AsyncThrowingStream and AsyncStream explained with code examples
• AttributedString’s Codable format and what it has to do with Unicode
• SwiftUI Supporting External Screens
• Flow Navigation With SwiftUI (Revisited)
• Делаем патч для Pods библиотеки
• Как нативно визуализировать голос в iOS
• 6 Tips to improve Coding of Swift