10 KiB
Баланс
Мультиплатформенное приложение для личного бюджета. Apple-клиенты написаны на SwiftUI и SwiftData, Android-клиент находится в соседней папке BalanceAndroid.
Возможности
- учёт доходов и расходов;
- редактирование суммы, типа, категории, даты и заметки операции;
- ручная корректировка общего баланса с сохранением отдельной операции, не искажающей аналитику;
- категории и заметки к операциям;
- обзор баланса за текущий месяц;
- диаграмма расходов по категориям;
- отдельная аналитика за месяц, 3 месяца или 12 месяцев;
- график динамики доходов и расходов, структура трат и норма сбережений;
- месячные лимиты и индикация превышения бюджета;
- собственные категории с выбором типа, одного из 50 системных значков или эмодзи;
- ввод собственного эмодзи и расширенная палитра из 24 цветов;
- редактирование собственных категорий с обновлением связанных операций и бюджетов;
- поиск и фильтрация операций;
- выбор валюты: RUB, EUR, USD или SEK;
- системная, светлая и тёмная тема;
- экспорт истории в CSV;
- опциональная синхронизация финансовых данных через приватную базу iCloud CloudKit;
- синхронизация операций, категорий и бюджетов через собственный Go-сервер;
- регистрация, вход, безопасное хранение сессии в Keychain, ручная и автоматическая синхронизация;
- смена сервера с обязательной повторной авторизацией;
- отдельные приложения для iPhone, macOS и Apple Watch;
- нативное Android-приложение с тем же дизайном, функциями и протоколом синхронизации;
- Apple Watch: обзор, аналитика, операции с редактированием и удалением, бюджеты, категории, корректировка баланса и настройки;
- macOS: обзор, полная аналитика, операции, редактирование бюджетов и категорий, корректировка баланса, темы и CSV-экспорт.
- индивидуальная иконка приложения с единым знаком для iOS, macOS и watchOS.
CSV-экспорт доступен на iPhone и Mac. На Apple Watch доступны все функции управления финансами, адаптированные под компактный экран.
Запуск
- Откройте
Balance.xcodeprojв Xcode 16 или новее. - Выберите схему
Balance,BalanceMacилиBalanceWatch. - Выберите подходящий симулятор или устройство.
- Нажмите Run (
⌘R).
Поддерживаемые системы: iOS 17+, macOS 14+ и watchOS 10+.
Personal Team — режим по умолчанию
Проект по умолчанию использует локальное SwiftData-хранилище и собирается с бесплатной Personal Team без iCloud и Push Notifications capabilities. Выберите свою Team в Signing & Capabilities и запускайте нужную схему.
В этом режиме можно подключить self-hosted сервер без iCloud-capabilities. Пока сервер не указан, каждое приложение хранит данные только локально.
Собственный сервер
Сервер находится рядом с проектом в папке BalanceServer. Он написан на Go, хранит данные в SQLite и запускается на Linux, Windows и macOS напрямую или через Docker.
- Запустите сервер по инструкции
BalanceServer/README.md. - Для реального устройства настройте HTTPS. Незащищённый HTTP разрешён приложением только для
localhostи127.0.0.1. - Откройте Настройки → Сервер и синхронизация (на Watch — Настройки → Сервер).
- Введите полный адрес, сохраните его и зарегистрируйтесь либо войдите.
- Повторите вход на остальных устройствах с тем же адресом и аккаунтом.
При изменении адреса токены и курсор предыдущего сервера удаляются, после чего приложение просит войти заново. Пароли не сохраняются; access/refresh-токены находятся в системном Keychain каждого устройства.
В Apple-клиентах синхронизация выполняется сразу после входа, при запуске приложения, затем каждые две минуты. Android использует WorkManager с минимальным системным интервалом 15 минут. Во всех приложениях синхронизацию также можно запустить вручную. Изменения передаются ограниченными пакетами, поэтому большая история операций не загружается в память целиком. Журнал удалений хранится отдельно от SwiftData, чтобы обновления схемы старого локального хранилища не могли аварийно завершить приложение. Клиент и BalanceServer из архива должны обновляться вместе.
Настройка iCloud
CloudKit является опциональным режимом. Для него нужен платный Apple Developer Program Team и собственный контейнер.
- В Apple Developer зарегистрируйте три уникальных Bundle ID для iOS, macOS и watchOS.
- Создайте CloudKit-контейнер, например
iCloud.com.yourcompany.Balance. - Замените
iCloud.com.example.Balanceв шаблонах entitlements папкиConfig. - Для каждого target задайте Code Signing Entitlements:
Config/Balance.entitlements,Config/BalanceMac.entitlementsилиConfig/BalanceWatch.entitlements. - В Signing & Capabilities укажите платную Team, добавьте iCloud capability, включите CloudKit и выберите один и тот же контейнер.
- В Build Settings каждого target добавьте пользовательскую настройку
INFOPLIST_KEY_BalanceCloudKitEnabled = YES. - Войдите в один Apple ID с включённым iCloud на всех тестовых устройствах.
- Запустите приложение для создания development-схемы. Перед TestFlight или App Store разверните схему в production через CloudKit Console.
Если флаг не задан или CloudKit не настроен, приложение использует локальное хранилище.
Не включайте CloudKit и собственный сервер одновременно для одной базы: выберите один способ синхронизации.
Документация Apple: Enabling CloudKit in Your App, Syncing model data across a person's devices, Creating independent watchOS apps.
Стек
- SwiftUI
- SwiftData
- CloudKit
- Swift Charts
- XCTest
- собственный Go 1.25 + SQLite сервер
- Kotlin, Jetpack Compose, Room, WorkManager и Android Keystore
Проект не требует сторонних зависимостей.
Устранение проблем сборки
После перехода с версии 2.0–2.0.2 выполните Product → Clean Build Folder. Если Xcode продолжает использовать старую конфигурацию watchOS target, закройте Xcode и удалите DerivedData для проекта Balance, затем снова откройте проект.
Документация проекта
AGENTS.md— правила для AI-агентов и разработчиков, структура проекта, invariants и checklist.docs/ARCHITECTURE.md— архитектура приложения и ответственность слоёв.docs/DATA_MODEL.md— SwiftData-модели и финансовые инварианты.docs/SYNC.md— протокол авторизации и синхронизации с собственным сервером.docs/DEVELOPMENT.md— локальная разработка, сборка, тесты и signing.docs/PRODUCT.md— функциональная документация.
Примечание: текущий архив содержит Apple-клиент Balance. Внешний Go-сервер, упомянутый в старой версии README, в этом архиве отсутствует;
docs/SYNC.mdдокументирует клиентский контракт по кодуServerSync.swift.