Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ fastlane/screenshots/screenshots.html
# Swift build artifacts
.build/
buildServer.json
build_sim.log

# VSCode/Cursor settings (personal preferences)
.vscode/
.vscode/

# Fastlane
fastlane/.env
fastlane/builds/
63 changes: 62 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: help setup setup_hook setup_snapshot setup_fastlane setup_cursor update update_fastlane update_swiftformat format screenshots
.PHONY: help setup setup_hook setup_snapshot setup_fastlane setup_cursor update update_fastlane update_swiftformat format screenshots upload_screenshots testflight fastlane build test

# Цвета и шрифт
YELLOW=\033[1;33m
Expand Down Expand Up @@ -309,6 +309,67 @@ screenshots:
bundle exec fastlane snapshot; \
'

## upload_screenshots: Загрузить существующие скриншоты в App Store Connect
upload_screenshots:
@bash -c '\
set -e; \
if [ ! -d fastlane ] || [ ! -f fastlane/Fastfile ]; then \
printf "$(YELLOW)fastlane не инициализирован в проекте$(RESET)\n"; \
$(MAKE) setup_fastlane; \
if [ ! -d fastlane ] || [ ! -f fastlane/Fastfile ]; then \
printf "$(RED)Нужно инициализировать fastlane перед использованием$(RESET)\n"; \
exit 1; \
fi; \
fi; \
printf "$(YELLOW)Загрузка существующих скриншотов в App Store Connect...$(RESET)\n"; \
eval "$$(rbenv init -)"; \
rbenv shell $(RUBY_VERSION); \
bundle exec fastlane ios upload_screenshots; \
'

## testflight: Собрать и отправить сборку в TestFlight через fastlane
testflight:
@bash -c '\
set -e; \
if [ ! -d fastlane ] || [ ! -f fastlane/Fastfile ]; then \
printf "$(YELLOW)fastlane не инициализирован в проекте$(RESET)\n"; \
$(MAKE) setup_fastlane; \
if [ ! -d fastlane ] || [ ! -f fastlane/Fastfile ]; then \
printf "$(RED)Нужно инициализировать fastlane перед использованием$(RESET)\n"; \
exit 1; \
fi; \
fi; \
printf "$(YELLOW)Запуск fastlane release для отправки в TestFlight...$(RESET)\n"; \
eval "$$(rbenv init -)"; \
rbenv shell $(RUBY_VERSION); \
bundle exec fastlane ios release; \
'

## fastlane: Запустить меню команд fastlane
fastlane:
@bash -c '\
set -e; \
if [ ! -d fastlane ] || [ ! -f fastlane/Fastfile ]; then \
printf "$(YELLOW)fastlane не инициализирован в проекте$(RESET)\n"; \
$(MAKE) setup_fastlane; \
if [ ! -d fastlane ] || [ ! -f fastlane/Fastfile ]; then \
printf "$(RED)Нужно инициализировать fastlane перед использованием$(RESET)\n"; \
exit 1; \
fi; \
fi; \
eval "$$(rbenv init -)"; \
rbenv shell $(RUBY_VERSION); \
bundle exec fastlane; \
'

## build: Сборка проекта в терминале
build:
xcodebuild -project SwiftUI-WorkoutApp.xcodeproj -scheme SwiftUI-WorkoutApp -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 16 Pro' build

## test: Запускает unit-тесты в терминале
test:
xcodebuild -project SwiftUI-WorkoutApp.xcodeproj -scheme SwiftUI-WorkoutApp -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 16 Pro' test -testPlan SwiftUI-WorkoutApp

.DEFAULT:
@printf "$(RED)Неизвестная команда: 'make $@'\n$(RESET)"
@$(MAKE) help
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,16 +182,16 @@ make screenshots
#### iPhone
| Карта с площадками | Список площадок | Площадка | Прошедшие мероприятия | Мероприятие | Профиль |
| --- | --- | --- | --- | --- | --- |
| <img src="./fastlane/screenshots/ru/iPhone 16 Pro Max-0-parksMap.png"> | <img src="./fastlane/screenshots/ru/iPhone 16 Pro Max-1-parksList.png"> | <img src="./fastlane/screenshots/ru/iPhone 16 Pro Max-2-parkDetails.png"> | <img src="./fastlane/screenshots/ru/iPhone 16 Pro Max-3-pastEvents.png"> | <img src="./fastlane/screenshots/ru/iPhone 16 Pro Max-4-eventDetails.png"> | <img src="./fastlane/screenshots/ru/iPhone 16 Pro Max-5-profile.png"> |
| <img src="./fastlane/screenshots/ru/iPhone 15 Pro Max-0-parksMap.png"> | <img src="./fastlane/screenshots/ru/iPhone 15 Pro Max-1-parksList.png"> | <img src="./fastlane/screenshots/ru/iPhone 15 Pro Max-2-parkDetails.png"> | <img src="./fastlane/screenshots/ru/iPhone 15 Pro Max-3-pastEvents.png"> | <img src="./fastlane/screenshots/ru/iPhone 15 Pro Max-4-eventDetails.png"> | <img src="./fastlane/screenshots/ru/iPhone 15 Pro Max-5-profile.png"> |

#### iPad
| Карта с площадками | Список площадок | Площадка | Прошедшие мероприятия | Мероприятие | Профиль |
| --- | --- | --- | --- | --- | --- |
| <img src="./fastlane/screenshots/ru/iPad Pro 13-inch (M4)-0-parksMap.png"> | <img src="./fastlane/screenshots/ru/iPad Pro 13-inch (M4)-1-parksList.png"> | <img src="./fastlane/screenshots/ru/iPad Pro 13-inch (M4)-2-parkDetails.png"> | <img src="./fastlane/screenshots/ru/iPad Pro 13-inch (M4)-3-pastEvents.png"> | <img src="./fastlane/screenshots/ru/iPad Pro 13-inch (M4)-4-eventDetails.png"> | <img src="./fastlane/screenshots/ru/iPad Pro 13-inch (M4)-5-profile.png"> |
| <img src="./fastlane/screenshots/ru/iPad Pro (12.9-inch) (6th generation)-0-parksMap.png"> | <img src="./fastlane/screenshots/ru/iPad Pro (12.9-inch) (6th generation)-1-parksList.png"> | <img src="./fastlane/screenshots/ru/iPad Pro (12.9-inch) (6th generation)-2-parkDetails.png"> | <img src="./fastlane/screenshots/ru/iPad Pro (12.9-inch) (6th generation)-3-pastEvents.png"> | <img src="./fastlane/screenshots/ru/iPad Pro (12.9-inch) (6th generation)-4-eventDetails.png"> | <img src="./fastlane/screenshots/ru/iPad Pro (12.9-inch) (6th generation)-5-profile.png"> |

#### Модели девайсов, используемые для скриншотов
По состоянию на 2025 год Apple берет за основу скриншоты для диагонали 6.9 (или 6.7) дюймов для айфона (13 дюймов для айпада) и масштабирует их под все остальные размеры экранов, то есть можно использовать для скриншотов по одному девайсу на платформу:
- iPhone 16 Pro Max
- iPad Pro 13-inch
- iPhone 15 Pro Max
- iPad Pro (12.9-inch) (6th generation)

Список всех существующих девайсов есть [тут](https://iosref.com/res).
16 changes: 10 additions & 6 deletions SwiftUI-WorkoutApp.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -445,10 +445,11 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CLANG_WARN_SEMICOLON_BEFORE_METHOD_BODY = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "SwiftUI-WorkoutApp/PreviewContent";
DEVELOPMENT_TEAM = CR68PP2Z3F;
DEVELOPMENT_TEAM = 3PHS45582J;
ENABLE_PREVIEWS = YES;
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_PARAMETER = YES;
Expand All @@ -468,9 +469,10 @@
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 3.13.0;
PRODUCT_BUNDLE_IDENTIFIER = com.FGU.WorkOut;
MARKETING_VERSION = 3.13.1;
PRODUCT_BUNDLE_IDENTIFIER = "com.oleg991.SW-Parks";
PRODUCT_NAME = WorkoutApp;
PROVISIONING_PROFILE_SPECIFIER = "";
RUN_CLANG_STATIC_ANALYZER = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
Expand Down Expand Up @@ -498,10 +500,11 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CLANG_WARN_SEMICOLON_BEFORE_METHOD_BODY = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "SwiftUI-WorkoutApp/PreviewContent";
DEVELOPMENT_TEAM = CR68PP2Z3F;
DEVELOPMENT_TEAM = 3PHS45582J;
ENABLE_PREVIEWS = YES;
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_PARAMETER = YES;
Expand All @@ -521,9 +524,10 @@
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 3.13.0;
PRODUCT_BUNDLE_IDENTIFIER = com.FGU.WorkOut;
MARKETING_VERSION = 3.13.1;
PRODUCT_BUNDLE_IDENTIFIER = "com.oleg991.SW-Parks";
PRODUCT_NAME = WorkoutApp;
PROVISIONING_PROFILE_SPECIFIER = "";
RUN_CLANG_STATIC_ANALYZER = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,10 @@ enum Endpoint {
/// Возвращает список с кратким набором полей, т.к. при запросе всех данных сервер не справляется с нагрузкой
case getAllParks

// MARK: Получить список площадок постранично
/// **GET** ${API}/areas?fields=short&page_size=${pageSize}&page=${page}
case getParksPageByPage(page: Int, pageSize: Int)

// MARK: Получить список площадок, обновленных после указанной даты
/// **GET** ${API}/areas/last/<date>
case getUpdatedParks(from: String)
Expand Down Expand Up @@ -284,7 +288,7 @@ extension Endpoint {
"/users/search"
case .getCountries:
"/countries"
case .getAllParks:
case .getAllParks, .getParksPageByPage:
"/areas"
case let .getUpdatedParks(date):
"/areas/last/\(date)"
Expand Down Expand Up @@ -363,7 +367,7 @@ extension Endpoint {
.createPark, .editPark:
.post
case .getUser, .getFriendsForUser, .getFriendRequests,
.getAllParks, .getPark,
.getAllParks, .getParksPageByPage, .getPark,
.findUsers, .getParksForUser, .getBlacklist,
.getFutureEvents, .getPastEvents, .getEvent,
.getDialogs, .getMessages, .getJournals,
Expand Down Expand Up @@ -393,6 +397,11 @@ extension Endpoint {
var queryItems: [URLQueryItem] {
switch self {
case .getAllParks: [.init(name: "fields", value: "short")]
case let .getParksPageByPage(page, pageSize): [
.init(name: "fields", value: "short"),
.init(name: "page_size", value: String(pageSize)),
.init(name: "page", value: String(page))
]
case let .findUsers(name): [.init(name: "name", value: name)]
default: []
}
Expand Down Expand Up @@ -427,7 +436,7 @@ extension Endpoint {
.deleteEventComment, .deleteEvent, .getDialogs,
.getMessages, .deleteDialog, .getJournals,
.getJournal, .getJournalEntries, .deleteEntry,
.deleteJournal, .getAllParks,
.deleteJournal, .getAllParks, .getParksPageByPage,
.getUpdatedParks, .deletePark,
.deleteEventPhoto, .deleteParkPhoto:
return nil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,16 @@ public struct SWClient: Sendable {
return try await makeResult(for: endpoint)
}

/// Загружает список площадок постранично
/// - Parameters:
/// - page: Номер страницы (начиная с 1)
/// - pageSize: Количество элементов на странице
/// - Returns: Список площадок для указанной страницы
public func getParksPageByPage(page: Int, pageSize: Int) async throws -> [Park] {
let endpoint = Endpoint.getParksPageByPage(page: page, pageSize: pageSize)
return try await makeResult(for: endpoint)
}

/// Загружает список всех площадок, обновленных после указанной даты
/// - Parameter stringDate: дата отсечки для поиска обновленных площадок
/// - Returns: Список обновленных площадок
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading