제가 백그라운드 상태라는 것을 모를 때, 알람 기능을 개발할 때의 일입니다.
타이머 이후에 음악을 플레이를 하고 핸드폰 화면을 끄면 음악이 꺼지는 문제를 마주 했습니다.
당연히, 핸드폰 화면을 끈 상태에서 타이머가 지나도 음악이 플레이가 되지도 않았습니다.
접근 1. 노티피케이션
앱이 꺼진 상황에서도, 소리가 나거나 동작을 하는 기능이 있었는지를 고민하다보니 노티피케이션이 생각이 났습니다.
타이머가 끝난 상황에서, 노티피케이션을 통해 음악을 플레이를 하는 방법으로 진행을 했습니다.
https://developer.apple.com/documentation/usernotifications/unnotificationsound
UNNotificationSound | Apple Developer Documentation
The sound played upon delivery of a notification.
developer.apple.com
https://stackoverflow.com/questions/40689457/why-just-first-5-seconds-of-unnotificationsound-plays
Why just first 5 seconds of UNNotificationSound plays
After updating to iOS 10.1.1 the iOS Notification custom sound stop after 5 seconds. This happens only if device is turned on, but it plays whole 30 seconds if device is off. The UNNotificationS...
stackoverflow.com
Stackoverflow의 글에서 알 수 있듯이, 노티피케이션은 기본 설정으로 5초 이후에 숨겨지기 때문에, 사람을 깨울 수 있는 충분한 길이가 아니라고 판단하고 새로운 방향을 찾기 시작했습니다.
지금 상황에서 저렇게 문제를 마주한다면, 전 온보딩으로 노티피케이션의 설정을 바꾸어 배너 스타일을 바꿔 달라고 요청할 것 같네요 ㅎㅎㅎ
접근 2. 백그라운드 모드
이리 저리 찾아보고 검색을 해보다가, 문득 유투브나 음악 플레이어들은 핸드폰이 꺼져도 음악을 계속 들을 수 있다는 점을 생각했습니다.
이 점을 중심으로, 검색하다 보니 백그라운드 모드를 알 수 있었고
[iOS 앱개발] 음악이나 동영상을 백그라운드에서 재생하기
안녕하세요 Pingu입니다. iOS에서 이 부분 다들 아시나요? 음악이나 동영상 같은 콘텐츠들을 해당 콘텐츠를 제공하는 앱에서 제어하는 것이 아닌 다른 곳에서 제어할 수 있도록 하는 리모컨 같은
icksw.tistory.com
이 글을 중심으로, 개발을 진행하였습니다.
노래를 재생 후 음량을 줄이고, 타이머를 설정
private func startTimer() { // 타이머 끝나고 노래 소리 커짐 o | 홈화면에서 커짐
rightAfterTimerOn()
// 타이머를 설정하고 시작
if self.timer == nil {
// 타이머 인스턴스 생성, queue: 어떤 thread queue에서 반복 동작해야하는지 -> ui 관련 작업은 main에서 하는 것이 일반적
self.timer = DispatchSource.makeTimerSource(flags: [], queue: .main)
// 어떤 주기로 타이머를 동작시킬 지, deadline: 언제부터 작업을 시작할건지, repeating: 몇초마다 반복될 것인지
self.timer?.schedule(deadline: .now(), repeating: 1)
// 타이머와 연동된 이벤트 handler 설정
self.timer?.setEventHandler(handler: { [weak self] in
guard let self = self else { return }
// UI 부분 함수로 빼주기
self.changeUIINTimer()
if self.currentSeconds <= 0 {
// 시간 0초 되면 타이머 종료 -> 함수로 빼주기
self.doWhenTimerEnd()
}
})
self.timer?.resume()
}
}
private func rightAfterTimerOn() {
//...
playMusic()
audioPlayer?.volume = 0
Timer.scheduledTimer(withTimeInterval: self.selectedTime.timeIntervalSinceNow - Date().timeIntervalSinceNow, repeats: false) { (t) in
self.audioPlayer?.volume = 100
}
}
작업을 진행하며, Background 모드에서는 음악을 Play 하는 것은 불가능하지만 재생 중인 노래의 음량을 높이는 것은 가능하다는 것을 알 수 있었습니다.
그래서, 타이머를 동작시키면 음악을 우선 재생하고 음량을 0으로 두었습니다.
타이머가 끝난 이후 볼륨을 100으로 올려 알람을 작동하도록 하였습니다.
결과적으로, 핸드폰 화면을 끈 상태에서 타이머가 끝났을 때, 음악이 들리는 기능을 개발 할 수 있었습니다.
'iOS' 카테고리의 다른 글
배경색에 따른, 글자 색 변환 (0) | 2024.03.19 |
---|---|
커스텀 Color Picker 만들기 (0) | 2024.03.19 |
사용자 경험을 위한 최소버전 설정 (0) | 2024.03.19 |
SwiftUI - 토스페이먼트, 결제 동의 관련 (1) | 2024.03.19 |
이미지 리사이징으로, 저장용량 줄이기 (1) | 2024.03.19 |