관리 메뉴

사과하는 제라스

[iOS 개발 오류] 왜 어쩔 때는 Background Mode가 되고 안될까? 본문

제라스의 iOS 공부/iOS 개발 오류

[iOS 개발 오류] 왜 어쩔 때는 Background Mode가 되고 안될까?

Xerath(제라스) 2024. 11. 30. 17:38

목차

    728x90
    반응형

    서론

    안녕하세요! 개발자 제라스입니다! 👋🏻🤖👋🏻

     

    후...어떤 제목이 어울릴까...고민하다가 진짜 막 지어버렸습니다 ㅋㅋㅋㅋㅋㅋㅋ

    혹시나 필요한 해결법은 아닐 수 있지만 그냥 재미로 봐주시면 감사드리겠습니다!

     

    제가 Sqoop 앱 개발을 하다가 경험한 트러블 슈팅을 공유해보고자 합니다!

    Background Mode를 지원 안했었는데 지원이 돼요...!

    저희 Sqoop 앱은 어떤 영상으로부터 노래를 추출해내는 '재검색'('2차 스쿱'이라고도 부릅니다!) 기능이 있습니다.

    근데... 이게 영상이 무지 길면 엄청 길 수도 있습니다...!

    그래서 이때 유저가 이탈 가능성이 있다보니 Background Mode를 지원해야 하는 필요성이 있습니다.

     

    하지만 구현을 하다보니 이 Background Mode로 앱의 작업을 보장하는 것이 잘 안되더라구요...!

    밖으로 나가버리면 거의 대부분 작업이 Pause되는 것을 발견하게 되었습니다.

     

    그래서...너무 아쉽게도 앱을 계속 켜놓아야 추출이 진행되는 방식으로 구현했습니다...

     

    그러던 어느 날! 2차 출시를 하려고 하는데...

     

    갑자기 Background Mode가 제대로 동작이 되는 겁니다...!!! ㄷㄷㄷㄷㄷㄷㄷ

     

    그래서 그대로 백그라운드 모드를 지원한다고 써두고 출시했거덩여??

    근데... 개발 중에 발견한 이슈...!

    • 노래를 듣다가 앱의 추출을 진행하면 노래가 멈춰버림.
    • 간헐적으로 백그라운드에서 앱 추출이 중단되어버림.
    • 돌아왔을 때 mp4가 멈춰버림.

    이런 현상들이 존재하더라구요...!

     

    그래서 이때부터 고민이 시작됩니다.

     

    대.체.왜.이.런.걸.까?

     

    왜 Background Mode가 작동하게 되었는데, 왜 종종 외부 미디어랑 충돌을 하게 되는 건지 고민이 되었죠.

     

    그러다 하나의 실마리를 찾게 되었어요!!

    외부의 Audio와 현재 앱이 충돌을 한다는 건 앱의 2차 스쿱 동작에서 충돌이 생기는 것인데...

    그럼 앱에서 어떤 미디어랑 충돌이 나는 건가... 고민해보니!!!

    2차 스쿱 ProgressView에 스쿱핑하는 Animation mp4를 AVQueuePlayer로 실행을 하고 있었던 것...!!

     

    이걸 보고선 🕵🏻‍♂️탐정 제라스🕵🏻‍♂️는 인과 관게를 찾기 시작했고...!

    그러고 발견한 것은 mp4 파일이 문제란 것을 확신한 이유는 다음과 같은 상황이라고 생각했습니다.

     

    왜 Background Mode가 되기 시작했을까?

     

    가장 먼저 발견한 사실은 '왜 예전엔 Background Mode가 안되다가 이제는 될까?'에 대한 이유였는데

    저번 구현 당시와 달리 ProgressView에 있는 mp4가 재생됨으로써 앱의 작업이 Background에서도 실행되는 것을 보장해주는 것이었습니다!

     

    노래를 듣다가 앱의 추출을 진행하면 노래가 멈춰버리는 이유

     

    외부에서 노래를 듣다가 Sqoop앱에서 2차 추출을 하면 Animation이 실행되고,

    AudioSession에서 play될 음성 자체를 이 mp4가 차지하는 바람에...!

    듣던 노래가 재생이 정지되어버리는 것이었습니다!

     

    간헐적으로 백그라운드에서 앱 추출이 중단되어버리는 이유

     

    백그라운드에서 외부 시스템의 개입으로 인해

    mp4가 시스템 리소스 부족 등의 이유로 방해를 받아 무한 루프를 돌 수 없게 되고

    그 결과 mp4는 한번 실행이 되고는 다음 재생들을 Run Loop에 올려둘 수가 없게 되는 거죠!

    그러니 mp4가 중단된다 == 앱이 백그라운드에서 유지될 수 없다. 이기에 중단이 되는 것이었습니다.

     

    Background에서 다시 추출 중인 앱으로 돌아왔을 때 mp4가 멈춰버리는 이유

     

    이것도 사실 위와 같은 이유로

    앱의 mp4가 중단되고 앱의 작업이 멈추기 때문에

    다시 앱으로 돌아왔을 때 AVQueuePlayer가 아니라 그저 한번 실행하는 AVPlayer가 한번 실행되고 끝난 상태인 거죠.

    즉, 무한 루프 기능이 사라진 상태의 mp4가 올라와있는 상황과 같은 거죠!

     

    2가지의 수정으로 해결해내기

    mp4 영상을 활용한 Background Mode 보장

    일단 문제는 외부 시스템이 AudioSession에 개입하게 되면서 Sqoop 앱의 mp4가 실행되는 것을 막아버리는 것입니다.

    그래서 위와 같이 Audio 및 시스템 프로세스로부터 방해를 받지 않는 채 재생을 유지하고,

    Sqoop앱 내 mp4의 Audio의 재생을 방지하는 방식으로 구현을 했습니다!!

    (중요한 라인은 isMuted = true입니다!)

     

    이렇게 하면 AudioSession과 연결된 작업이 아니기에

    백그라운드에서 오디오 세션의 사용량이 많아져도 이것과 관계없이 계속 비디오를 실행시킬 수 있어집니다.

     

    즉, AudioSession과의 연관성을 없앰으로써 mp4의 무한 실행을 보장하고,

    다시 앱으로 돌아와도 Animation이 실행되고 있도록 해주는 겁니다.

     

    외부에서의 동작과 완전 무관한 Background Mode 구현

    이것과 함께 또 발생하던 문제가 있었는데...!

    그건 바로

    '외부에서 Audio를 재생 하다가 앱에서 Animation을 실행하면 중단,

    Sqoop 추출을 하다가 백그라운드에서 Audio/Video 파일을 실행하면 Sqoop 추출이 중단되는 현상'

    이었습니다.

     

    즉, 다른 시스템(App)에서 실행되는 미디어와 Sqoop 과정은 공존이 불가능한 것입니다.

    이것을 해결하기 위해서 다음과 같이 AudioSession에 ambient 처리를 했습니다.

     

    이렇게 ambient 처리를 해두는 건 앱의 오디오를 백그라운드 사운드처럼 혼합되도록 설정하는 겁니다.

    ambient가 '주변의, 포위된' 이런 뜻을 가지고 있잖아요??

    즉, 다른 오디오들과 같이 실행될 수 있다는 겁니다.

     

    근데 여기엔 문제가 있습니다...!

    같이 실행된다는 거지, 소리가 겹쳐서 나오는게 아닙니다!Sqoop과정과 노래는 같이 실행되지만, Sqoop을 시작하면 사용자에게 들리는 건 Sqoop의 mp4 소리로 바뀝니다.즉, 노래는 계속 재생되는데 무음으로 나오는 거고, Sqoop의 mp4의 소리(이것도 무음임.)가 나옵니다.그래서 결국은 노래를 중단만 안 시켰지 노래를 듣다가 Sqoop을 하면 노래는 안 들립니다.

     

    그래서 추가해준 option이 mixWithOthers입니다.이걸 추가하면 현재 앱의 AudioSession과 외부 앱의 AudioSession이 모두 소리가 소리가 겹쳐지게 할 수 있어집니다.

     

     

    이렇게 고치고나니 이제는 외부에서 노래를 듣다가 2차 스쿱을 해도 노래가 안 멈추고,

    2차 스쿱을 하면서 노래를 듣는 것도 가능해졌습니다!

     

    또한, Background에서 Suspended되지 않고 계속 추출 작업을 수행할 수 있는 것도 가능해졌죠 ㅎㅎㅎ

    마무리

    Sqoop 앱을 개발하면서 이번 기능은 정말 중요했습니다.

    물론, 모든 기능 하나하나가 다 소중하고 중요하긴 하지만...!

    Background Mode를 제공한다는 것은 Sqoop 앱 유저들이 화면을 켜놔야 한다는 강제성을 줄이고,

    그 시간에 다른 작업들을 할 수 있게 된다는 점에서 너무 기획적으로 중요했던 것이거든요.

     

    좌절되었던 Background Mode 지원...

    근데 우연히 mp4 덕분에 지원이 되었고...

    근데 이상하게 잘 안되는 상황이 발생했고...

    그걸 원인을 찾아내서 고쳐냈다는...

     

    정말 지옥과 천당을 오가는 죽음의 개발기 ㅋㅋㅋㅋㅋㅋㅋ

    그래도 잘 구현이 되었고, 서로 다른 시스템의 AVAudioSession들끼리의 충돌에 대한 학습을 할 수 있어서 좋았습니다~!!😄😄

    참고

     

    https://developer.apple.com/documentation/avfaudio/avaudiosession

     

    AVAudioSession | Apple Developer Documentation

    An object that communicates to the system how you intend to use audio in your app.

    developer.apple.com

     

    https://developer.apple.com/documentation/avfaudio/avaudiosession/category/1616560-ambient

     

    ambient | Apple Developer Documentation

    The category for an app in which sound playback is nonprimary — that is, your app also works with the sound turned off.

    developer.apple.com

     

    https://developer.apple.com/documentation/avfaudio/avaudiosession/categoryoptions/1616611-mixwithothers

     

    mixWithOthers | Apple Developer Documentation

    An option that indicates whether audio from this session mixes with audio from active sessions in other audio apps.

    developer.apple.com

     


    아직 꼬꼬마 개발자입니다.

    더 나은 설명이나 코드가 있다면 언제든 환영입니다.

    적극적인 조언과 피드백 부탁드립니다!

     

    그럼 오늘도 개발 가득한 하루되세요!

    - Xerath -

    🤖🤖🤖🤖🤖🤖🤖

     

    728x90
    반응형