Skip to content

Latest commit

 

History

History
358 lines (286 loc) · 13.6 KB

File metadata and controls

358 lines (286 loc) · 13.6 KB

📊 Статус проекта Yeet - Октябрь 2025

🎯 Текущее состояние

✅ Что работает:

  • iOS приложение компилируется без ошибок
  • Share Extension интегрирован и настроен
  • Backend сервер развернут на Railway: https://yeet-production-dddc.up.railway.app
  • Аутентификация через WebView готова (LoginView.swift)
  • Keychain Service для безопасного хранения cookies
  • Background downloads с уведомлениями
  • Анимации и тактильная обратная связь в UI

🔧 Архитектура проекта:

iOS приложение:

Sources/
├── YeetApp/                      # Основное приложение
│   ├── YeetApp.swift            # Entry point
│   ├── ContentView.swift        # Главный экран с управлением аккаунтами
│   ├── AppDelegate.swift        # Background downloads delegate
│   ├── Info.plist
│   └── Yeet.entitlements        # ⚠️ Сейчас пустой, нужно восстановить
│
├── YeetShareExtension/          # Расширение для Share Sheet
│   ├── ShareViewController.swift # UIKit контроллер
│   ├── ShareView.swift          # SwiftUI интерфейс с анимациями
│   ├── DownloaderViewModel.swift # Бизнес-логика, обработка состояний
│   ├── Info.plist
│   └── YeetShareExtension.entitlements # ⚠️ Сейчас пустой
│
└── Shared/                      # Общий код
    ├── AppConfig.swift          # Конфигурация (читает Config.plist)
    ├── AppContext.swift         # Синглтон для App Groups
    ├── VideoDownloader.swift    # API клиент для backend
    ├── BackgroundDownloadManager.swift # Менеджер фоновых загрузок
    ├── NotificationManager.swift # Уведомления о завершении
    ├── KeychainService.swift    # Безопасное хранение cookies
    ├── ServiceRegistry.swift    # DI контейнер
    ├── LoginView.swift          # WebView для аутентификации
    └── Config.plist             # ⚠️ Был удален, нужно восстановить!

Backend сервер (Railway):

Server/
├── server.js                    # Express сервер с yt-dlp интеграцией
├── package.json                 # Node.js зависимости
├── README.md                    # API документация
└── simple-server.js             # Упрощенный сервер для тестов

🔑 Ключевые настройки:

Bundle Identifiers:

  • Main App: com.atticdm.Yeet
  • Share Extension: com.atticdm.Yeet.share

App Group: group.com.atticdm.Yeet

Keychain Access Groups:

  • Main App: $(AppIdentifierPrefix)com.atticdm.Yeet
  • Extension: $(AppIdentifierPrefix)com.atticdm.Yeet.share

Development Team: 85K3KJ45T3

Backend URL: https://yeet-production-dddc.up.railway.app


⚠️ Известные проблемы (требуют исправления):

🔴 КРИТИЧЕСКИЕ ПРОБЛЕМЫ:

1. Config.plist отсутствует

Локация: Sources/Shared/Config.plist Статус: Файл был удален Проблема: AppConfig.swift не может загрузить конфигурацию Решение: Создать файл со следующим содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>backendBaseURL</key>
    <string>https://yeet-production-dddc.up.railway.app</string>
    <key>metadataPath</key>
    <string>/get-video-link</string>
    <key>appGroupIdentifier</key>
    <string>group.com.atticdm.Yeet</string>
    <key>keychainService</key>
    <string>com.atticdm.Yeet.cookies</string>
    <key>keychainAccessGroup</key>
    <string>com.atticdm.Yeet</string>
    <key>backgroundSessionIdentifier</key>
    <string>com.atticdm.Yeet.background</string>
    <key>assumedAverageThroughput</key>
    <real>1572864.0</real>
    <key>longDownloadThreshold</key>
    <real>15.0</real>
    <key>supportedServices</key>
    <array>
        <string>instagram</string>
        <string>youtube</string>
        <string>tiktok</string>
    </array>
</dict>
</plist>

2. Entitlements файлы пустые

Проблема: Пользователь очистил entitlements, что сломает App Groups и Keychain Решение: Восстановить содержимое:

Yeet.entitlements:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.application-groups</key>
    <array>
        <string>group.com.atticdm.Yeet</string>
    </array>
    <key>keychain-access-groups</key>
    <array>
        <string>$(AppIdentifierPrefix)com.atticdm.Yeet</string>
    </array>
</dict>
</plist>

YeetShareExtension.entitlements:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.application-groups</key>
    <array>
        <string>group.com.atticdm.Yeet</string>
    </array>
    <key>keychain-access-groups</key>
    <array>
        <string>$(AppIdentifierPrefix)com.atticdm.Yeet.share</string>
    </array>
</dict>
</plist>

3. fix-entitlements.sh был удален

Проблема: Нет быстрого способа восстановить конфигурацию Решение: Создать скрипт для автоматического восстановления


🟡 Проблемы в работе (не блокирующие):

Backend проблемы:

  1. yt-dlp --get-filesize не работает

    • Ошибка уже исправлена в коде (убрали флаг)
    • Нужно передеплоить на Railway
  2. Instagram требует аутентификацию

    • Это ожидаемое поведение
    • Приложение готово к работе с cookies
    • Пользователю нужно залогиниться через LoginView
  3. Локальный сервер порт 3000 занят

    • Не критично, можно использовать Railway URL
    • Или убить процесс: lsof -ti:3000 | xargs kill -9

