무드등 만들기 기획서
사전 기획서: 무드등 iOS 앱
1. 앱 개요
앱 이름: MoodLight
목표: 사용자에게 다양한 조명 효과를 제공하여 편안한 분위기를 조성하고, 감정 및 상황에 맞는 조명 설정을 가능하게 함.
2. 주요 기능
다양한 조명 효과:
고정된 색상 및 밝기 조정
색상 전환 모드 (예: 천천히 전환, 빠른 전환)
자연광 모드 (예: 일출, 일몰 효과)
음악 연동 기능:
사용자가 선택한 음악에 따라 조명이 변화
사운드 인식 조명 효과 (비트에 맞춰 조명 변화)
스케줄 설정:
특정 시간에 자동으로 조명 설정 변경
주간 및 월간 스케줄 관리
사용자 커스터마이징:
개인 맞춤형 테마 설정 (예: 로맨틱, 집중, 휴식)
즐겨찾기 기능
3. 디자인
UI/UX 디자인:
심플하고 직관적인 인터페이스
사용자 친화적인 색상 팔레트 (부드러운 색상 사용)
애니메이션 효과 추가 (조명 변화 시 부드러운 애니메이션)
화면 구성:
메인 화면: 현재 조명 상태 및 빠른 설정 버튼
효과 선택 화면: 다양한 조명 효과 목록
설정 화면: 스케줄 및 사용자 커스터마이징 옵션
4. 기술 스택
프로그래밍 언어: Swift
프레임워크: UIKit, CoreBluetooth (스마트 조명 기기와 연동 시)
데이터베이스: CoreData (사용자 설정 저장)
5. 마케팅 전략
타겟 사용자: 20대 후반부터 40대 초반의 직장인 및 대학생
프로모션:
소셜 미디어 캠페인 (Instagram, TikTok)
사용자 리뷰 및 피드백을 통한 개선
인플루언서 마케팅 활용
출시 계획:
베타 테스트 후 피드백 수집
정식 출시 시 프로모션 이벤트 진행
6. 경쟁 분석
주요 경쟁 앱:
Philips Hue, LIFX, 여러 무드등 앱
차별화 포인트:
사용자 맞춤형 설정의 다양성
음악 연동 기능의 직관성
개발 일정
주요 일정
1. 기획 및 요구사항 정의 (2025년 3월 20일 - 3월 31일)
기능 목록 확정
UI/UX 디자인 초기 스케치
기술 스택 선정
2. 디자인 및 프로토타입 제작 (2025년 4월 1일 - 4월 15일)
UI/UX 디자인 완료
프로토타입 제작 및 사용자 테스트
3. 개발 준비 (2025년 4월 16일 - 4월 20일)
개발 환경 설정
필요한 라이브러리 및 프레임워크 설치
4. 기능 개발 (2025년 4월 21일 - 5월 10일)
기본 기능 구현 (조명 효과, 음악 연동 등)
스케줄 설정 기능 개발
사용자 커스터마이징 기능 개발
5. 통합 및 테스트 (2025년 5월 11일 - 5월 20일)
전체 기능 통합
기능 테스트 및 버그 수정
사용자 피드백 반영
6. 베타 테스트 (2025년 5월 21일 - 5월 25일)
베타 테스트 진행
피드백 수집 및 최종 수정
7. 출시 준비 (2025년 5월 26일 - 5월 29일)
앱스토어 등록 준비
마케팅 자료 작성 및 배포 계획 수립
8. 정식 출시 (2025년 5월 30일)
앱스토어에 앱 출시
사용자 피드백 모니터링 및 초기 지원

- iOS버전은 최소 가동 가능한 iOS버전 수준을 나타내요
- Bundle Identifier은 식별하는 것이라 정확히 하는 것이 중요합니다.
- Landscape는 우리가 평소에 스마트폰 쓸때 화면 회전하면 그 비율에 맞게 모양이 바뀌는데 그 기능을 의미해요(비율에 맞게 전환 할 것인지?)
ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad")
}
override func viewWillAppear(_ animated: Bool) {
print("viewWillAppear")
}
override func viewDidAppear(_ animated: Bool) {
print("viewDidAppear")
}
}

