Сёрф iOS-разработка
1.34K subscribers
384 photos
25 videos
95 links
Download Telegram
Начинаем эфир! Вопросы оставляйте в комментах под этим постом и в чате 😌
👍1
Live stream finished (1 hour)
Media is too big
VIEW IN TELEGRAM
Делимся записью эфира для тех, кто не смог прийти ☺️

И прикрепляем полезные материалы от Антона. Презентация отдельным файлом в комментариях.

Если остались вопросы, задавайте в чате, ответим.

У нас к вам всего два вопроса👇
👍5
Понравились формат и тематика эфира?
Anonymous Poll
85%
Да
15%
Нет
👍1
Удобно ли было встречаться в такое время?
Anonymous Poll
68%
Да
32%
Нет
👍1
Приходи на iOS-тусовку с участием Surf 🤩

Мы с друзьями из Кошелька и Тинькофф приглашаем тебя на iOS-митап! Обсудим интересные кейсы в разработке, поделимся опытом и просто приятно проведём время.

В программе три выступления:

1️⃣ Зачем писать private
Богдан Маншилин, Engineering Manager в Кошельке
История одного проперти в классе фреймворка навигации, который должен был быть приватным, но вместо этого испортил всю задумку core-фреймворка.

2️⃣ Дружим Swift Concurrency с имеющейся кодовой базой
Тимур Хамидов, Старший разработчик, Отдел разработки мобильных платформ Тинькофф
Как подружить continuation с задачами и как тестировать асинхронный код без ожиданий — на примере проблем, с которыми столкнулась команда при применении Swift Concurrency.

3️⃣ SwiftUI — внедрение в аутсорс разработку
Владислав Климов, iOS Developer в Surf
Попытки внедрения и подходы, которые в Surf используют для навигации. Это история об исследовании с результатами, но открытым концом и интересными техническими решениями.

Когда и куда приходить

🗓 8 декабря
19:00
📍 Онлайн: регистрация
🏢 Офлайн: Санкт-Петербург, адрес по ссылке
3👍1
Async/await в Swift

Async/await появился в Swift больше года назад. Но многие разработчики всё ещё не понимают, в чём его преимущества перед GCD и Operation и может ли он заменить реактивный фреймворк типа Combine. Давайте разберёмся в этом вопросе.

Async/await был создан, чтобы заменить GCD и Operation. Вместе их лучше не использовать: они основаны на разных механизмах.

Механизм работы
В Async/await используется собственный пул потоков. Количество используемых потоков не превышает количество ядер процессора. 

Это стало возможным благодаря тому, что Async/await не блокирует потоки: поток может не простаивать в ожидании, а переключится на другую задачу. 

Например: отправляем запрос на сервер. Во время ожидания ответа от сервера поток может заниматься чем-то другим.

Другие преимущества
Код становится проще: более последовательным, нет необходимости передавать множество колбэков. 
Обработка ошибок тоже становится проще: теперь можно использовать стандартный механизм try-catch, а не передавать ошибки в колбэках.

Может ли Async/await заменить Combine
К сожалению, нет. Вместе с Async/await появилась AsyncSequence, которая позволяет асинхронно работать с коллекциями. Но AsyncSequence не обладает всеми возможностями, которые есть в Combine. Тем не менее, Async/await и Combine вполне можно использовать вместе.

Async/await поддерживается с iOS 13.
4🔥3👍1
iOS-тусовка с участием Surf уже завтра в 19:00 🔥

Мы с разработчиками из Кошелька и Тинькофф ждём тебя! Расскажем про документацию, фреймворки, архитектуру и кейсы из разработки.

Приходи и зови друзей, делимся главными ссылками:

Регистрация.
Программа.
👍2
Как создать виртуальную карту лояльности для добавления в Wallet. Часть 3: связываем карту с приложением

С вами Влад Янковенко, iOS TeamLead, и Александр Чаусов, iOS TechLead. Продолжаем разбираться, как создать карту для Wallet.

В предыдущих сериях: 
🔹 Начало работы: как сделать файл .pkpass
🔹 Как настроить контент

Работы в приложении
Сводятся к четырём этапам:
• Добавить кнопку добавления в Apple Wallet, если есть кошелек.
• По тапу на кнопку послать запрос на сервер, принять от него Data.
• Из полученной Data cгенерить PKPass, обработать возможные результаты.
• Добавить в кошелёк путём вызова PKAddPassesViewController.

Более детально описано в документации

Добавление кнопки
Для кнопки добавления в кошелёк надо использовать системную кнопку PKAddPassButton. Гайдлайны 
Перед добавлением можно проверить, есть ли поддержка Apple Wallet на устройстве. 

Генерация PKPass из Data
При создании PKPass мы можем столкнуться с несколькими результатами: ошибка создания, успех. Дополнительно можем проверить наличие его в кошельке методом PKPassLibrary().containsPass(pass: PKPass).

Для теста можно сделать вспомогательный класс, который будет искать в проекте Pass.pkpass и возвращать его.  
 
Добавление карты в кошелёк 
Для добавления карты в кошелек создаём экзмепляр PKAddPassesViewController. Скармливаем ему в конструкторе PKPass, созданный из Data, полученной от сервера. И показываем PKAddPassesViewController на экране приложения. 

