MeteorShowers/DEVELOPER_MANUAL.md

224 lines
5.8 KiB
Markdown
Raw Normal View History

2026-06-12 14:34:37 +03:00
# MeteorShowers App Developer Manual
## Table of Contents
1. [Architecture Overview](#architecture-overview)
2. [Core Components](#core-components)
3. [Dependencies](#dependencies)
4. [File Structure](#file-structure)
5. [Key Features](#key-features)
6. [Notifications System](#notifications-system)
7. [Location Services](#location-services)
8. [UI Components](#ui-components)
## Architecture Overview
MeteorShowers is an iOS application built using UIKit that helps users track meteor showers and provides relevant astronomical data. The app follows a traditional MVC (Model-View-Controller) architecture pattern.
### Design Patterns Used
- Singleton (LocationManager, RemindersManager)
- Delegate Pattern (LocationManagerDelegate)
- Observer Pattern (NotificationCenter for updates)
## Core Components
### Models
1. **MeteorShower**
- Properties: name, datePeak, ZHR (Zenithal Hourly Rate)
- Used to represent individual meteor shower events
2. **LocationManager**
- Singleton class managing device location
- Handles location permissions and updates
- Provides location data to TopView for calculations
3. **RemindersManager**
- Manages local notifications for meteor shower reminders
- Handles persistence of reminder settings
- Methods:
- `saveReminder(for:)`
- `removeReminder(for:)`
- `hasReminder(for:)`
- `restoreAllReminders()`
4. **AstronomicalCalculations**
- Contains moon phase calculation logic
- Enum `MoonPhase` for different moon phases
- Struct `MoonPhaseCalculation` for calculations
### ViewControllers
1. **MainViewController**
- Root view controller
- Displays list of meteor showers
- Background color: .darkMidnight
2. **ShowerDetailViewController**
- Shows detailed information about selected shower
- Manages reminder functionality
- Key UI elements:
- Reminder bell icon
- Peak date
- ZHR information
- Moon phase details
### Views
1. **TopView**
- Custom view showing astronomical data
- Dependencies:
- LocationManager
- MoonPhaseCalculation
- SunRiseSetCalc
- Features:
- Sunrise/sunset times
- Moon phase
- Location-based calculations
2. **MeteorShowerTableViewCell**
- Custom cell for meteor shower list
- Background: .lightMidnight
- Corner radius: 9pt
## Dependencies
### External Libraries
1. **Alamofire**
- Used for network requests
- Installation: Swift Package Manager
2. **SnapKit**
- Auto-layout DSL
- Used for programmatic constraints
### Frameworks
1. **UIKit**
- Main UI framework
2. **CoreLocation**
- Location services
3. **UserNotifications**
- Local notifications for reminders
## File Structure
```
MeteorShowers/
├── App/
│ ├── SceneDelegate.swift
│ ├── AppDelegate.swift
│ └── Info.plist
├── ViewControllers/
│ ├── MainViewController.swift
│ └── ShowerDetailViewController.swift
├── Views/
│ ├── TopView.swift
│ └── MeteorShowerTableViewCell.swift
├── Models/
│ ├── MeteorShower.swift
│ ├── LocationManager.swift
│ └── AstronomicalCalculations.swift
├── Managers/
│ └── RemindersManager.swift
└── Assets.xcassets/
```
## Key Features
### Reminder System
- Set reminders 3 days before meteor shower peaks
- Persistent storage using UserDefaults
- Local notifications using UNUserNotificationCenter
- Visual feedback with bell icon
### Location Services
- Uses CoreLocation for user position
- Permission handling: "When In Use" authorization
- Fallback to Moscow coordinates if location unavailable
- Used for calculating:
- Sunrise/sunset times
- Moon phase visibility
### Astronomical Calculations
1. **Sun Calculations**
- Sunrise/sunset times based on location
- Uses UTC time zone to avoid conversion issues
2. **Moon Phase**
- Calculates current moon phase
- Shows illumination percentage
- Updates based on current date
## UI Components
### Color Scheme
- `.darkMidnight`: Main background color
- `.lightMidnight`: Secondary background color
- `.lightMidnight1`: Navigation title color
### Typography
- Navigation title: System font, large title
- Labels: System font, 12pt, weight: thin
- Time labels: System font, 12pt, weight: thin
### Layout
- Corner radius: 12pt for main views
- Standard padding: 16pt
- Icon sizes: 24x24pt
## Notifications System
### Local Notifications
- Scheduled 3 days before peak
- Unique identifier format: "meteorShower-[name]"
- Permission requested on first reminder set
- Persisted across app restarts
### Permission Handling
```swift
NSUserNotificationUsageDescription: "We'll notify you 3 days before meteor shower peaks so you don't miss the show!"
```
## Location Services
### Permission Handling
```swift
NSLocationWhenInUseUsageDescription: "We need your location to calculate accurate sunrise and sunset times for your area."
```
### Location Updates
- Accuracy level: Best
- Updates when:
1. App launches
2. Returns from background
3. Location permission granted
## Best Practices
1. **Memory Management**
- Use weak self in closures
- Proper deinitialization of observers
- Cleanup of notification requests
2. **Error Handling**
- Location fallback mechanism
- Graceful degradation of features
- User feedback for failures
3. **Performance**
- Reusable cells for list
- Efficient astronomical calculations
- Proper threading for UI updates
4. **Code Organization**
- Clear separation of concerns
- Protocol-oriented design
- Extension-based organization
## Contributing
When contributing to this project:
1. Follow the existing architecture patterns
2. Maintain consistent code style
3. Add appropriate documentation
4. Test on multiple iOS versions
5. Consider backward compatibility