macOS 상태바를 위한 아름답고 실용적인 캘린더 & 날씨 앱
현재 날짜를 한눈에 확인하고, 달력과 실시간 날씨 정보를 즉시 접근할 수 있는 macOS 전용 상태바 애플리케이션입니다.
- macOS 상태바에 오늘 날짜를 영어 서수 형태로 표시 (1st, 2nd, 3rd, 4th...)
- 분 단위 자동 업데이트로 항상 정확한 날짜 표시
- 상태바 클릭 시 드롭다운 팝오버로 전체 달력 표시
- 이전/다음 달 네비게이션
- 오늘 날짜 하이라이트 및 선택된 날짜 표시
- 깔끔하고 직관적인 SwiftUI 기반 UI
- 현재 위치 기반 날씨: CoreLocation을 통한 자동 위치 감지
- 실시간 온도 및 날씨 상태: Apple WeatherKit 통합
- 선택한 날짜의 예보: 캘린더에서 날짜 선택 시 해당 날짜의 날씨 정보 표시
- 아이콘 및 색상: 날씨 상태에 맞는 SF Symbols 아이콘과 색상 표시
- 위치 정보: 현재 위치명 표시 및 새로고침 기능
- 한국어/영어 자동 전환: 시스템 언어 설정에 따른 자동 적용
- 지역화된 날짜 형식: 각 언어에 맞는 날짜 표기법
- 날씨 상태 번역: 모든 날씨 상태의 현지화된 설명
- 한국 지명 영어 변환: 영어 환경에서 한국 지명을 영어로 자동 번역
- 빠른 접근: 좌클릭으로 캘린더, 우클릭으로 메뉴
- 키보드 단축키: Cmd+Q로 앱 종료
- 백그라운드 실행: 독 아이콘 숨김으로 깔끔한 환경
- 위치 권한 관리: 안전한 위치 서비스 사용
- 간편한 초기 설정: 첫 실행 시 시스템 날짜 설정 안내
- macOS: 14.0 (Sonoma) 이상
- Xcode: 15.0 이상 (개발 시)
- Swift: 5.9 이상
- 위치 권한: 날씨 정보 제공을 위한 위치 서비스 접근 필요
- 인터넷 연결: Apple WeatherKit API 사용을 위한 네트워크 연결 필요
# 저장소 클론
git clone https://github.com/chawj1234/MenuCal.git
# 프로젝트 디렉토리로 이동
cd MenuCal/menuCal
# Xcode에서 프로젝트 열기
open DayOne!.xcodeproj- Xcode에서 프로젝트 열기:
DayOne!.xcodeproj파일 실행 - 빌드 대상 설정: "My Mac" 또는 현재 Mac으로 설정
- 팀 ID 설정: 프로젝트 설정에서 Development Team 선택
- 빌드 및 실행:
⌘ + R또는 Run 버튼 클릭
앱 실행 후 위치 권한 허용이 필요합니다:
- "앱에서 사용하는 동안 위치 접근 허용" 선택
- 시스템 환경설정 > 보안 및 개인 정보 보호 > 위치 서비스에서 확인 가능
-
첫 실행 설정: DayOne! 첫 실행 시 시스템 설정 안내 알림창이 나타납니다
- 시스템 설정 열기 → 제어 센터 → 시계 옵션 → '날짜 보기'를 '보지 않음'으로 설정
- 이를 통해 중복된 날짜 표시를 방지하고 깔끔한 상태바 유지
-
앱 실행: DayOne! 실행 시 상태바 우측에 현재 날짜가 표시됩니다
-
캘린더 보기: 상태바의 날짜를 좌클릭하면 캘린더 팝오버가 나타납니다
-
메뉴 접근: 상태바의 날짜를 우클릭하면 About/Quit 메뉴가 나타납니다
-
날짜 선택: 캘린더에서 원하는 날짜를 클릭하면 해당 날짜의 날씨 정보를 확인할 수 있습니다
- 현재 날씨: 앱 실행 시 자동으로 현재 위치의 날씨 표시
- 예보 정보: 캘린더에서 미래 날짜 선택 시 해당 날짜의 예보 확인
- 위치 새로고침: 날씨 영역의 새로고침 버튼으로 위치 및 날씨 정보 업데이트
- Apple Weather 연동: 상세한 법적 정보는 하단 링크를 통해 확인
⌘ + Q: 앱 종료ESC: 캘린더 팝오버 닫기 (또는 외부 영역 클릭)
- 언어: Swift 5.9+
- UI 프레임워크: SwiftUI, AppKit
- 아키텍처: MVVM 패턴
- 최소 지원 버전: macOS 14.0+
- AppKit: 상태바 통합 및 macOS 네이티브 기능
- SwiftUI: 모던하고 선언적인 UI 구성
- WeatherKit: Apple 공식 날씨 데이터 API
- CoreLocation: 위치 서비스 및 지오코딩
- Foundation: 날짜/시간 처리 및 국제화
- 다국어 지원:
NSLocalizedString을 통한 완전한 현지화 - 위치 기반 서비스:
CLLocationManager를 통한 정확한 위치 감지 - 날씨 데이터 통합: Apple WeatherKit의 현재 날씨 및 예보 데이터
- 한국어 지명 처리: 영어 환경에서 한국 지명의 자동 영어 변환
- 스마트 온보딩: 첫 실행 시에만 표시되는 시스템 설정 안내 (UserDefaults 기반)
MenuCal/
├── menuCal/
│ ├── DayOne!.xcodeproj/ # Xcode 프로젝트 파일
│ └── menuCal/ # 메인 앱 소스코드
│ ├── menuCalApp.swift # 앱 진입점 및 상태바 관리
│ ├── ContentView.swift # 캘린더 UI 및 날씨 매니저
│ ├── OnboardingManager.swift # 온보딩 및 초기 설정 관리
│ ├── Assets.xcassets/ # 앱 아이콘 및 리소스
│ ├── Info.plist # 앱 설정 및 권한 정보
│ ├── ko.lproj/ # 한국어 지역화 파일
│ ├── en.lproj/ # 영어 지역화 파일
│ └── Base.lproj/ # 기본 지역화 파일
├── Icon/ # 추가 아이콘 리소스
└── README.md # 프로젝트 문서
- 위치 서비스: 현재 위치 기반 날씨 정보 제공
NSLocationWhenInUseUsageDescription: 사용 중 위치 접근NSLocationUsageDescription: 위치 서비스 사용 목적 설명
- 위치 정보는 오직 날씨 데이터 요청에만 사용됩니다
- 개인정보는 로컬에서만 처리되며 외부로 전송되지 않습니다
- Apple WeatherKit은 Apple의 개인정보 보호 정책을 따릅니다
- ✅ 온보딩 시스템 개편: 복잡한 SwiftUI 뷰에서 간단한 알림창으로 변경
- ✅ 코드 구조 개선: OnboardingManager 클래스로 온보딩 기능 분리
- ✅ 사용자 경험 향상: 첫 실행 시에만 나타나는 시스템 설정 안내
- ✅ 지역화 개선: 한국어/영어 온보딩 메시지 최적화
- 이벤트 관리: 시스템 캘린더 앱과의 동기화
- 알림 기능: 중요한 일정에 대한 알림
- 테마 커스터마이징: 다크 모드 최적화 및 색상 테마
- 시간대 지원: 다른 시간대의 날짜/시간 표시
- 로그인 시 자동 시작: 시스템 부팅 시 자동 실행 (코드에 준비됨)
DayOne! 프로젝트에 기여해주셔서 감사합니다!
- 이슈 확인: 기존 이슈를 확인하거나 새로운 이슈를 등록해주세요
- 포크 및 브랜치: 저장소를 포크하고 기능별 브랜치를 생성해주세요
git checkout -b feature/amazing-feature
- 코드 스타일: Swift 기본 컨벤션을 따라주세요
- 국제화: 새로운 텍스트 추가 시 반드시
Localizable.strings에 추가해주세요 - 테스트: 위치 권한, 네트워크 연결 등 다양한 환경에서 테스트해주세요
- 커밋 및 PR: 명확한 커밋 메시지와 함께 Pull Request를 생성해주세요
# 개발용 클론
git clone https://github.com/chawj1234/MenuCal.git
cd MenuCal/menuCal
# Xcode에서 열기
open DayOne!.xcodeproj
# 팀 ID 설정 (프로젝트 설정에서)
# 개발자 계정으로 서명 설정이 프로젝트는 MIT 라이선스 하에 배포됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
프로젝트에 대한 질문이나 제안사항이 있으시면 언제든 연락해주세요!
- 개발자: 차원준 (chawj)
- GitHub: @chawj1234
- 이메일: chawj1234@gmail.com
- Apple WeatherKit: 정확하고 신뢰할 수 있는 날씨 데이터 제공
- Apple Human Interface Guidelines: macOS 네이티브 디자인 가이드
- Swift & SwiftUI Community: 지속적인 기술 발전과 지원
- Swift 및 SwiftUI 커뮤니티의 모든 개발자들
- macOS 앱 개발에 영감을 준 모든 오픈소스 프로젝트들
이 프로젝트가 유용하다면 스타를 눌러주세요!
macOS 상태바에서 날짜와 날씨를 한번에 확인하는 새로운 경험을 시작해보세요!