#terminal #bundler #rbenv #hint
Кто читал предыдущую статью про использование
И после перезапуска терминала не работают команды
При этом если выполнять команды из
Вот что нужно сделать, чтобы эти настройки не сбрасывались.
1. Выполните в терминале по очереди эти две команды:
2. Затем примените изменения командой:
3. Всё! Теперь
Это безопасно:
-
- Добавление строк в
- Все ваши проекты будут использовать именно ту версию
Если захотите убрать эти настройки, просто откройте файл
После этого сохраните файл и выполните:
Всё вернётся как было 👌
Кто читал предыдущую статью про использование
Makefile, и при этом впервые применил эти команды, скорее всего после перезапуска терминала столкнулся с ошибкой типа такой:
Could not find ‘bundler’ (2.6.5) required by your Gemfile.lock. (Gem::GemNotFoundException)
И после перезапуска терминала не работают команды
bundle*, например:
bundle exec fastlane
При этом если выполнять команды из
Makefile, то такой ошибки нет, потому что внутри основных команд есть обертки для настройки окружения и прочих штук, которые сбрасываются после перезапуска терминала.Вот что нужно сделать, чтобы эти настройки не сбрасывались.
1. Выполните в терминале по очереди эти две команды:
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init - zsh)"' >> ~/.zshrc
2. Затем примените изменения командой:
source ~/.zshrc
3. Всё! Теперь
rbenv всегда будет работать автоматически, когда вы открываете терминал в папке проекта с файлом .ruby-version.Это безопасно:
-
rbenv специально разработан так, чтобы работать для каждого проекта отдельно, если в проекте есть файл .ruby-version- Добавление строк в
~/.zshrc просто включает автоматическое переключение версий Ruby для каждого проекта, но не фиксирует какую-то одну версию Ruby глобально- Все ваши проекты будут использовать именно ту версию
Ruby, которая указана в их собственном .ruby-version.Если захотите убрать эти настройки, просто откройте файл
~/.zshrc (например, командой nano ~/.zshrc или через Finder) и удалите строки:
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)"
После этого сохраните файл и выполните:
source ~/.zshrc
Всё вернётся как было 👌
👌2❤1
Нужно переименовать сразу несколько файлов, а еще - изменить габариты сразу нескольких картинок (ширину/высоту). Сможешь сделать это без единой строчки кода на маке (и без терминала)?
Anonymous Poll
26%
Да
74%
Нет
❤1
easy_dev991
Нужно переименовать сразу несколько файлов, а еще - изменить габариты сразу нескольких картинок (ширину/высоту). Сможешь сделать это без единой строчки кода на маке (и без терминала)?
This media is not supported in your browser
VIEW IN TELEGRAM
#finder #macos #hint
Как изменить габариты сразу нескольких картинок (ширину/высоту) на
1. Выделяем нужные картинки
2. Открываем с помощью "Просмотр"
3. Выделяем все (
4. Инструменты -> Настроить размер
Как изменить габариты сразу нескольких картинок (ширину/высоту) на
MacOS:1. Выделяем нужные картинки
2. Открываем с помощью "Просмотр"
3. Выделяем все (
command + A)4. Инструменты -> Настроить размер
👍5🔥2😁1
struct ComplexModel {
let name: String
let id: Int
let price: Double
let isActive: Bool
let creationDate: Date
let websiteURL: URL?
let tags: [String]
let statistics: [String: Int]
let description: String?
}
/// Выполнить работу с массивом и вернуть отсортированный массив
func doWork(with items: [ComplexModel]) -> [ComplexModel] {
// другая логика ...
return items.sorted(by: { $0.name < $1.name })
}🫡2
easy_dev991
struct ComplexModel { let name: String let id: Int let price: Double let isActive: Bool let creationDate: Date let websiteURL: URL? let tags: [String] let statistics: [String: Int] let description: String? } /// Выполнить…
Нужно сделать сортировку без замыкания и знаков "больше"/"меньше" стандартными средствами, не создавая никаких экстеншенов и кастомных методов
Anonymous Poll
21%
Знаю как это сделать
30%
Догадываюсь как сделать
49%
Не знаю как сделать
❤1👍1
easy_dev991
struct ComplexModel { let name: String let id: Int let price: Double let isActive: Bool let creationDate: Date let websiteURL: URL? let tags: [String] let statistics: [String: Int] let description: String? } /// Выполнить…
#swift #foundation #keypath #hint
Представляю вам KeyPathComparator, доступный с iOS 15.
Решает задачу из опроса на изи)
Представляю вам KeyPathComparator, доступный с iOS 15.
Решает задачу из опроса на изи)
struct ComplexModel {
let name: String
let id: Int
let price: Double
let isActive: Bool
let creationDate: Date
let websiteURL: URL?
let tags: [String]
let statistics: [String: Int]
let description: String?
}
/// Выполнить работу с массивом и вернуть отсортированный массив
func doWork(with items: [ComplexModel]) -> [ComplexModel] {
// другая логика ...
return items.sorted(using: KeyPathComparator(\.name)) // <- вот
}
/// Выполнить работу с массивом и вернуть отсортированный массив
/// - Parameters:
/// - items: Изначальный массив
/// - order: Порядок сортировки
/// - Returns: Отсортированный массив
func doSortedWork(with items: [ComplexModel], order: SortOrder) -> [ComplexModel] {
// другая логика ...
return items.sorted(using: KeyPathComparator(\.name, order: order))
}
Apple Developer Documentation
KeyPathComparator | Apple Developer Documentation
A comparator that uses another sort comparator to provide the comparison of values at a key path.
👍4🔥2
#ios #swift #swiftui #maps #geocoding #hint
На прошлой неделе заметил, что релиз 3.10 приложения с площадками стал сильно греть телефон, и даже в статистике аккумулятора спустя всего 10 минут использования мое приложение было первым в списке по потреблению энергии 🙈
В том релизе я сделал много классных штук, и в том числе немного обновил старый код для работы с картой, в результате нагрузка на девайс выросла в разы.
На днях выпустил релиз с исправлением этих проблем, и вот главные выводы:
1️⃣ Если нужно получить локацию пользователя с использованием CLLocationManager, то лучше не использовать startUpdatingLocation(), а просто вызывать requestLocation() по таймеру, например раз в 10 секунд - нагрузка ощутимо упадет
2️⃣ Использовать reverseGeocodeLocation нужно не чаще раза в минуту, а лучше еще реже - если координаты ощутимо изменились (на 50 метров, например), и это точно нужно для правильной работы фичи
3️⃣ Если используете MKMapView внутри
На прошлой неделе заметил, что релиз 3.10 приложения с площадками стал сильно греть телефон, и даже в статистике аккумулятора спустя всего 10 минут использования мое приложение было первым в списке по потреблению энергии 🙈
В том релизе я сделал много классных штук, и в том числе немного обновил старый код для работы с картой, в результате нагрузка на девайс выросла в разы.
На днях выпустил релиз с исправлением этих проблем, и вот главные выводы:
1️⃣ Если нужно получить локацию пользователя с использованием CLLocationManager, то лучше не использовать startUpdatingLocation(), а просто вызывать requestLocation() по таймеру, например раз в 10 секунд - нагрузка ощутимо упадет
2️⃣ Использовать reverseGeocodeLocation нужно не чаще раза в минуту, а лучше еще реже - если координаты ощутимо изменились (на 50 метров, например), и это точно нужно для правильной работы фичи
3️⃣ Если используете MKMapView внутри
SwiftUI-обертки, то напишите явную проверку в методе updateUIView, чтобы обновление карты выполнялось только тогда, когда это 100% нужно - я для этого сделал флаг shouldUpdateRegion и передаю его в карту, а в методе updateUIView вызываю замыкание при обновлении карты, чтобы снять флаг🔥5❤2
Как вам Cursor для iOS-разработки?
Anonymous Poll
57%
Не знаю, не проверяли
12%
Проверяли, не понравился
14%
Используем, не очень нравится, но совсем отказаться нельзя
18%
Используем, все нравится
❤4
easy_dev991
#ios #swift #swiftui #maps #geocoding #hint На прошлой неделе заметил, что релиз 3.10 приложения с площадками стал сильно греть телефон, и даже в статистике аккумулятора спустя всего 10 минут использования мое приложение было первым в списке по потреблению…
Любопытный момент: вот эти правки снизили потребление процессора почти до нуля во время работы приложения.
Я уже и не помню, почему вообще решил до этого сделать
Зато в следующем релизе приложение будет потреблять минимум энергии ✔️
Я уже и не помню, почему вообще решил до этого сделать
NetworkMonitorActor, хотя можно было использовать стандартный AsyncIterator 🙈Зато в следующем релизе приложение будет потреблять минимум энергии ✔️
GitHub
Починил NetworkStatus by easydev991 · Pull Request #366 · easydev991/SwiftUI-WorkoutApp
Для iOS 17 не нужно использовать кастомный актор, достаточно использовать стандартный AsyncIterator
❤3
Сервис ничего не хранит, не возвращает и не изменяет. У него есть единственный 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