Дополнительно мы можем подписаться на делегат PKAddPassesViewControllerDelegate, чтобы отловить событие завершения addPassesViewControllerDidFinish(_). В нём можно провести различные проверки, но тогда закрыть контроллер придется там же вручную.
👍5🔥2👏1
Как создать виртуальную карту лояльности для добавления в Wallet: полезные ссылки

🔹 Документация 
🔹 Описание полей в Json-файле 
🔹 Human Interface Guidelines для Wallet 
🔹 Видео, как создать .pkpass 
🔹 Обзорная статья What is PassKit
🔹 Статья про Apple Wallet на русском 
🔹 Статья Creating your Pass. Материал древний, но именно там мы наконец-то нашли поле altText у баркода.
🔥42👍2
Списки и галереи — быстро и удобно. Знакомство с библиотекой RDDM

UITableView
и UICollectionView — проверенные контейнеры для вёрстки списков и галерей. Но чтобы их добавить и настроить, необходимо написать много сопровождающего кода.

Например, для таблицы нужно:
🔹определить UITableViewDataSource,
🔹определить UITableViewDelegate,
🔹описать ячейку UITableViewCell,
🔹не забыть зарегистрировать тип ячейки,
🔹вызвать reloadData.

Чем больше ячеек, тем больше получается кода, размазанного по разным сущностям.

Когда-то давно мы в Surf 🏄‍♂️ устали от этого и создали RDDM — библиотеку, позволяющую удобно и быстро наполнять UITableView или UICollectionView, а также добавлять фичи с помощью плагинов.


Чтобы узнать больше, переходите в репозиторий проекта: там есть ExampleApp с примерами использования библиотеки и её фич.

Или прочитайте нашу статью об опыте добавления DiffableDataSource в RDDM.

💬 А каким инструментом для верстки списков и галерей пользуетесь вы? Пишите в комментариях 🙌
👍8🔥2🤩1
Карта для Wallet. Рекомендации по дизайну и аналитике 
Бывают ситуации, когда смежные отделы в компании, участвующие в проектировании приложения для iOS, понимают не все тонкости платформы. Одна из задач iOS-разработчика — предоставить все необходимые данные для проектирования и дизайна. 

Мы уже обсудили, как технически сделать карту лояльности для добавления в Wallet. Чтобы интеграция была качественно проработана с точки зрения дизайна и аналитики, подготовили эти рекомендации 👇👇👇

Для дизайнеров
🔹 Дать дизайнерам Human Interface Guidelines для кнопки добавления карточки на устройство, чтобы они понимали, как она выглядит и каких размеров.

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

Для аналитиков
🔹 Попросить собрать у заказчика необходимые данные, которые нужно поместить на задней части карты.

🔹 Если есть коробочное решение для программы лояльности, попросить выяснить у заказчика, нужно ли с ним интегрироваться для выпуска и менеджмента карт лояльности в Apple Wallet.

🔹 Если карты будут генерироваться сервером, узнать, какие «плюшки» добавить. Например:
— Разные strip-картинки на основе данных пользователя: на карте зоомагазина — кошка для владельцев кошек и собака для владельцев собак.
— Добавление локаций любимых магазинов, чтобы карта лояльности появлялась на lock-экране, когда пользователь оказывается рядом.
👍3🔥3👏2
Расширяемые ячейки

UITableView часто применяется для вёрстки списков. Однако не все знают, что этот элемент не поддерживает автоматическое изменение размера ячейки.

Представим, что нам дали задание добавить в список на UITableView ячейку, высота которой будет:
🔹увеличиваться на 50 пунктов по нажатию,
🔹уменьшаться до исходного значения при повторном нажатии.

Добавим кнопку, привяжем её края к краям ячейки и вынесем constraint высоты для обработки изменений.

Менять высоту будем тривиальным кодом buttonHeightConstraint.constant += isSmall ? 50 : -50. Полный код ячейки — на картинке ExpandableTableCell-1.

Запускаем приложение: что получится, видно на первой картинке. Изменения к высоте заметны только после прокрутки списка, то есть при переиспользовании ячейки.

Как заставить UITableView реагировать на изменения constraint-высоты сразу же?

Нужно вызвать функцию UITableView.performBatchUpdates(nil) после изменения constraint. Это заставит UITableView пересчитать высоту ячеек и отобразить изменения анимировано.

Какой результат получим, видно на второй картинке. Высота будет меняться сразу же после нажатия.

Однако использование этого метода изнутри ячейки требует поиск инстанса UITableView, что возможно лишь через копирование или рекурсивный поиск. Пример рекурсивного поиска — на картинке ExpandableTableCell-2.

Чтобы не копировать код поиска UITableView, мы создали протокол ExpandableItem и спрятали необходимый вызов за абстрактным ивентом.

Просто добавьте ячейке реализацию этого протокола и вызовите onHeightChanged.invoke(with: nil) в момент изменения высоты. Остальное RDDM сделает за вас. Пример использования ExpandableItem — на картинке ExpandableTableCell-3.

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

Чтобы узнать больше про возможности RDDM, переходите в репозиторий проекта: там есть ExampleApp с примерами использования библиотеки и её фич, таких как ExpandableItem.
🔥10👍4