[iOS] Audio Play in Background

HYUNGU, KANG·2021년 1월 13일
0

우리 앱은 Android 이슈 및 iOS 에서의 Ducking 등으로 인해 react-native-track-player 를 fork 해서 사용하고 있는데
어느 순간부터, 앱 내의 연속 재생 기능이 백그라운드에서 동작하지 않는 이슈가 발생했다.
(TrackPlayer 에서 제공하는 Queue 는 사용하지 않고, 별도로 Javascript 의 Store 에서 Queue 만들어 관리를 하고 있다.)


해당 기능의 로직은 아래와 같은 순서로 동작한다.

  1. 재생 큐 추가
  2. 큐의 첫번째 아이템을 재생
  3. 재생 완료
  4. 큐가 비어있지 않다면, 2번으로
  5. 큐가 비어있다면 재생 완료

그런데 step_4 에서 step_2 로 옮겨가는 과정에서 동작이 제대로 이루어지지 않는 현상이 발생했다.
앱이 최초로 Start 한 뒤에는 동작하지 않지만, FastRefresh 가 이루어지면 제대로 동작을 해서
더욱이 디깅하기가 까다로웠다.


일단 TrackPlayer 의 Native 코드까지 호출은 되어서, Native 쪽의 어떠한 설정의 문제라고 판단이 되어 검색을 시작했고, 아래와 같은 Q&A 찾았다.
https://developer.apple.com/library/archive/qa/qa1668/_index.html

대충 백그라운드에서 AudioSession 이 in-active 되면 정상적으로 동작하지 않는다는 이야기였는데
Ducking 관련 로직을 추가하느라, AudioSession 코드를 추가한 이력이 있긴 해서 확인을 해봤는데
한번에 될 리 없지, 결과는 역시나 그대로였다.

관련된 것 같기는 해서, AudioSession / MPRemoteCommandCenter 관련 로직들을 하나씩 제거하며 테스트 해 본 결과

MPRemoteCommandCenter 수신을 끝내는 UIApplication.shared.endReceivingRemoteControlEvents() 메소드가 호출되면, 백그라운드에서 TrackPlayer(AVPlayer) 관련 로직이 호출은 되지만 실행되지 않는것을 확인했다.


또, NowPlayingCenter 를 잠금화면에서 제거하기 위해서는 UIApplication.shared.endReceivingRemoteControlEvents() 호출해야 하는데
UIApplication.shared.beginReceivingRemoteControlEvents() 를 호출한 횟수만큼 UIApplication.shared.endReceivingRemoteControlEvents() 를 호출해야 사라진다 (...)


어렵고도 심오한 iOS 의 세계.. 👀

profile
JavaScript, TypeScript and React-Native

14개의 댓글

comment-user-thumbnail
2021년 1월 26일

안녕하세요. 혹시 해당 이슈를 어떻게 해결했는지 알 수 있을까요?
저희도 react-native-track-player 사용 중인데 백그라운드에서 오디오가 멈추는 현상이 있어서요.
부탁드립니다. (__)

3개의 답글