Files
BalanceMono/docs/DEVELOPMENT.md
T
wt b32eabcd12
Build Unsigned iOS and macOS Apps / Build Unsigned iOS IPA (push) Canceled after 0s
Build Unsigned iOS and macOS Apps / Build macOS ZIP (push) Canceled after 0s
added rust server
2026-10-29 18:05:24 +07:00

112 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Разработка (все платформы)
Сводная шпаргалка по сборке, запуску и проверке всех трёх подпроектов.
Подробности — в `docs/DEVELOPMENT.md` каждого подпроекта.
## Требования по платформам
| Подпроект | Инструменты | Минимальные версии |
| --- | --- | --- |
| `Balance/` | Xcode, Swift | Xcode 16+, iOS 17+, macOS 14+, watchOS 10+ |
| `BalanceAndroid/` | Android Studio / Gradle | AGP 8.13, Kotlin 2.3.21, compileSdk 36, minSdk 26, Java 17 |
| `BalanceServer/` | Rust; Go и Python для проверки совместимости | Rust 1.90+, Go 1.25.0+, Python 3 |
## Локальный запуск всей системы
Порядок, удобный для end-to-end проверки sync между платформами:
```bash
# 1. Поднять сервер
cd BalanceServer
# задать BALANCE_JWT_SECRET в окружении (см. README.md)
export BALANCE_JWT_SECRET="replace-with-a-long-random-secret"
cargo run --locked --release
# сервер слушает http://localhost:8080
# 2. Открыть Apple-проект и указать http://localhost:8080 в Settings → Server account
cd ../Balance
open Balance.xcodeproj
# 3. Собрать и запустить Android-приложение
cd ../BalanceAndroid
./gradlew assembleDebug
# на эмуляторе сервер локального хоста доступен как http://10.0.2.2:8080
```
Для физического iPhone/Android-устройства `localhost` указывает на само
устройство, а не на машину разработчика — используйте сетевой адрес
или HTTPS reverse proxy (см. `docs/SECURITY.md`).
## Сборка и тесты по отдельности
### Apple (`Balance/`)
```bash
xcodebuild -project Balance.xcodeproj -list
xcodebuild -project Balance.xcodeproj -scheme Balance \
-destination 'generic/platform=iOS' build
xcodebuild -project Balance.xcodeproj -scheme Balance \
-destination 'platform=iOS Simulator,name=<available iPhone>' test
```
Схемы: `Balance` (iOS), `BalanceMac`, `BalanceWatch`. Без
`BalanceCloudKitEnabled=YES` приложение работает в local-mode
(SwiftData без CloudKit) — рекомендуемый режим для разработки.
### Android (`BalanceAndroid/`)
```bash
./gradlew clean test assembleDebug
```
Тесты — `app/src/test/FinanceMathTest`. `local.properties` с `sdk.dir`
не должен попадать в Git.
### Server (`BalanceServer/`)
```bash
cargo fmt --check
cargo test --locked
cargo clippy --locked --all-targets -- -D warnings
cargo build --locked --release
python3 tools/compatibility.py --rust-binary target/release/balance-server
# Сохранённая Go-реализация — эталон API и вариант отката
go test ./...
go test -race ./...
go vet ./...
go build ./...
```
Docker-путь — `docker compose up -d --build` (см.
[`BalanceServer/README.md`](../BalanceServer/README.md)).
## Что проверять при изменении общего контракта
Если PR меняет sync API, модель данных или финансовые расчёты — прогони
проверки во всех трёх подпроектах, а не только в изменённом:
```text
old iOS client + new server
new iOS client + server
Android client + server
concurrent sync с двух устройств одного аккаунта
login/refresh после истечения access token
delete → pull на другом устройстве
```
## Типовые проблемы синхронизации (одинаковый чек-лист для обеих платформ)
1. Проверь server URL в настройках клиента.
2. Проверь правило HTTPS/localhost (см. `docs/SECURITY.md`).
3. Проверь авторизацию/сессию (login, не истёк ли refresh).
4. Проверь дату последней синхронизации и сохранённый cursor.
5. Проверь совместимость версии клиента и `BalanceServer`.
6. Если данные не удаляются на другом устройстве — убедись, что
удаление прошло через tombstone-путь
(`modelContext.deleteForSync` на Apple,
`FinanceDao.deleteTransaction/deleteCategory/deleteBudget` на
Android), а не через прямой `delete()`.