개발 일지(2) - ListenApp
지난 포스팅 2023. 1. 18 로 부터 1주일이 지났다!
이번 주에는 설날이 끼어 있어서 생각보다는 진도가 늦어졌다.
하지만 그 덕에 기능들과 UI/UX에 대한 많은 고민을 할 수 있었고 더 좋은 방향으로 진행되고 있는 것 같다!
이번 주의 핵심 개발은 재생목록 화면이었다.
별 다를 게 없어 보이지만 많은 변화가 있다ㅎ
먼저 지난 주에는 Document에 있는 음성파일의 Title들을 코드에 array로 작성해 임의로 만들어 두었다. 즉 새로 파일이 추가되거나 제거되는 거를 반영하지 않았으며 폴더와 같은 구성을 만들지 않았었다. 이것을 Document구조에 맞추어 데이터를 가지고 와 DocumentItem이라는 Structure를 통해 TableView를 구성하도록 구현했다.
또 다른 점은 UIMenu를 사용해 선택(파일 및 폴더의 이름변경, 이동, 삭제), 폴더 추가 / 파일 추가(와이파이, usb 케이블) / 정렬 등의 기능들이 가능하도록 작성했다. 물론 Document에 저장이 되어서 문제가 없도록 작성을 하였다.
가장 고민했던 "와이파이를 이용한 파일 추가" 경우는 github에서 오픈 소스를 활용했다.
만들어진 지 좀 되어서 swift도 지원하지만 메인 언어가 objc여서 구글링 하면서 만들었다ㅎ
현재는 "This repository has been archived by the owner on Jan 11, 2023. It is now read-only." 로 되어있어 다른 소스들을 찾았지만 이게 제일 깔끔해서 맘에 들었다...
https://github.com/swisspol/GCDWebServer
GitHub - swisspol/GCDWebServer: The #1 HTTP server for iOS, macOS & tvOS (also includes web based uploader & WebDAV server)
The #1 HTTP server for iOS, macOS & tvOS (also includes web based uploader & WebDAV server) - GitHub - swisspol/GCDWebServer: The #1 HTTP server for iOS, macOS & tvOS (also includes web...
github.com
실행 화면은 다음과 같다!
마지막으로 재생 화면의 UI/UX에 대한 고민이다.
처음 재생화면을 구성할 때 다른 음악 앱들을 많이 참고했다. 하지만 시간을 두고 고민해보니 음악 앱과 만들고자 하는 영어 듣기는 큰 차이가 있었다. 먼저 단순히 영어를 듣는 과정도 있겠지만 이 앱을 쓰는 가장 큰 이유는 다시 들으면서 공부할 때를 위해서라고 생각된다. 다시 들어면서 공부하다 보면 특정 구간을 반복재생하며 듣기도 하고 적절한 구간으로 이동하는 동작이 필요하다. 그게 이 앱의 차별점이라고 생각한다. 하지만 기존 UI/UX는 이런 것을 생각하지 않았다. 따라서 다시 만들려면 시간이 좀 걸리겠지만 재생화면을 새롭게 만들려고 한다! 현재 생각하고 있는 UI는 다음과 같다. (아직 확정은 아니다)
몇가지 고민되었던 점을 뽑다면 다음과 같다.
먼저 재생목록 화면에서 UImenu 를 띄우는 eclipse button에 문제가 있었다. 메뉴에서 선택을 고르면 tableView가 editing으로 바뀌면서 eclipse버튼이 hidden되고 완료 버튼이 hidden false 되도록 만들었는데, 이럴 경우 버튼에 있는 메뉴가 열린 상태에서 해당 버튼을 hidden하기에 경고가 떴다. 원래는 작동이 완료된 후에 hidden이 되도록 하고 싶었지만 결국 해결하지 못했다... 임시방편으로 perform에 있는 afterDelay를 통해 0.1초 뒤에 실행되도록 일단 수정해 두었다. 나중에 다시 만져야 하는 부분으로 체크해 두었다.
음악을 재생해주는 AVAudioPlayer를 설정할 때에 처음에는 playerVC에 저장하려고 했으나 해당 뷰가 꺼질 경우 재생이 되지 않는다. 필자는 다른 화면에 가더라도 계속해서 진행되는 것이 목표이다. 따라서 선택된 오디오 파일를 가지고 있는 audio라는 변수랑 함께 전역변수로 저장했다. 하지만 관련해 공부하면서 player를 싱글톤 형태로 구성하기로 정했다. 가장 큰 이유는 만약 버그로 player 인스턴스가 여러개 생성되는 것을 방지하고자 했다. 또한 player관련해 play, stop, pause와 같은 매서드들을 같이 정리할 필요성을 느껴 이것들을 class화시켰다. 결과적으로는 playerController라는 class를 통해 Player를 싱글톤 형태로 구성했고 관련 함수들 또한 추가해주었다.
돌아오는 주에는 UI 구성을 마치고 재생화면에서의 대략적인 기능들을 완성하는 것이 목표다!