Сервис ничего не хранит, не возвращает и не изменяет. У него есть единственный async throws метод, который принимает в себя модель для отправки запроса. Вопрос с моего собеса: сделаем сервис структурой или final-классом?
Anonymous Poll
4%
Класс, потому что так всегда делаем
16%
Класс, потому что так правильно (best practice)
3%
Класс, потому что никогда не делал сервисы структурами
1%
Класс, потому что никто не делает сервисы структурами
4%
Класс, чтобы не было сайд-эффектов
1%
Структура, потому что не люблю классы
44%
Структура, потому что ничего не хранит, не меняет и не возвращает, а значит класс не нужен
27%
Енам со статичным методом, потому что не хочу инициализировать такой простой сервис
❤1🔥1
#ios #uitest #xctest #bug #hint
Любопытный момент: оба скриншота сделаны при запуске одного и того же UI-теста, но внимательный глаз заметит разницу - слева у приложения
Не заметил, в какой момент тесты сломались и перестали уважать настройку
Еще раз повторю, что в обычном режиме работы приложение корректно распознает
Любопытный момент: оба скриншота сделаны при запуске одного и того же UI-теста, но внимательный глаз заметит разницу - слева у приложения
accentColor синий, т.е. дефолтный, а справа - черный (такой и должен быть).Не заметил, в какой момент тесты сломались и перестали уважать настройку
accentColor в assets, но вот фикс этой проблемы:
WindowGroup {
RootScreen()
.tint(.accent) // <- исправляет accentColor в тестах
}
Еще раз повторю, что в обычном режиме работы приложение корректно распознает
accentColor, и только в режиме UI-тестов нужен фикс.❤4👍2
#ios #automation #fastlane
Я уже рассказывал как мне нравится Xcode Cloud для публикации сборок - минимум настроек, все работает хорошо.
Вчера настроил публикацию скриншотов в пет-проекте с использованием
⚠️ Он работает медленно - сборка на ноуте (с
⚠️ Для публикации скриншотов в любом случае нужно или делать ручную работу, или запустить
Теперь про публикацию скриншотов через fastlane
Для наглядности вот логи:
Итого: с момента запуска команды до окончания публикации и сортировки скриншотов прошло 26 секунд - это намного быстрее, чем вручную публиковать скриншоты для двух локализаций на iPad/iPhone, еще и в правильном порядке.
В
Теперь важные нюансы.
1️⃣ Несмотря на возможность вручную загрузить скриншоты для нужных диагоналей с самых новых девайсов (iPhone 16 Pro Max, iPad M4),
Если попытаться загрузить скриншоты для 16 Pro Max и iPad M4, будут ошибки типа таких:
Да, я прочитал документ по ссылке из логов с ошибкой, и я нашел там iPhone 16 Pro Max + iPad Pro (M4), но
2️⃣ Если ваш аккаунт связан с несколькими командами разработки, то при настройке
3️⃣ По умолчанию
4️⃣ Лучше сразу настроить
Готовый fastfile можно посмотреть в гитхабе.
Я уже рассказывал как мне нравится Xcode Cloud для публикации сборок - минимум настроек, все работает хорошо.
Вчера настроил публикацию скриншотов в пет-проекте с использованием
fastlane, и выключил воркфлоу в Xcode Cloud, потому что:⚠️ Он работает медленно - сборка на ноуте (с
fastlane) занимает меньше минуты, а в облаке это растягивается на 5 минут⚠️ Для публикации скриншотов в любом случае нужно или делать ручную работу, или запустить
fastlaneТеперь про публикацию скриншотов через fastlane
Для наглядности вот логи:
[18:40:04]: Driving the lane 'ios upload_screenshots' 🚀
...
[18:40:09]: Starting with the upload of screenshots...
[18:40:11]: Deleted 'ru APP_IPAD_PRO_3GEN_129' - (0.814763 secs)
[18:40:11]: Deleted 'en-US APP_IPHONE_67' - (0.814563 secs)
[18:40:11]: Deleted 'ru APP_IPHONE_67' - (0.837923 secs)
[18:40:11]: Deleted 'en-US APP_IPAD_PRO_3GEN_129' - (0.915516 secs)
[18:40:12]: Number of screenshots not deleted: 0
[18:40:12]: Successfully deleted all screenshots
...
[18:40:17]: Uploaded './fastlane/screenshots/ru/iPhone 15 Pro Max-1-[18:40:21]: Uploaded './fastlane/screenshots/ru/iPhone 15 Pro Max-3-sortByDate.png'... (3.672329 secs)
[✔] Waiting for all the screenshots to finish being processed...
[18:40:28]: Successfully uploaded all screenshots
[✔] Sorting screenshots uploaded...
[18:40:29]: Successfully uploaded screenshots to App Store Connect
Итого: с момента запуска команды до окончания публикации и сортировки скриншотов прошло 26 секунд - это намного быстрее, чем вручную публиковать скриншоты для двух локализаций на iPad/iPhone, еще и в правильном порядке.
В
appstoreconnect для сохранения нужного порядка отображения скриншотов приходится загружать картинки по одной в желаемом порядке🙈Теперь важные нюансы.
1️⃣ Несмотря на возможность вручную загрузить скриншоты для нужных диагоналей с самых новых девайсов (iPhone 16 Pro Max, iPad M4),
fastlane так не может - нужно делать скриншоты на других девайсах, подробнее написал в ридми.Если попытаться загрузить скриншоты для 16 Pro Max и iPad M4, будут ошибки типа таких:
[16:44:44]: 🚫 Invalid screenshots were detected! Here are the reasons:
[16:44:44]: 🚫 Error: ./fastlane/screenshots/en-US/iPad Pro 13-inch (M4)-1-demoList.png - Invalid screen size (Actual size is 2064x2752. See the specifications to fix https://help.apple.com/app-store-connect/#/devd274dd925)
...
[16:44:44]: 🚫 Error: ./fastlane/screenshots/ru/iPhone 16 Pro Max-3-sortByDate.png - Invalid screen size (Actual size is 1320x2868. See the specifications to fix https://help.apple.com/app-store-connect/#/devd274dd925)
Да, я прочитал документ по ссылке из логов с ошибкой, и я нашел там iPhone 16 Pro Max + iPad Pro (M4), но
fastlane не может их опубликовать 🤔2️⃣ Если ваш аккаунт связан с несколькими командами разработки, то при настройке
fastlane нужно явно указать идентификатор команды в поле itc_team_id, пример есть в Appfile - даже если вы не знаете идентификатор, то при первом запуске команды для публикации скриншотов fastlane сам предложит выбрать команду, там и можно скопировать идентификатор и поставить в Appfile.3️⃣ По умолчанию
fastlane делает много всего в команде upload_to_app_store, и лучше сразу выключить лишнее, например, публикацию бинарного файла приложения, запуск precheck перед отправкой и т.д., более подробно про все эти настройки можно почитать в официальной документации к fastlane.4️⃣ Лучше сразу настроить
overwrite_screenshots на true, чтобы после загрузки новых скриншотов не приходилось вручную удалять старые.Готовый fastfile можно посмотреть в гитхабе.
Telegram
easy_dev991
#ios #xcode #xcodecloud #appledeveloper
Обзор на Xcode Cloud
Обзор на Xcode Cloud
🔥3
easy_dev991
Сервис ничего не хранит, не возвращает и не изменяет. У него есть единственный async throws метод, который принимает в себя модель для отправки запроса. Вопрос с моего собеса: сделаем сервис структурой или final-классом?
Когда в прошлый раз вы думали, что использовать для модели в ячейке коллекции/таблицы: класс или структуру?
Anonymous Poll
15%
Каждый раз думаю, это важно, вот на днях прямо было
16%
Обычно не думаю, просто делаю как принято в проекте
18%
Давно не было UIKit в работе, не приходится думать об этом
7%
Не думаю, делаю модель классом - вдруг понадобится использовать преимущества reference-типа
40%
Не думаю, делаю структуру
3%
Какая вообще разница? Можно одинаково использовать и то, и другое
🔥2
#ios #swift #swiftui #contest
Нужно сверстать стек, где есть несколько
Должно получиться примерно как на картинке.
Шрифт для
Шрифт для
Не используем
Вот готовые модели для превью:
Кто первый сделает, тот молодец 🚀
Нужно сверстать стек, где есть несколько
Text с одинаковой структурой:
private struct UserInfo: Identifiable {
let id = UUID()
let label: String
let value: String
}
Должно получиться примерно как на картинке.
Шрифт для
label: .system(size: 20, weight: .bold)Шрифт для
value: .system(size: 16, weight: .regular)Не используем
markdown в тексте.Вот готовые модели для превью:
let items: [UserInfo] = [
.init(label: "Почта", value: "test@example.com"),
.init(label: "Телефон", value: "+79123456789"),
.init(
label: "Адрес",
value: "117513, г. Москва, ул. Профсоюзная, д. 129, корп. 3, кв. 117, подъезд 5, этаж 8"
)
]
Кто первый сделает, тот молодец 🚀
👌3
#ios #swift #swiftui #hint
На днях добавлял SwiftUI-вьюху внутрь UIKit-ячейки для экрана с коллекцией.
Вьюха просто принимает на вход данные и показывает что-то внутри себя.
⚠️Но есть нюанс: на iOS < 16 нельзя просто так добавить SwiftUI-вьюху в ячейку - для этого нужно делать костыль с хостингом и т.д.
И вот я все сделал, но наткнулся на проблему: при первом появлении ячейки вьюха не успевает целиком отобразиться, и получается полная фигня. Зато если прокрутить экран вниз или вверх, чтобы вьюха исчезла, и снова вернуться к той ячейке, то все отлично.
На этом экране еще и кнопка есть для скролла к той самой ячейке - и при первом скролле к ней она выглядит плохо.
Решается эта проблема очень просто - можно добавить вьюхе два состояния: "загрузка" и "готово".
В "загрузке" показываем любой принятый в проекте индикатор загрузки или скелетон, а в "готово" - обычное состояние вьюхи.
Ну и в саму вьюху внутрь
✅Теперь при первом рендере этой ячейки появится индикатор загрузки, а потом сразу корректное состояние.
На днях добавлял SwiftUI-вьюху внутрь UIKit-ячейки для экрана с коллекцией.
Вьюха просто принимает на вход данные и показывает что-то внутри себя.
⚠️Но есть нюанс: на iOS < 16 нельзя просто так добавить SwiftUI-вьюху в ячейку - для этого нужно делать костыль с хостингом и т.д.
И вот я все сделал, но наткнулся на проблему: при первом появлении ячейки вьюха не успевает целиком отобразиться, и получается полная фигня. Зато если прокрутить экран вниз или вверх, чтобы вьюха исчезла, и снова вернуться к той ячейке, то все отлично.
На этом экране еще и кнопка есть для скролла к той самой ячейке - и при первом скролле к ней она выглядит плохо.
Решается эта проблема очень просто - можно добавить вьюхе два состояния: "загрузка" и "готово".
В "загрузке" показываем любой принятый в проекте индикатор загрузки или скелетон, а в "готово" - обычное состояние вьюхи.
Ну и в саму вьюху внутрь
onAppear добавляем смену состояний.✅Теперь при первом рендере этой ячейки появится индикатор загрузки, а потом сразу корректное состояние.
❤2🔥1
👀3👍2
#ios #appstore #appstoreconnect
Опубликовал приложение с площадками для воркаута под своим аккаунтом, т.к. отключили
Перед публикацией предполагал, что могут возникнуть сложности, т.к. вряд ли одобрят два приложения с почти одинаковым названием и полностью одинаковым дизайном.
Решил попробовать сначала отправить приложение на проверку, и не удалять старое приложение.
В результате получил временный бан от эпол в appstoreconnect, и они запросили мои документы (уже в третий раз за год).
Отправил им документы, бан сняли, как и в прошлые разы.
При этом завернули новое приложение по причине Spam 😁
Там перечисляли, что у меня и дизайн копирует существующее приложение, и код, и вообще полный дубликат.
Спросил их, можно ли опубликовать новое приложение после удаления старого - сказали можно.
✅Согласовал с владельцем сайта удаление старого приложения, удалил его, и теперь могу обновлять приложение уже в своем аккаунте в максимально удобном формате (через
Опубликовал приложение с площадками для воркаута под своим аккаунтом, т.к. отключили
Xcode Cloud для РФ и я не мог больше обновлять приложение на аккаунте владельца сайта workout.su. Перед публикацией предполагал, что могут возникнуть сложности, т.к. вряд ли одобрят два приложения с почти одинаковым названием и полностью одинаковым дизайном.
Решил попробовать сначала отправить приложение на проверку, и не удалять старое приложение.
В результате получил временный бан от эпол в appstoreconnect, и они запросили мои документы (уже в третий раз за год).
Отправил им документы, бан сняли, как и в прошлые разы.
При этом завернули новое приложение по причине Spam 😁
Там перечисляли, что у меня и дизайн копирует существующее приложение, и код, и вообще полный дубликат.
Спросил их, можно ли опубликовать новое приложение после удаления старого - сказали можно.
✅Согласовал с владельцем сайта удаление старого приложения, удалил его, и теперь могу обновлять приложение уже в своем аккаунте в максимально удобном формате (через
fastlane).App Store
Приложение «Street Workout Площадки» — App Store
Загрузите «Street Workout Площадки» от Oleg Eremenko в App Store. См. скриншоты, оценки и отзывы, советы пользователей и другие похожие на «Street Workout…
❤4🔥2
Нужно настроить публикацию сборок через fastlane с хранением ключа в приватном репозитории. Ваши действия?
Anonymous Poll
14%
Много раз уже делали такое, сделаю еще раз
10%
Доводилось настраивать fastlane, разберусь при необходимости - у них же есть документация
36%
Не доводилось настраивать самостоятельно, поищу инфу в интернете и разберусь
14%
Закину задачу в нейросеть и получу готовое решение, во что бы то ни стало
0%
Не буду настраивать, слишком много возни, можно без приватного репозитория или без fastlane
6%
Буду комбинировать разные варианты из предложенных и получу готовое решение
20%
Вообще не знаю, что это и как это делается, делегирую кому-нибудь другому, или не буду делать
🔥2
easy_dev991
Рассказал про 5 способов, от нерабочих до рабочих, почитать можно в платном канале: - базовая подписка - продвинутая подписка - сеньорская подписка
Сегодня был в центре города и решил на личном опыте узнать как сбербанк устанавливает свое банковское приложение на айфоны своих лояльных пользователей.
1. Взял талончик и ждал в очереди 11 минут (хотя по ощущениям прошла вечность)
2. Меня пригласили для установки приложения, но сделать этого не смогли 🙈
Полную версию можно прочитать в платном канале:
- базовая подписка
- продвинутая подписка
- сеньорская подписка
1. Взял талончик и ждал в очереди 11 минут (хотя по ощущениям прошла вечность)
2. Меня пригласили для установки приложения
Полную версию можно прочитать в платном канале:
- базовая подписка
- продвинутая подписка
- сеньорская подписка
Telegram
Tribute
This bot helps content creators receive financial support from their followers directly in the app.
😁11👀1
#ios #swift #swiftui #uikit
Все еще верстаете на ките и пользуетесь таблицами/коллекциями для создания списков? При этом хочется использовать в этих экранах SwiftUI?
Не беда! В iOS 16 добавили нативную интеграцию SUI в ячейках с помощью contentConfiguration.
Вот так нужно было в apple презентовать этот инструмент😁, а не тихонечко сказать в одном из видео, что вот теперь вы можете в ячейках добавлять SUI.
Алгоритм работы с этой штукой:
1️⃣ Верстаем вьюху для ячейки на SUI
2️⃣ В самой ячейке делаем проверку на iOS 16, и если версия подходит, то добавляем вьюху как показано в документации, можно обращаться напрямую к свойству
3️⃣ Если версия iOS < 16, то либо не показываем обновленный UI (😁), либо используем костыли с
Важный момент: если просто добавить SUI-вьюху в ячейку и не настроить отступы для конфигурации, то будут добавлены дефолтные отступы по горизонтали и вертикали.
Чтобы такой фигни не было, нужно вручную поверх конфигурации добавить отступы через метод margins.
Пример настройки
Весь код для демо-ячейки можно посмотреть в гитхабе.
Все еще верстаете на ките и пользуетесь таблицами/коллекциями для создания списков? При этом хочется использовать в этих экранах SwiftUI?
Не беда! В iOS 16 добавили нативную интеграцию SUI в ячейках с помощью contentConfiguration.
Вот так нужно было в apple презентовать этот инструмент😁, а не тихонечко сказать в одном из видео, что вот теперь вы можете в ячейках добавлять SUI.
Алгоритм работы с этой штукой:
1️⃣ Верстаем вьюху для ячейки на SUI
2️⃣ В самой ячейке делаем проверку на iOS 16, и если версия подходит, то добавляем вьюху как показано в документации, можно обращаться напрямую к свойству
contentConfiguration внутри ячейки3️⃣ Если версия iOS < 16, то либо не показываем обновленный UI (😁), либо используем костыли с
UIHostingControllerВажный момент: если просто добавить SUI-вьюху в ячейку и не настроить отступы для конфигурации, то будут добавлены дефолтные отступы по горизонтали и вертикали.
Чтобы такой фигни не было, нужно вручную поверх конфигурации добавить отступы через метод margins.
Пример настройки
contentConfiguration с нужными отступами:
func setup(with viewModel: DemoCollectionCellViewModel) {
if #available(iOS 16.0, *) {
contentConfiguration = UIHostingConfiguration {
SwiftUIView(viewModel: viewModel)
}.margins(.horizontal, 12) // <- вот тут задали отступы по горизонтали
} else {
setupOld(with: viewModel)
}
}
Весь код для демо-ячейки можно посмотреть в гитхабе.
Apple Developer Documentation
UIHostingConfiguration | Apple Developer Documentation
A content configuration suitable for hosting a hierarchy of SwiftUI views.
❤3🔥2