Files
Balance/Balance/README.md
T

10 KiB
Raw Blame History

Баланс

Мультиплатформенное приложение для личного бюджета. 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 доступны все функции управления финансами, адаптированные под компактный экран.

Запуск

  1. Откройте Balance.xcodeproj в Xcode 16 или новее.
  2. Выберите схему Balance, BalanceMac или BalanceWatch.
  3. Выберите подходящий симулятор или устройство.
  4. Нажмите 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.

  1. Запустите сервер по инструкции BalanceServer/README.md.
  2. Для реального устройства настройте HTTPS. Незащищённый HTTP разрешён приложением только для localhost и 127.0.0.1.
  3. Откройте Настройки → Сервер и синхронизация (на Watch — Настройки → Сервер).
  4. Введите полный адрес, сохраните его и зарегистрируйтесь либо войдите.
  5. Повторите вход на остальных устройствах с тем же адресом и аккаунтом.

При изменении адреса токены и курсор предыдущего сервера удаляются, после чего приложение просит войти заново. Пароли не сохраняются; access/refresh-токены находятся в системном Keychain каждого устройства. В Apple-клиентах синхронизация выполняется сразу после входа, при запуске приложения, затем каждые две минуты. Android использует WorkManager с минимальным системным интервалом 15 минут. Во всех приложениях синхронизацию также можно запустить вручную. Изменения передаются ограниченными пакетами, поэтому большая история операций не загружается в память целиком. Журнал удалений хранится отдельно от SwiftData, чтобы обновления схемы старого локального хранилища не могли аварийно завершить приложение. Клиент и BalanceServer из архива должны обновляться вместе.

Настройка iCloud

CloudKit является опциональным режимом. Для него нужен платный Apple Developer Program Team и собственный контейнер.

  1. В Apple Developer зарегистрируйте три уникальных Bundle ID для iOS, macOS и watchOS.
  2. Создайте CloudKit-контейнер, например iCloud.com.yourcompany.Balance.
  3. Замените iCloud.com.example.Balance в шаблонах entitlements папки Config.
  4. Для каждого target задайте Code Signing Entitlements: Config/Balance.entitlements, Config/BalanceMac.entitlements или Config/BalanceWatch.entitlements.
  5. В Signing & Capabilities укажите платную Team, добавьте iCloud capability, включите CloudKit и выберите один и тот же контейнер.
  6. В Build Settings каждого target добавьте пользовательскую настройку INFOPLIST_KEY_BalanceCloudKitEnabled = YES.
  7. Войдите в один Apple ID с включённым iCloud на всех тестовых устройствах.
  8. Запустите приложение для создания 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.