🔄 Последние изменения (коммиты):

Коммит 73462bd - "COMPILATION FIX: hasStarted scope error resolved"

  • ✅ Убрали hasStarted = false из retry() функций
  • ✅ Восстановили entitlements файлы
  • ✅ Восстановили полную конфигурацию project.yml
  • ⚠️ Пользователь затем очистил entitlements обратно

Коммит 769dc78 - "RACE CONDITION FIX: Share Extension stability improved"

  • ✅ Изменили .task на .onAppear в ShareView
  • ✅ Упростили DownloaderViewModel (убрали attach())
  • ✅ Передаем extensionContext напрямую в init
  • ✅ Добавили transitivelyLinkDependencies: true

📋 TODO для следующей сессии:

🔴 КРИТИЧНО (блокирует работу приложения):

  1. Восстановить Config.plist в Sources/Shared/
  2. Восстановить entitlements для обоих таргетов
  3. Создать fix-entitlements.sh для быстрого восстановления
  4. Перегенерировать проект: rm -rf Yeet.xcodeproj && xcodegen generate
  5. Проверить в Xcode "Signing & Capabilities" для обоих таргетов

🟡 ВАЖНО (улучшит стабильность):

  1. Протестировать Share Extension с реальной ссылкой
  2. Проверить работу Keychain (Login Error -34018 был раньше)
  3. Проверить App Groups (ошибки "client is not entitled" были раньше)
  4. Протестировать LoginView - аутентификацию через WebView
  5. Проверить background downloads и уведомления

🟢 НИЗКИЙ ПРИОРИТЕТ (оптимизации):

  1. Передеплоить backend на Railway (если нужны изменения)
  2. Добавить больше обработки ошибок в UI
  3. Улучшить UX для длительных загрузок
  4. Добавить тесты для ключевой логики

🚀 Как продолжить разработку:

Шаг 1: Восстановление критичных файлов

cd /Users/attic/Yeet

# Создать Config.plist
cat > Sources/Shared/Config.plist << 'EOF'
# (содержимое из секции "Config.plist отсутствует" выше)
EOF

# Восстановить Yeet.entitlements
cat > Sources/YeetApp/Yeet.entitlements << 'EOF'
# (содержимое из секции "Entitlements файлы пустые" выше)
EOF

# Восстановить YeetShareExtension.entitlements
cat > Sources/YeetShareExtension/YeetShareExtension.entitlements << 'EOF'
# (содержимое из секции "Entitlements файлы пустые" выше)
EOF

Шаг 2: Перегенерация проекта

rm -rf Yeet.xcodeproj
xcodegen generate

Шаг 3: Проверка в Xcode

  1. Открыть Yeet.xcodeproj
  2. Проверить "Signing & Capabilities":
    • ✅ App Groups включен: group.com.atticdm.Yeet
    • ✅ Keychain Sharing включен
  3. Clean Build Folder (⌘+Shift+K)
  4. Build (⌘+B)
  5. Run (⌘+R)

Шаг 4: Тестирование

  1. Запустить приложение
  2. Проверить раздел "Manage Accounts"
  3. Попробовать залогиниться в Instagram
  4. Поделиться ссылкой на Instagram reel через Share Extension
  5. Проверить скачивание и уведомления

🔍 Диагностика проблем:

Если Config.plist не найден:

⚠️ Config.plist not found in any bundle. Using default values.

Решение: Создать файл и перегенерировать проект

Если App Groups не работает:

container_create_or_lookup_app_group_path_by_app_group_identifier: client is not entitled

Решение: Восстановить entitlements и включить в Apple Developer Console

Если Keychain не работает:

Login Error: The operation couldn't be completed. (OSStatus error -34018.)

Решение:

  1. Проверить entitlements
  2. Упростить keychainAccessGroup (убрать AppIdentifierPrefix)
  3. Проверить на реальном устройстве (симулятор может глючить)

Если Share Extension падает:

RBSAssertionErrorDomain Code=2

Решение: Уже исправлено через .onAppear и упрощение lifecycle


📚 Полезные команды:

# Перегенерировать проект
rm -rf Yeet.xcodeproj && xcodegen generate

# Убить локальный сервер
lsof -ti:3000 | xargs kill -9

# Запустить локальный backend
cd Server && node server.js

# Проверить Railway deployment
curl https://yeet-production-dddc.up.railway.app/health

# Проверить git статус
git status

# Коммитить изменения
git add .
git commit -m "Your message"
git push origin main

📞 Контакты и ссылки:


🎓 Что было изучено:

  1. ✅ iOS Share Extensions
  2. ✅ SwiftUI lifecycle и animations
  3. ✅ App Groups для shared storage
  4. ✅ Keychain для безопасного хранения
  5. ✅ Background URLSessions
  6. ✅ WKWebView для аутентификации
  7. ✅ XcodeGen для управления проектом
  8. ✅ Railway для deployment
  9. ✅ yt-dlp для скачивания видео
  10. ✅ Cookie-based authentication

🏁 Итог:

Проект в хорошем состоянии, но требует восстановления нескольких критичных файлов перед запуском:

  1. Config.plist
  2. Entitlements файлы

После восстановления этих файлов приложение должно работать полностью!

Дата обновления: 1 октября 2025 Автор: Claude (AI Assistant) Статус проекта: 🟡 Требует восстановления конфигурации перед запуском