diff --git a/personal/projects/psychologist-app/overview.md b/personal/projects/psychologist-app/overview.md index 8fa7f096..b38fbed4 100644 --- a/personal/projects/psychologist-app/overview.md +++ b/personal/projects/psychologist-app/overview.md @@ -107,6 +107,17 @@ Apple требует дисклеймер: "Не является заменой - После сброса: онбординг с чистого листа - Реализует GDPR-требование "право на удаление" (см. [[privacy-legal]]) +- **Папка документов** — пикер системной папки для хранения/чтения сессий + - Расположение: под кнопкой "Пропустить" на стартовом экране + отдельная секция в Настройках + - Позволяет выбрать любую папку (iCloud Drive, локальная, внешний диск на iPad) + - По умолчанию: стандартная `Documents/UserProfile/` — ничего не ломается + - Нужно для переноса данных между устройствами (резервная копия, смена телефона) + - iOS: `.fileImporter(allowedContentTypes: [.folder])` (SwiftUI, iOS 14+) + - Возвращает security-scoped URL → сохраняется как bookmark в UserDefaults + - `startAccessingSecurityScopedResource()` / `stopAccessingSecurityScopedResource()` при каждом доступе + - Android (`#if SKIP`): `Intent.ACTION_OPEN_DOCUMENT_TREE` → URI с `takePersistableUriPermission` + - ProfileManager читает путь из UserDefaults (bookmark на iOS, URI string на Android) + ### Структура сессии 1. **Check-in** (2 мин): короткий mood check через карточки 2. **Тема** (выбирает пользователь или AI предлагает из паттернов) @@ -686,6 +697,7 @@ Phase 2 — Voice + Android (6-8 недель) ├── OpenAI Realtime API интеграция ├── Skip.tools → Android версия ├── Persistence: профиль пользователя + recurring topics +├── Импорт/экспорт папки данных (iOS + Android file picker) └── Подписка через RevenueCat Phase 3 — Launch & Marketing (2-4 недели) diff --git a/wiki/tech/reflect-skip-fuse.md b/wiki/tech/reflect-skip-fuse.md index 5d195cdc..085b027a 100644 --- a/wiki/tech/reflect-skip-fuse.md +++ b/wiki/tech/reflect-skip-fuse.md @@ -44,24 +44,25 @@ skip gradle assembleDebug ```swift // Package.swift — обязательные поля -products: [ - .library(name: "ReflectApp", targets: ["ReflectApp"]) +dependencies: [ + .package(url: "https://source.skip.tools/skip.git", from: "1.8.9"), + .package(url: "https://source.skip.tools/skip-fuse.git", from: "1.0.0"), + .package(url: "https://source.skip.tools/skip-fuse-ui.git", from: "1.0.0"), ], targets: [ .target( name: "ReflectApp", path: "Sources/ReflectApp", dependencies: [ - .product(name: "SkipFuse", package: "skip-fuse"), - .product(name: "SkipUI", package: "skip-ui"), - // НЕ добавлять skip-fuse-ui как отдельную зависимость + .product(name: "SkipFuse", package: "skip-fuse"), + .product(name: "SkipFuseUI", package: "skip-fuse-ui"), ], plugins: [.plugin(name: "skipstone", package: "skip")] ) ] ``` -**Pitfall:** `skip-fuse-ui` как отдельный product не существует — нужны `skip-fuse` + `skip-ui` раздельно. +**Pitfall:** нужны оба: `skip-fuse` (runtime) + `skip-fuse-ui` (SwiftUI overlay для Android). Ранее была попытка использовать `skip-ui` вместо `skip-fuse-ui` — это неверно, `skip-ui` не предоставляет `SwiftUI` модуль для Android-сборки и ломает full build с `no such module 'SwiftUI'`. ## Прочие питфоллы