iOS Swift 무드등 앱 만들기
※이 iOS 카테고리의 글 들은 학교 강의와 과제를 기반으로 작성한 것입니다.※
이번 포스트에서는 취침 할 때 편안히 잠들 수 있게 도와주는 무드등 앱을 만들어 보겠습니다.
- Application Process
시작하기 앞서 Application Process의 간단한 개념 몇가지 짚고 넘어가겠습니다.
1. viewDidLoad
- viewController의 View가 메모리에 로드된 직후에 호출, 초기설정 장소
2. viewWillAppear
- viewController의 View가 화면에 나타나기 직전에 호출(Loading 화면 등)
3. viewDidAppear
- viewController의 View가 화면에 나타난 직후에 호출
4. App Life Cycle
- Application이 시작되고 종료될 때까지의 Process
5. View Life Cycle
- viewDidLoad(초기 설정) -> viewWillAppear, viewDidAppear -> 화면에 view 출력
반대로 출력된 화면이 viewWillAppear, viewDidAppear을 거쳐 다시 view가 화면에서 사라지는 과정
- 무드등 + 배경음악 앱 구현하기
import UIKit
import AVFoundation
class ViewController: UIViewController {
// 타이머와 오디오 플레이어를 위한 변수 선언
var colorChangeTimer: Timer?
var audioPlayer: AVAudioPlayer!
override func viewDidLoad() {
super.viewDidLoad()
// 탭 제스처 인식기를 생성하여 뷰에 추가. 탭 시 handleTapGesture 함수 호출
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture))
view.addGestureRecognizer(tapGesture)
// 앱이 포어그라운드로 오는 상황을 감지하기 위해 NotificationCenter에 옵저버 추가
NotificationCenter.default.addObserver(self, selector: #selector(applicationWillEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
}
// 앱이 포어그라운드로 돌아올 때 호출되는 메소드
@objc func applicationWillEnterForeground() {
startTimerAndMusic()
}
// 화면을 탭했을 때 호출되는 메소드
@objc func handleTapGesture() {
stopTimerAndMusic() // 타이머와 음악 재생 중지
// 사용자에게 알림을 띄워 앱 종료를 요청
let alert = UIAlertController(title: "알림", message: "앱을 종료해주세요.", preferredStyle: .alert)
let okAction = UIAlertAction(title: "확인", style: .default, handler: nil)
alert.addAction(okAction)
present(alert, animated: true, completion: nil)
}
func startTimerAndMusic() {
// 배경 음악 재생 설정
if let soundURL = Bundle.main.url(forResource: "bgm", withExtension: "mp3") {
do {
audioPlayer = try AVAudioPlayer(contentsOf: soundURL)
audioPlayer.play() // 음악 재생
} catch {
// 음악 파일 로드 또는 재생 중 에러 발생 시 처리
print("음악 파일 로드 또는 재생 중 에러 발생: \(error)")
}
}
// 1초마다 배경색을 변경하는 타이머 시작
colorChangeTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
// 랜덤한 RGB 값을 생성하여 배경색 설정
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)
}
}
func stopTimerAndMusic() {
// 타이머를 중지하고 오디오 플레이어를 정지
colorChangeTimer?.invalidate()
colorChangeTimer = nil
audioPlayer.stop()
}
}
- 앱의 배경색은 1초마다 랜덤하게 변경됩니다. 이를 위해 Timer 클래스를 사용하여 1초마다 반복되는 이벤트를 생성하고, 이 이벤트 내에서 랜덤한 RGB 값을 생성하여 뷰의 배경색을 설정했습니다. 이 과정은 사용자가 화면 어디든 탭하면 중지됩니다.
- 음악 재생 기능은 AVAudioPlayer 클래스를 사용하여 구현되었습니다. Bundle에서 음악 파일을 찾아 로드한 후, 오디오 플레이어를 통해 재생을 시작합니다. 사용자가 화면을 탭하면 음악 재생도 마찬가지로 중지됩니다.
- 사용자가 화면을 탭하면, 앱은 "앱을 종료해주세요."라는 메시지와 함께 알림을 보여줍니다. 이는 UIAlertController를 사용하여 구현되었습니다. 이 알림은 사용자에게 직접적인 행동을 요구하는데 이는 AppStore에 Application을 등록하기 위한 기준 중 하나입니다.
- 또한, 이 앱은 앱이 포어그라운드로 돌아올 때 자동으로 음악 재생과 배경색 변경을 재개합니다. 이는 NotificationCenter를 통해 앱의 생명주기 이벤트를 감지하여 구현되었습니다.
이번 무드등 앱 만들기를 통해 다른 Java 프로젝트를 진행하다가 굳어버린 뇌를 다시 풀어내는 계기가 되었습니다.
항상 모두 신경쓸려고 하는데 학회장도 같이 하다보니 쉽지가 않네요... 자신의 부족한 점을 깨닫고 더욱 앞으로 나아가는 개발자가 되어보겠습니다.
피드백은 언제나 환영입니다!