시간정원
← Blog

sideproject · 2026-08-18 · 조회수 22

공유 메뉴의 글을 메모로 받고 앱 밖에서는 알림 보내기 — 우리콕 개발기 5

우리콕의 목표는 새 관리 습관을 요구하지 않는 것이다. 채팅이나 웹페이지에서 중요한 내용을 발견했을 때 앱을 열고 다시 입력하면 그 순간부터 번거로워진다. Android 공유 메뉴에서 텍스트와 URL을 바로 받을 수 있게 만든 이유다.

공유받은 글도 바로 저장하지 않는다

ACTION_SEND로 들어온 텍스트는 메모 입력 화면을 거치지 않고 편집 시트로 연다. 복사 과정에서 불필요한 문장이 붙었을 수 있고, 날짜나 저장 공간을 정해야 할 수도 있기 때문이다.

Android 공유 메뉴에서 받은 글을 다듬는 저장 시트

본문을 수정하고 날짜를 선택할 수 있으며, 공간이 여러 개면 상단의 저장 공간을 눌러 대상을 바꾼다. 메인 화면의 공간 전환과 공유 저장 대상은 서로 다른 문맥이라 각 위치에서 선택하도록 분리했다.

앱이 닫혀 있을 때는 FCM이 알려준다

화면 동기화만으로는 백그라운드의 새 메모를 알 수 없다. Android에는 Firebase Messaging을 연결하고, 로그인한 기기의 FCM 토큰을 Supabase에 등록했다. 로그아웃할 때는 현재 토큰을 비활성화해 같은 휴대폰으로 이전 계정의 알림이 계속 오지 않게 한다.

서버 흐름은 다음과 같다.

memos INSERT
  → Supabase Database Webhook
  → Edge Function
  → 공간의 다른 멤버 기기 조회
  → FCM HTTP v1
  → Android 알림

메모와 기기 ID 조합을 전송 기록의 키로 사용해 Webhook이 재시도돼도 같은 알림을 두 번 보내지 않는다. 알림을 누르면 data payload의 space_id를 소비해 해당 공간의 메모 탭을 연다. 종료 상태는 getInitialMessage, 백그라운드 상태는 onMessageOpenedApp을 사용하지만 화면 이동은 같은 coordinator로 합쳤다.

“왜 알림이 안 오지?”를 여러 번 겪었다

첫 실패는 Edge Function의 service role에 테이블 조회 권한이 부족한 문제였다. RLS를 우회하는 역할이어도 명시적인 select 권한이 없으면 조회할 수 없었다. 필요한 테이블에 최소 권한을 추가했다.

다음은 Firebase 서비스 계정의 private key였다. JSON의 \\n이 섞인 문자열을 그대로 secret에 넣으면 Google 인증 단계에서 실패했다. 실제 여러 줄 PEM 값으로 다시 등록하고 함수 전체에 오류 경계를 추가해 FCM 응답을 로그로 남겼다.

Android 13 이상의 알림 권한이 꺼져 있으면 FCM 서비스가 메시지를 받아도 시스템이 표시하지 않는다. 설정 시트에서 Android 알림 설정으로 바로 이동할 수 있게 했다. 알림을 눌러 항목만 사라지고 앱이 열리지 않던 문제는 MainActivity의 FLUTTER_NOTIFICATION_CLICK intent filter가 빠져 있었기 때문이었다.

긴 본문은 알림에서 어디까지 보여줄까

실제 메모 내용을 보여달라는 피드백을 반영했지만, 긴 글을 그대로 노출하니 알림 하나가 화면 대부분을 차지했다.

긴 메모가 알림에 거의 전부 표시되던 수정 전 화면

현재는 알림 제목에 공간명을 사용하고, 본문은 개행과 연속 공백을 한 줄로 정리해 최대 40자만 보낸다. 공간명 조회가 실패하더라도 푸시 전체가 중단되지 않도록 우리콕을 기본 제목으로 사용한다. 앱에서 메모를 실제로 확인하면 시스템 알림과 런처의 알림 점도 함께 지운다. 가족 메모에도 민감한 내용이 들어갈 수 있으므로 잠금 화면의 미리보기 노출 범위는 Android 알림 설정에서 사용자가 조절할 수 있게 안내한다.

공간명과 줄인 메모 본문이 표시된 현재 Android 알림

배터리를 위해 백그라운드에서 주기적으로 서버를 조회하지 않는다. 새 메모 알림은 FCM이 담당하고, 앱으로 돌아왔을 때만 커서 이후의 변경분을 가져온다.

댓글

목차