시뮬레이터에는 아무것도 나타나지 않지만 이렇게 출력 되는 것을 확인 할 수 있어요

ViewDidLoad는 반드시 딱 한 번만 실행이 돼요
AppDelegate.swift
import UIKit // UIKit 프레임워크를 임포트하여 iOS 앱의 사용자 인터페이스 요소를 사용할 수 있게 함.
@main // 이 애플리케이션의 진입점을 표시하는 속성. 앱 실행 시 가장 먼저 호출되는 클래스.
class AppDelegate: UIResponder, UIApplicationDelegate { // AppDelegate 클래스를 정의하며, UIResponder와 UIApplicationDelegate 프로토콜을 준수함.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 애플리케이션이 시작된 후 사용자 정의를 위한 오버라이드 지점입니다.
return true // 애플리케이션이 성공적으로 시작되었음을 나타내는 true를 반환.
}
// MARK: UISceneSession Lifecycle
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// 새로운 씬 세션이 생성될 때 호출됩니다.
// 이 메서드를 사용하여 새 씬을 생성할 구성을 선택합니다.
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
// "Default Configuration"이라는 이름의 씬 구성을 반환하며, 주어진 세션 역할을 설정.
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// 사용자가 씬 세션을 버릴 때 호출됩니다.
// 애플리케이션이 실행 중이지 않을 때 어떤 세션이 버려졌다면, 이 메서드는 application:didFinishLaunchingWithOptions 바로 뒤에 호출됩니다.
// 버려진 씬에 특정한 리소스를 해제하는 데 이 메서드를 사용합니다. 해당 씬은 다시 돌아오지 않습니다.
}
}
SceneDelegate.swift
import UIKit // UIKit 프레임워크를 임포트하여 iOS 앱의 사용자 인터페이스 요소를 사용할 수 있게 함.
class SceneDelegate: UIResponder, UIWindowSceneDelegate { // SceneDelegate 클래스를 정의하며, UIResponder와 UIWindowSceneDelegate 프로토콜을 준수함.
var window: UIWindow? // UIWindow 인스턴스를 저장할 변수. 이 변수는 현재 씬의 윈도우를 나타냄.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// 이 메서드는 UIWindowScene에 연결될 때, UIWindow `window`를 구성하고 연결하는 데 사용할 수 있습니다.
// 스토리보드를 사용하는 경우, `window` 속성은 자동으로 초기화되고 씬에 연결됩니다.
// 이 델리게이트는 연결되는 씬이나 세션이 새롭다는 것을 의미하지 않습니다 (새로운 씬 세션을 연결할 때는 `application:configurationForConnectingSceneSession`를 참조).
guard let _ = (scene as? UIWindowScene) else { return } // scene이 UIWindowScene으로 변환될 수 있는지 확인. 변환할 수 없으면 메서드를 종료.
}
func sceneDidDisconnect(_ scene: UIScene) {
// 씬이 시스템에 의해 해제될 때 호출됩니다.
// 이 이벤트는 씬이 백그라운드로 들어가거나 세션이 버려질 때 발생합니다.
// 이 씬과 관련된 리소스를 해제하는 데 사용되며, 다음 번 씬이 연결될 때 다시 생성할 수 있습니다.
// 씬은 나중에 다시 연결될 수 있습니다. 세션이 반드시 버려진 것은 아니기 때문입니다 (세션이 버려졌는지 확인하려면 `application:didDiscardSceneSessions`를 참조).
}
func sceneDidBecomeActive(_ scene: UIScene) {
// 씬이 비활성 상태에서 활성 상태로 전환될 때 호출됩니다.
// 이 메서드를 사용하여 씬이 비활성 상태일 때 일시 중지된 작업을 재시작합니다.
}
func sceneWillResignActive(_ scene: UIScene) {
// 씬이 활성 상태에서 비활성 상태로 전환될 때 호출됩니다.
// 이 상태는 일시적인 중단 (예: 전화 수신)으로 인해 발생할 수 있습니다.
}
func sceneWillEnterForeground(_ scene: UIScene) {
// 씬이 백그라운드에서 포그라운드로 전환될 때 호출됩니다.
// 이 메서드를 사용하여 백그라운드로 들어갈 때의 변경 사항을 취소합니다.
}
func sceneDidEnterBackground(_ scene: UIScene) {
// 씬이 포그라운드에서 백그라운드로 전환될 때 호출됩니다.
// 이 메서드를 사용하여 데이터를 저장하고, 공유 리소스를 해제하며, 씬을 현재 상태로 복원하기 위해 충분한 씬 특화 상태 정보를 저장합니다.
}
}
Foreground Mode
- 현재 눈에 보이는 것
- Active : 앱이 전경에 있고 이벤트를 받고 있음. 일반적으로 사용자와 상호작용하는 동안 앱은 이 상태에 있음
- Inactive : 앱이 전경에 있지만 이벤트를 받고 있지 않음
Background Mode
- 보이지 않는 뒤에서 작동 하는 것
- Running : 앱이 백그라운드에 있지만 여전히 코드를 실행. 사용자가 다른 앱으로 전환하거나 홈 화면으로 돌아갔을 때 앱은 일시적으로 이 상태에 머물게 됨
- Suspend : 앱이 백그라운드에 있지만 코드를 실행하지 않음. 시스템은 앱을 이 상태로 자동으로 전환하며 필요에 따라 메모리를 회수하기 위해 앱을 종료시킬 수 있음.
뷰(View)
모든 뷰는 UIKit의 UIView 클래스의 자식클래스입니다.
뷰 계층(View Hierarchy)
- 하나의 뷰는 여러 개의 하위 뷰를 가질 수 있고, 각 하위 뷰는 부모 뷰에 추가됨
- 뷰 계층을 통해 뷰 간의 위치 관계와 그리기 순서를 결정
- 보통 부모 뷰에 추가된 뷰는 부모 뷰의 영역 내에서만 그려짐

