iOS 타이머 앱 개발 회고록

호씨·2025년 1월 15일
0

iOS 타이머 앱 개발 회고록 📱

이번 주는 iOS 타이머 앱의 핵심 기능들을 개발하고 개선하는 작업을 진행했다. MVVM 아키텍처를 기반으로 시간 선택 UI 개선부터 알람 기능까지 다양한 기능을 구현하며 iOS 개발의 다양한 측면을 경험할 수 있었다.

주요 기능 구현 내용 💻

시간 선택 UI 개선 ⏰

PickerView 구현

private let timePickerView = UIPickerView()
private var hourArray: [Int] = Array(0...23)
private var minuteArray: [Int] = Array(0...59)
private var secondArray: [Int] = Array(0...59)

extension TimerView: UIPickerViewDelegate {
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        switch component {
        case 0: viewModel.setHours(hourArray[row])
        case 1: viewModel.setMinutes(minuteArray[row])
        case 2: viewModel.setSeconds(secondArray[row])
        default: break
        }
    }
}

Combine을 활용한 데이터 바인딩

viewModel.$hours
    .combineLatest(viewModel.$minutes, viewModel.$seconds)
    .receive(on: DispatchQueue.main)
    .sink { [weak self] hours, minutes, seconds in
        guard let self = self else { return }
        if hours < self.hourArray.count {
            self.timePickerView.selectRow(hours, inComponent: 0, animated: false)
        }
        // minutes, seconds 업데이트...
    }
    .store(in: &cancellables)

알람 기능 구현 🔔

핵심 기능

  1. 타이머 종료 시 알람 표시
  2. 백그라운드 알람 지원
  3. 다시 알림(Snooze) 기능
  4. 커스텀 알람음 설정
protocol TimerViewModelDelegate: AnyObject {
    func showAlertViewController()
    func alertViewControllerDidRequestSnooze(minutes: Int)
}

class TimerViewModel {
    weak var delegate: TimerViewModelDelegate?
    private var audioPlayer: AVAudioPlayer?
    
    private func playTimerEndMusic() {
        try? AVAudioSession.sharedInstance().setCategory(.playback, options: .mixWithOthers)
        try? AVAudioSession.sharedInstance().setActive(true)
        audioPlayer?.play()
    }
}

UI 디자인 개선

private func setupComponents() {
    // 컨테이너 배경색 변경
    labelContainerView.backgroundColor = UIColor(red: 0/255, green: 38/255, blue: 77/255, alpha: 1)
    musicContainerView.backgroundColor = UIColor(red: 0/255, green: 38/255, blue: 77/255, alpha: 1)
    
    // 버튼 색상 변경
    resetButton.backgroundColor = UIColor(red: 72/255, green: 144/255, blue: 216/255, alpha: 1)
    playPauseButton.backgroundColor = UIColor(red: 0/255, green: 122/255, blue: 255/255, alpha: 1)
}

이번 주 배운 점 📝

1. iOS 프레임워크 활용

  • AVFoundation: 오디오 세션 관리와 백그라운드 재생
  • Combine: 반응형 프로그래밍의 실제 적용
  • UIKit: PickerView와 커스텀 UI 구현

2. 디자인 패턴

  • MVVM: 비즈니스 로직과 UI의 명확한 분리
  • Delegate: 화면 간 통신과 메모리 관리
  • Observer: Combine을 통한 상태 관리

3. 사용자 경험

  • 직관적인 UI/UX 설계의 중요성
  • 사용자 피드백을 고려한 인터랙션 설계
  • 접근성을 고려한 UI 구현

마지막 날의 소감과 배운 점 💭

이번 프로젝트를 통해 가장 크게 느낀 점은 '사용자 경험'의 중요성이다. 처음에는 단순히 기능 구현에만 집중했었는데, PickerView 도입과 알람 기능 개선 과정에서 실제 사용자의 관점에서 생각해보는 계기가 되었다.

새롭게 알게 된 점

  1. 메모리 관리의 중요성

    • weak self와 메모리 순환 참조 문제
    • 백그라운드 프로세스 관리
    • 리소스 해제의 중요성
  2. 비동기 프로그래밍

    • Combine의 실전 활용법
    • GCD와 메인 스레드 관리
    • 백그라운드 작업 처리
  3. UI/UX 디자인

    • 사용자 중심의 인터페이스 설계
    • 직관적인 상호작용 구현
    • 일관된 디자인 시스템 적용
profile
이것저것 많이 해보고싶은 사람

0개의 댓글

관련 채용 정보