Conversation
| CURRENT_PROJECT_VERSION = 91; | ||
| DEVELOPMENT_TEAM = 9Z68336878; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
| MACOSX_DEPLOYMENT_TARGET = 26.0; |
There was a problem hiding this comment.
Коротко: вы просто подняли CURRENT_PROJECT_VERSION с 90 до 91 во множестве конфигураций. Само по себе это ок, но вижу несколько потенциальных проблем и мест для улучшений, которые лучше закрыть сейчас.
Что может сломаться или вызвать сюрпризы
-
Конфликт GENERATE_INFOPLIST_FILE и INFOPLIST_FILE:
- В ряде конфигураций одновременно включен GENERATE_INFOPLIST_FILE = YES и задан свой INFOPLIST_FILE (например, для Watch Widgets и обычных Widgets).
- Это взаимоисключающие подходы. Сгенерированный Info.plist не подтянет ваши NSExtension и другие специфичные ключи, что может всплыть на этапе архивирования/загрузки в App Store.
- Рекомендация: для таргетов с кастомным Info.plist выставить GENERATE_INFOPLIST_FILE = NO и оставить только INFOPLIST_FILE. Если хотите генерацию — уберите кастомный файл и явно проставьте все нужные INFOPLIST_KEY_*.
-
Подозрительное MACOSX_DEPLOYMENT_TARGET = 26.0:
- Для macOS это выглядит некорректно (актуальные значения — 14.x, 15.x и т.д.). 26.0 приведет к ошибкам сборки/архива.
- Срочно привести к валидной версии macOS (например, 14.0/15.0) или тому, что действительно нужно.
-
Несогласованность deployment target-ов между хост-приложением и расширениями:
- IPHONEOS_DEPLOYMENT_TARGET = 18.1 указан не везде, например, вижу его у некоторых расширений, но не у главной iOS-цели.
- Если у расширения minOS выше, чем у хоста, расширение просто не будет доступно на части устройств, где работает приложение. Возможно, это намеренно, но чаще всего стоит синхронизировать значения.
- Аналогично проверьте watchOS: у Watch App и Watch Widgets должны быть согласованные WATCHOS_DEPLOYMENT_TARGET.
-
Entitlements для iOS и watchOS:
- Для watch widgets используется общий файл PomPadDoWidgetsExtension.entitlements. Убедитесь, что он не содержит iOS-специфичных прав, неподдерживаемых на watchOS. Обычно разумнее иметь отдельные .entitlements per-платформа.
-
Signing/Team:
- DEVELOPMENT_TEAM явно задан не во всех секциях. Если вы рассчитываете на наследование с уровня проекта — ок, иначе могут быть проблемы на CI/архивации из-за “No signing certificate / team not set”.
Риск в релизной цепочке
- Требование App Store: CFBundleVersion (CURRENT_PROJECT_VERSION) у приложения и всех расширений в одном сабмите должны совпадать. Вы подняли везде до 91 — это хорошо. Проверьте, не осталось ли других таргетов (Notification Service/Content, Intents, App Clips и т.д.) с другим номером.
Рекомендации по улучшению процесса
-
Централизация CURRENT_PROJECT_VERSION:
- Вынесите CURRENT_PROJECT_VERSION в общий .xcconfig (Base.xcconfig) и подключите его ко всем таргетам, чтобы не править десятки мест руками.
- Либо используйте agvtool: xcrun agvtool new-version -all 91.
- В CI можно автоподставлять номер сборки (например, из GitHub Actions run number) и синхронно обновлять все таргеты.
-
Единообразие версий:
- Убедитесь, что все Info.plist используют $(CURRENT_PROJECT_VERSION) для CFBundleVersion и MARKETING_VERSION для CFBundleShortVersionString. В некоторых таргетах MARKETING_VERSION явно задан, в других — возможно унаследован; лучше сделать это очевидным и единым.
-
Проверки в CI:
- Добавьте скрипт, который валидирует:
- одинаковый CURRENT_PROJECT_VERSION во всех таргетах,
- отсутствие конфликтов GENERATE_INFOPLIST_FILE vs INFOPLIST_FILE,
- валидные значения deployment target-ов по платформам.
- Добавьте скрипт, который валидирует:
Итого: сам инкремент build number ок, но обязательно исправьте конфликт GENERATE_INFOPLIST_FILE/INFOPLIST_FILE, проверьте/исправьте MACOSX_DEPLOYMENT_TARGET = 26.0 и синхронизируйте deployment target-ы и entitlements между хостом и расширениями. Централизуйте версионирование, чтобы не повторять ручные правки.
| - [ ] Live activities | ||
| - [ ] Location based contexts | ||
|
|
||
| #### Languages Supported |
There was a problem hiding this comment.
Ниже — только те замечания, которые реально влияют на рендеринг, поддержку и читабельность PR.
-
Несогласованное выравнивание изображений:
- Сейчас три картинки с align="left", а последняя — без него. Это приведет к «плавающему» обтеканию и непредсказуемой верстке на разных ширинах.
- Рекомендация: задайте единый способ. На GitHub безопасно обернуть все картинки в контейнер и убрать align у отдельных изображений:
нужен, чтобы следующий раздел (Roadmap) не обтекал картинки.
-
Атрибут align у
устарел в HTML5:
- Он может вести себя нестабильно в разных движках. Лучше выравнивать контейнер (
) или использовать Markdown-таблицу для точного контроля раскладки. Инлайн-стили GitHub часто вырезает, так что на style полагаться не стоит.
- Он может вести себя нестабильно в разных движках. Лучше выравнивать контейнер (
-
Отсутствуют alt-тексты у изображений:
- Это ухудшает доступность и SEO. Добавьте понятные alt (см. пример выше).
-
Оптимизация загрузки:
-
Размеры изображений:
- Вы задаете только height: браузер сам сохранит пропорции, но для предсказуемости сетки иногда лучше явно указать width, если пропорции у всех разные. Если изображения имеют общий аспект-рейтинг — можно оставить только height.
-
Потенциальное касание контента:
- При float/align="left" текст Roadmap может «подтягиваться» вправо от картинок на узких экранах. Убедитесь, что после блока изображений есть принудительный перенос/очистка (см.
выше).
- При float/align="left" текст Roadmap может «подтягиваться» вправо от картинок на узких экранах. Убедитесь, что после блока изображений есть принудительный перенос/очистка (см.
-
Мелкая стилистика Roadmap:
- Приведите пункт «Live activities» к стилю остальных (например, «Live Activities»).
- «Shortcuts» лучше уточнить как «App Shortcuts» (иначе можно спутать с «Keyboard Shortcuts»).
- Если фичи платформенно-специфичны, добавьте пометки (iOS/watchOS/macOS) для ожиданий пользователей.
-
Проверка ассетов:
- Убедитесь, что page-pix/watch-timer.png реально добавлен в репозиторий; иначе будет 404.
Эти правки устранят непредсказуемое обтекание, улучшат доступность и стабильность рендеринга на GitHub без зависимости от вырезаемых инлайн-стилей.
page-pix/update-pix.sh
Outdated
There was a problem hiding this comment.
Наблюдения и предложения по улучшению:
- Нет перевода строки в конце файла. Добавьте финальный newline — это базовая гигиена, помогает инструментам и диффам.
- Жесткая зависимость от текущего рабочего каталога. Лучше привязаться к расположению скрипта, чтобы его можно было запускать откуда угодно.
- Дублирование длинных путей и имен устройств. Вынесите директории, язык и название устройства в переменные, чтобы было проще поддерживать.
- Назначение -f у cp без проверок скрывает реальные ошибки (например, отсутствующий источник). Либо добавьте проверки существования файла, либо используйте строгий режим и явную обработку ошибок.
- Не все аргументы cp заключены в кавычки. Сейчас это не ломает из-за отсутствия пробелов в целевых именах, но лучше цитировать обе стороны для единообразия и безопасности.
- Нет явной сигнализации об ошибках. Если файл отсутствует, лучше падать с понятным сообщением, чем молча перетирать/пропускать.
Минимальная доработка без кардинального рефакторинга:
- Добавьте финальный перевод строки.
- Оберните пути и цель в кавычки.
- Включите строгий режим и проверяйте наличие источника.
Пример компактного улучшения:
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BASE_DESKTOP="$SCRIPT_DIR/../screenshots/desktop/en-US"
BASE_WATCH="$SCRIPT_DIR/../screenshots/watch/en-US"
WATCH_DEVICE="Apple Watch Series 11 (46mm)"
copy() {
local src="$1"
local dst="$2"
if [[ ! -f "$src" ]]; then
echo "Ошибка: нет файла: $src" >&2
exit 1
fi
cp -f "$src" "$dst"
}
copy "$BASE_DESKTOP/Apple Macbook Pro 13 Space Gray-01TodayScreen.png" "today-macbook.png"
copy "$BASE_WATCH/$WATCH_DEVICE-02SectionsPanel.png" "watch-section.png"
copy "$BASE_WATCH/$WATCH_DEVICE-01TodayScreen.png" "watch-today.png"
copy "$BASE_WATCH/$WATCH_DEVICE-03TaskDetails.png" "watch-menu.png"
copy "$BASE_WATCH/$WATCH_DEVICE-04FocusTimer.png" "watch-timer.png"
Дополнительно (по желанию):
- Если важна идемпотентность и кеширование, замените cp на rsync -a или cp -np (не перезаписывать) — зависит от нужного поведения.
- Проверьте соответствие именования целевых файлов их содержанию (например, TaskDetails → watch-menu.png): если это осознанно — ок, если нет — стоит выровнять.
screenshots/desktop/rename.sh
Outdated
There was a problem hiding this comment.
Ниже — только конструктивные замечания по добавленному блоку с sips и общей надежности скрипта.
- Порядок аргументов в sips --resampleHeightWidth: сначала высота, затем ширина. У вас 1800 2880 — это портрет (1800x2880). Если вы имели в виду 2880x1800 (типичное соотношение 16:10), порядок нужно поменять.
- Опасность искажения пропорций: --resampleHeightWidth принудительно задает обе стороны и может «растягивать» изображения. Если хотите сохранить пропорции, используйте --resampleToFit 2880 1800 (вписывание в рамку) или --resampleHeight/--resampleWidth по одной стороне.
- Масштабирование вверх: sips безусловно масштабирует и «мельчит» качество для картинок меньше цели. Если не хотите апскейла — сначала проверьте размеры (sips -g pixelWidth -g pixelHeight) и пропускайте те, что уже меньше или равны.
- Поведение при отсутствии файлов: for file in *.png и sips *.png в bash без nullglob могут получить буквальный литерал *.png. Включите nullglob (и при необходимости nocaseglob), либо заранее соберите массив файлов и проверяйте, что он не пуст.
- DRY: блок Resize дублируется для ru. Объедините в функцию и пройдитесь по списку директорий.
- Защита от ошибок/зависимостей:
- Добавьте set -Eeuo pipefail в начало.
- Проверяйте наличие sips: command -v sips >/dev/null || { echo "sips not found"; exit 1; }
- Проверяйте, что cd ../ru успешен, либо используйте pushd/popd и трап на выход.
- Регистр расширений: если есть .PNG/.Png, включите nocaseglob или обрабатывайте оба варианта.
- Новая строка в конце файла: добавьте, чтобы не ловить предупреждения линтеров/сборок.
- Производительность/надежность: передавайте файлы в sips списком, а не шаблоном, чтобы избежать проблем с пустой выборкой и пробелами в именах.
Пример минимально более надежной реализации фрагмента Resize с сохранением пропорций и без апскейла:
-
В начале скрипта:
- set -Eeuo pipefail
- shopt -s nullglob nocaseglob
-
Функция:
-
resize_dir() {
local dir="$1"
pushd "$dir" >/dev/null
local files=( *.png )
(( ${#files[@]} == 0 )) && { popd >/dev/null; return; }Пропускаем апскейл: фильтруем только те, что больше рамки
local to_resize=()
for f in "${files[@]}"; do
read -r _ w _ < <(sips -g pixelWidth "$f" 2>/dev/null | awk '/pixelWidth/ {print "w", $2}')
read -r _ h _ < <(sips -g pixelHeight "$f" 2>/dev/null | awk '/pixelHeight/ {print "h", $2}')
# Меняйте 2880x1800 на нужные вам пределы
if (( w > 2880 || h > 1800 )); then
to_resize+=( "$f" )
fi
done
(( ${#to_resize[@]} )) && sips --resampleToFit 1800 2880 "${to_resize[@]}"
popd >/dev/null
}
-
-
Вызов:
- command -v sips >/dev/null || { echo "sips not found"; exit 1; }
- resize_dir "."
- resize_dir "../ru"
Примечание: если вам нужна именно фиксированная конечная геометрия (без сохранения пропорций), оставьте --resampleHeightWidth, но четко подтвердите порядок аргументов и риск искажения. Если целитесь в 2880x1800 — используйте --resampleHeightWidth 1800 2880 только если это осознанный выбор (портрет), иначе поменяйте местами.




No description provided.