반응 하려면 UIControl 아래에 있어야 해요
UIWindow 클래스
- 모든 앱은 하나 이상의 윈도우를 가지고 뷰 계층의 가장 상위에 위치하며 뷰 컨트롤러의 뷰와 그 하위 뷰들을 포함합니다.
- UIWindow는 일반적으로 앱의 시작 시점에 생성되며, 앱의 메인 화면을 그리는 데 사용되는 뷰 컨트롤러를 root view controller로 설정
부모 또는 수퍼뷰(superview)/자식 또는 서브뷰(subview)

1초 마다 배경색이 바뀌는 코드
import UIKit
class ViewController: UIViewController {
var colorChangeTimer: Timer?
override func viewDidLoad() {
super.viewDidLoad()
colorChangeTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
let red = CGFloat(arc4random_uniform(256)) / 255.0
let green = CGFloat(arc4random_uniform(256)) / 255.0
let blue = CGFloat(arc4random_uniform(256)) / 255.0
self.view.backgroundColor = UIColor(red: red, green: green, blue: blue, alpha: 1.0)
}
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
colorChangeTimer?.invalidate()
colorChangeTimer = nil
}
}


제약 조건인데 둘다 0으로 추가해주면 정중앙에 배치가 돼요
모든 기기의 방향까지 고려하여 수정해도 거의 그대로 나타나게 하는 것이 오토레이아웃 이에요
- 오토레이아웃이란?
퍼즐 맞추기: 오토레이아웃은 마치 퍼즐을 맞추는 것과 비슷해요. 우리가 퍼즐 조각을 어떻게 맞출지 정해주면, 그 조각들이 서로 어떤 위치에 있어야 하는지 자동으로 맞춰져요. - 자동으로 크기 조절: 화면 크기가 다르면, 오토레이아웃이 알아서 조각들의 크기를 조절해줘요. 예를 들어, 스마트폰을 세로로 들 때와 가로로 들 때, 화면이 다르게 보이잖아요? 오토레이아웃은 이런 상황에서도 잘 맞춰줘요.
- 규칙 정하기: 우리가 "이 버튼은 화면의 가운데에 있어야 해" 또는 "이 텍스트는 이 이미지의 아래에 있어야 해" 같은 규칙을 정해주면, 오토레이아웃이 그 규칙을 따라 배치해줘요.
- 모든 화면에 맞게: 오토레이아웃을 사용하면, 다양한 크기의 화면에서도 앱이 잘 보이게 할 수 있어요. 그래서 친구의 스마트폰이나 부모님의 태블릿에서도 똑같이 잘 보이게 해준답니다.

