# MobileMkch iOS

Нативный iOS клиент для борды mkch.pooziqo.xyz

![Version](https://img.shields.io/badge/версия-2.1.1--ios--alpha-blue)
![iOS](https://img.shields.io/badge/iOS-15.0%2B-green)
![Swift](https://img.shields.io/badge/Swift-5-orange)

## Скриншоты
![screenshots](https://git.fuckyougoogle.xyz/MKFun/MobileMkch-iOS/raw/branch/main/screenshot/screenshot.png)

## Основные возможности

### Нативный iOS интерфейс
- **Tab Bar навигация** с тремя вкладками: Доски, Избранное, Настройки
- **Адаптивный дизайн** для iPhone и iPad
- **Темная/светлая тема** с автопереключением
- **Нативные анимации** и жесты iOS
- **SwiftUI интерфейс** для современного внешнего вида

### Просмотр контента
- **Просмотр всех досок** mkch с описаниями
- **Список тредов** с поддержкой сортировки по рейтингу и закрепленным
- **Детальный просмотр тредов** с комментариями
- **Система файлов** с поддержкой изображений и видео
- **Полноэкранный просмотр изображений** с зумом и жестами
- **Компактный/обычный режим** отображения для экономии места
- **Пагинация** с настраиваемым размером страницы (5-20 элементов)
 - **Оффлайн режим**: просмотр сохранённых данных без сети

### Система избранного
- **Добавление тредов в избранное** одним тапом
- **Отдельная вкладка избранного** с быстрым доступом
- **Локальное сохранение** избранного между запусками
- **Управление избранным** с возможностью удаления

### Гибкие настройки
- **Темы**: темная/светлая
- **Автообновление** контента
- **Показ файлов** (включение/отключение)
- **Компактный режим** для экономии пространства
- **Размер страницы**: от 5 до 20 элементов
- **Пагинация**: включение/отключение
- **Нестабильные функции** с предупреждением
 - **Принудительно оффлайн**: работа только с кэшем

### Полная поддержка постинга
- **Аутентификация по ключу** с тестированием подключения
- **Аутентификация по passcode** для обхода капчи
- **Создание новых тредов** с заголовком и текстом
- **Добавление комментариев** в существующие треды
- **CSRF защита** и автоматическая обработка форм
- **Автоочистка кэша** после постинга

### Push-уведомления (BETA)
- **Подписка на доски** через интуитивные переключатели
- **Настраиваемый интервал проверки**: 5 мин - 1 час
- **Фоновое обновление** даже при закрытом приложении
- **Принудительная проверка** новых тредов
- **Умные уведомления**: "Новый тред: [название] в /доска/"
- **Тестовые уведомления** в debug режиме

### Оптимизации и производительность
- **Многоуровневое кэширование**:
  - Доски (TTL: 10 мин)
  - Треды (TTL: 5 мин)
  - Детали тредов и комментарии (TTL: 3 мин)
  - Изображения с NSCache
- **Автоочистка кэша** по таймеру
- **Оптимизация батареи** для фоновых задач
- **Ленивая загрузка** контента
- **Graceful error handling** с retry логикой
 - **Дисковый кэш** с фолбэком на устаревшие данные при оффлайне

### Дополнительные функции
- **Crash Handler** с детальной диагностикой
- **Debug меню** (5 тапов по информации об устройстве):
  - Тест краша приложения
  - Тестовые уведомления
- **Live Activity (BETA)**:
  - Отображение треда на экране блокировки/Dynamic Island
  - Тикер случайных тредов по доскам с настраиваемым интервалом
  - Гибкие опции: заголовок, последний коммент, счётчик
- **Управление кэшем**:
  - Очистка кэша досок
  - Очистка кэша тредов
  - Очистка кэша изображений
  - Полная очистка
- **Информация об устройстве** с детальной диагностикой
- **Сброс настроек** до заводских

## Установка и настройка

### Системные требования
- iOS 15.0 или новее
- iPhone/iPad с поддержкой SwiftUI
- Разрешение на уведомления (для push-уведомлений)

### Первоначальная настройка

1. **Скачайте и установите** приложение
2. **Откройте вкладку "Настройки"**
3. **Настройте аутентификацию** (при необходимости):
   - Введите ключ аутентификации
   - Введите passcode для постинга
   - Протестируйте подключение кнопками "Тест ключа" и "Тест passcode"

### Настройка уведомлений

1. **Включите нестабильные функции** в настройках
2. **Перейдите в "Настройки уведомлений"**
3. **Включите уведомления** и разрешите их в системных настройках
4. **Выберите интервал проверки** (рекомендуется 15-30 мин)
5. **Подпишитесь на нужные доски** переключателями
6. **Протестируйте** кнопкой "Проверить новые треды сейчас"

### Live Activity (BETA)

1. Требования: iPhone c iOS 16.1+ (на iPad до iPadOS 18 Live Activity не показываются; на симуляторе поддержка ограничена)
2. Включите: Настройки -> Уведомления -> Live Activity
3. Отдельный тред: откройте тред и включите тумблер в правом верхнем углу
4. Тикер:
   - В Настройки -> Уведомления включите "Тикер случайных тредов"
   - Выберите случайную борду или укажите код борды
   - Задайте интервал (5–120 сек)
   - Кнопки "Старт тикера" / "Стоп тикера"
5. Ограничения платформы: бегущая строка в Live Activity недоступна. Контент обновляется дискретно через интервал. Частота обновлений в фоне ограничивается iOS.

### Оффлайн режим

1. Откройте вкладку "Настройки"
2. Включите тумблер "Принудительно оффлайн"
3. На экранах появится баннер "Оффлайн режим. Показаны сохранённые данные"
4. Загрузка из сети отключается, используются данные из кэша (если есть)
5. Отключите тумблер для возврата в онлайн

## Архитектура приложения

### Основные компоненты

| Файл | Описание |
|------|----------|
| `MobileMkchApp.swift` | Точка входа приложения с crash handler |
| `MainTabView.swift` | Tab Bar с навигацией и избранным |
| `Models.swift` | Структуры данных (Board, Thread, Comment, etc.) |
| `APIClient.swift` | HTTP клиент с CSRF и аутентификацией |
| `Settings.swift` | Система настроек с JSON сериализацией |
| `Cache.swift` | Многоуровневое кэширование с TTL |
| `LiveActivityManager.swift` | Управление Live Activity и тикером |

### UI компоненты

| Файл | Описание |
|------|----------|
| `BoardsView.swift` | Список досок с ошибками и загрузкой |
| `ThreadsView.swift` | Треды с пагинацией и избранным |
| `ThreadDetailView.swift` | Детали треда с комментариями |
| `CreateThreadView.swift` | Форма создания треда |
| `AddCommentView.swift` | Форма добавления комментария |
| `SettingsView.swift` | Настройки с debug меню |
| `FileView.swift` | Просмотр файлов с полноэкранным режимом |
| `NotificationSettingsView.swift` | BETA настройки уведомлений |

### Виджеты и Live Activity

| Файл | Описание |
|------|----------|
| `FavoritesWidget/FavoritesWidget.swift` | Конфигурация виджета и UI Live Activity |
| `FavoritesWidget/FavoritesWidgetBundle.swift` | Регистрация виджета и Live Activity |
| `FavoritesWidget/AppIntent.swift` | Intent-конфигурация виджета |
| `FavoritesWidget/Info.plist` | Ключ `NSSupportsLiveActivities` |

### Системные сервисы

| Файл | Описание |
|------|----------|
| `NotificationManager.swift` | Push-уведомления и подписки |
| `BackgroundTaskManager.swift` | Фоновое обновление |
| `CrashHandler.swift` | Обработка крашей |
| `ImageLoader.swift` | Асинхронная загрузка изображений |
| `NetworkMonitor.swift` | Монитор сети и принудительный оффлайн |
| `AppGroup.swift` | Общие UserDefaults для app ↔ widget |

## API интеграция

### Endpoints
- `GET /api/boards/` - список досок
- `GET /api/board/{code}` - треды доски
- `GET /api/board/{code}/thread/{id}` - детали треда
- `GET /api/board/{code}/thread/{id}/comments` - комментарии
- `POST /boards/board/{code}/new` - создание треда
- `POST /boards/board/{code}/thread/{id}/comment` - комментарий

### Аутентификация
- **Key auth**: `/key/auth/` с CSRF токенами
- **Passcode auth**: `/passcode/enter/` для обхода капчи
- **User-Agent**: `MobileMkch/[VERSION]`

### Кэширование стратегии
- **Доски**: 10 минут (редко меняются)
- **Треды**: 5 минут (часто обновляются)
- **Детали**: 3 минуты (могут изменяться)
- **Изображения**: NSCache с лимитами памяти
 - **Оффлайн фолбэк**: при ошибке сети или включённом оффлайне данные берутся из дискового кэша, если доступны

## Сборка проекта

### Требования разработчика
- Xcode 15.0+
- macOS 13.0+
- Apple Developer Account (для распространения) (я все равно не использую)

### Локальная сборка
```bash
# Клонируйте репозиторий
git clone <repository-url>
cd MobileMkch-iOS

# Откройте в Xcode
open MobileMkch.xcodeproj

# Выберите устройство и запустите
# Cmd+R для сборки и запуска
```

### Распространение
```bash
# 1. Выберите "Any iOS Device"
# 2. Product -> Archive
# 3. Distribute App:
#    - App Store Connect (для App Store)
#    - Ad Hoc (для тестирования)
#    - Development (для разработки)
```

P.S. Костыль через Payload/MobileMkch.app в зипе и переименовании ее в .ipa будет работать почти всегда

## Версии и обновления

### Версия 2.1.1-ios-alpha (Текущая)
- Live Activity (BETA): тумблер в треде, тикер в "Настройки -> Уведомления"
- Добавлен оффлайн режим (тумблер в настройках)
- Дисковый кэш и фолбэк на сохранённые данные
- Оффлайн-баннеры в списках и деталях

### Версия 2.1.0-ios-alpha
- Добавлены push-уведомления
- Добавлены фоновые задачи
- Добавлены уведомления о новых тредах
- Добавлены уведомления о новых комментариях
- Добавлены уведомления о новых файлах
- Добавлены уведомления о новых досках

p.s. я не уверен работает ли оно, но оно работает по крайней мере на моем устройстве

### Версия 2.0.0-ios-alpha
- Полная переработка UI на SwiftUI
- Система избранного с локальным сохранением
- Push-уведомления с фоновым обновлением
- Полноэкранный просмотр изображений с жестами
- Crash handler с детальной диагностикой
- Многоуровневое кэширование с TTL
- Debug меню для разработчиков
- Компактный режим интерфейса
- Нестабильные функции с предупреждениями

### Планы развития
- Поддержка загрузки файлов при постинге
- Поиск по тредам и комментариям
- Темы оформления (кастомные цвета)
- Статистика использования (мб и не будет, я не знаю мне лень)
- Экспорт/импорт настроек

## Технологии

### Основной стек
- **SwiftUI** - современный UI фреймворк
- **Combine** - реактивное программирование
- **Foundation** - базовые возможности
- **UserNotifications** - push-уведомления
- **BackgroundTasks** - фоновое обновление

### Архитектурные паттерны
- **MVVM** с ObservableObject
- **Dependency Injection** через EnvironmentObject
- **Repository Pattern** для API и кэша
- **Observer Pattern** для уведомлений

## Поддержка и вклад

### Сообщение об ошибках
1. **Debug информация**: 5 тапов по информации об устройстве в настройках
2. **Скриншот краша** (если произошел)
3. **Шаги воспроизведения** ошибки
4. **Информация об устройстве** из настроек

### Известные ограничения
- iPad интерфейс требует доработки
- Постинг файлов пока не поддерживается
- Push-уведомления в beta статусе
- Требуется passcode для стабильного постинга

## Лицензия

Это приложение разработано для сообщества mkch и распространяется на условиях открытого использования. (0BSD btw)

---

**Автор**: w^x (лейн, платон)  
**Контакт**: mkch.pooziqo.xyz  
**Версия**: 2.1.1-ios-alpha (Always in alpha lol)  
**Дата**: Август 2025

*Разработано с <3 на Swift*
