
웹 버전은 관리자 페이지만 만들어 놓았는데, 세션 진행을 제외하고 피드나 기록 같은 건 웹 버전이 있어도 괜찮을 것 같다. 그런 생각은 며칠 전에 했지만 기능 개선에 밀려 며칠 미뤄두었다. 이제 슬슬 작업하고 넘어갈까 싶다.
네비게이션 쉘 내부의 route들은 일괄적으로 좌우 여백 설정을 할 수 있다. 회원가입/로그인 화면을 비롯하여 네비게이션 쉘 밖에 있는 녀석들은 따로 신경써야 한다. 찾아보니 바깥에 있는 녀석들도 일일이 하드코딩하기보다는 공통 위젯을 도입하는 게 좋을 것 같더라.
홈 화면은 세션 시작 버튼만 막을까 웹에서 아예 뺄까 고민하다가 아예 빼기로 했다. 세션 시작이 없는 홈 화면은 다른 탭으로 이동하기 위한 과정을 하나 추가할 뿐, 별다른 기능을 하지 않는다는 게 내 판단이다. 주간 활동 인디케이터도 위치/날씨 정보도 지금 세션 진행할 거 아니면 굳이 알 필요 없는 것들이니까. 웹 버전에서는 피드를 메인으로 두기로 했다.
기본적으로 모바일 앱 화면을 그대로 두고 네비게이션 버튼 위치를 조정했다. 화면이 가로로 길면 NavigationBar 가 아닌 NavigationRail 로 좌측에 뜨도록 설정했다. 그러고보면 인스타그램이라던가 여러 서비스에서 이런 식으로 하는 걸 봤던 것 같다. 화면 크기와 별개로 웹인지 앱인지에 따라 홈 탭 사용 여부를 구분했다. 모바일 기기로 웹 버전 접속하면 홈 탭만 없을 뿐 앱으로 접속하는 것과 비슷한 사용자 경험을 할 수 있고, PC에서 접속했을 때도 화면 크기에 따라 적절하게 조정되는 것이다.
Button 으로 구현되어 있는 부분은 마우스 호버 시 클릭 커서로 바뀌어 직관적인데 GestureDetector 로 구현되어 있는 부분은 그렇지 않아서 MouseRegion 으로 감싸주기로 했다. FeedPostCard 의 여백 부분까지 커서가 변경되는 이슈가 있었는데 (클릭은 카드 부분만 되는데 커서 모양만 바뀐다!) hitTestBehavior: HitTestBehavior.deferToChild, 를 주니 해결되었다.
Firebase 기본 도메인과 내 커스텀 도메인, 그리고 개발용 로컬 도메인에 대해 CORS를 설정하고 gcloud 로 배포해야 이미지가 제대로 출력된다.
cors.json[ { "origin": [ "https://movesketch.neonsigntrap.com", "https://move-sketch.web.app", "https://move-sketch.firebaseapp.com", "http://localhost:50000", "http://localhost:3000" ], "method": ["GET", "HEAD"], "responseHeader": ["Content-Type", "Access-Control-Allow-Origin"], "maxAgeSeconds": 3600 } ]
gcloud storage buckets update gs://move-sketch.firebasestorage.app --cors-file=cors.json
처음에는 새로고침하면 로그인 화면으로 돌아가서 당황했는데 콘솔 로그를 분석해 본 결과 웹 버전을 지원하지 않는 녀석들에 대한 처리가 누락되어 발생하는 이슈였다. Firebase Crashlytics와 Firebase FCM 토큰 초기화를 웹 버전이 아닌 경우에만 하도록 수정하니 정상적으로 로그인 세션이 유지된다.
하다 보니 개인정보처리방침과 이용약관은 위젯과 Firebase hosting으로 중복 저장되어 있어 단일진실공급원 원칙에 어긋나기도 하고 공지사항과의 일관성도 안 맞는 것 같아 얘네도 위젯이 아니라 인앱브라우저로 빼기로 했다.
이제 https://movesketch.neonsigntrap.com로 접속하여 웹 버전을 이용할 수 있다.
어느 정도 선에 맞춰야 하는가. 그것은 처음 기획 때부터 좀 난해하긴 했다. 일단 진행해 보고 조정해보자고 해놓고 계속 미뤄두고 있었다. 비공개 테스터의 인터벌 기준에 대한 질문을 듣고 생각해 보니 일단 적당히 넣어두었던 값이구나. 다시 한 번 검토해 보니 일상에서 가볍게 운동하는 사람들에게는 기준치가 너무 높게 책정되어 있는 부분들이 있더라. 아무리 내가 체력과 지구력이 부족한 편이라고 해도 내가 2티어에 도달하는 게 물리적으로 불가능하다니. 물론 체력인증에서 나머지 다 1등급 받아놓고 근지구력 2등급, 심폐지구력 3등급이라 최종 3등급이 나왔던 만큼 심폐지구력이 많이 떨어지는 나를 기준으로 맞추면 너무 후하게 주는 거일 수 있으니 적절한 지점을 찾아봐야지.
인터벌은 절대적인 기준선을 사용할지 상대값을 사용할지에 대한 고민이 있었다. 절대적인 기준선을 사용하는 게 구현은 편하긴 한데, 나와 내 친구만 해도 기본 속도가 다르니 같은 기준선을 쓰기가 애매하단 말이지. 세션 평균 페이스에 대한 상대값을 기준치로 잡았을 때 잘 작동하려나. AI로 사고실험을 해본 후 실제 테스트를 거쳐봐야 할 것 같다. 일단 해보고 이슈가 있으면 추가적인 패치가 필요할 듯.