전광판 앱 기획서
1. 앱 개요
앱 이름: FlashBoard
목적: 사용자에게 실시간으로 정보를 전달하고, 다양한 텍스트 및 이미지 효과를 통해 시각적으로 매력적인 전광판을 제공하는 앱.
2. 주요 기능
텍스트 입력 및 편집
사용자 정의 메시지 입력 기능.
다양한 글꼴, 색상, 크기, 배경색 설정.
텍스트 정렬 및 애니메이션 효과 (흐르기, 깜빡이기 등).
이미지 및 영상 추가
이미지 및 GIF 파일을 추가하여 전광판에 표시.
비디오 클립 재생 기능 (예: 광고, 이벤트 홍보).
템플릿 제공
다양한 디자인 템플릿 제공 (예: 생일 축하, 이벤트 안내 등).
사용자가 템플릿을 커스터마이즈할 수 있는 기능.
실시간 데이터 피드
RSS 피드를 통해 뉴스, 날씨, 스포츠 등 실시간 정보 제공.
사용자가 원하는 정보를 선택적으로 표시할 수 있는 필터 기능.
스케줄링 기능
특정 시간에 특정 메시지나 이미지를 자동으로 표시할 수 있는 스케줄러.
주간 또는 월간 일정 관리 기능.
음악 및 효과음
배경 음악 및 효과음 추가 기능.
사용자 설정에 따라 소리 켜기/끄기 옵션 제공.
소셜 미디어 통합
사용자 소셜 미디어 계정 (예: Instagram, Twitter)에서 콘텐츠 가져오기.
실시간 피드를 통해 소셜 미디어 업데이트 표시.
다양한 출력 옵션
HDMI, AirPlay, Chromecast와 같은 외부 디스플레이에 전송.
화면 회전 및 해상도 조정 기능.
사용자 설정 및 저장
사용자 프로필 및 설정 저장 기능.
자주 사용하는 메시지 및 이미지 저장 기능.
커뮤니티 및 공유 기능
사용자 간의 메시지 및 디자인 공유 기능.
인기 있는 디자인 및 메시지 추천 섹션.
3. 사용자 인터페이스 (UI) 디자인
홈 화면: 최근 사용한 전광판 디자인 미리보기 및 새 디자인 생성 버튼.
편집 화면: 텍스트, 이미지, 배경 등을 쉽게 조정할 수 있는 직관적인 UI.
설정 화면: 사용자 프로필, 알림 설정, 소셜 미디어 연동 등.
4. 타겟 사용자
행사 주최자, 광고주, 소규모 비즈니스 운영자, 개인 사용자(생일, 기념일 등).
5. 마케팅 전략
소셜 미디어 광고 및 프로모션.
유명 인플루언서와 협업하여 앱 사용 사례 공유.
초기 사용자 대상으로 무료 체험 제공.
6. 수익 모델
기본 무료 버전 제공, 프리미엄 기능은 구독 모델 (예: 추가 템플릿, 광고 제거 등).
인앱 구매 (예: 특별한 템플릿, 음악, 효과).