Skip to content

[FEATURE] 저장 링크 변경 감지 알림 및 FCM 수신 UI 구현 #91

Description

@kbh0218

📝 기능 설명

저장한 링크를 스케줄러가 주기적으로 확인하고, 이전 검사 결과 또는 링크 상태와 달라진 내용이 있을 때 사용자에게 알림을 표시하는 기능을 구현합니다.

백엔드에서는 특정 기간마다 사용자가 저장한 링크를 스케줄러로 점검하고, 변경된 사항이 있으면 FCM을 통해 프론트 앱으로 알림을 전송합니다.
프론트에서는 FCM 메시지를 수신한 뒤 푸시 알림과 앱 내부 알림 모달을 통해 사용자가 변경 결과를 확인할 수 있도록 합니다.

이번 작업에서는 알림 수신 흐름, 앱 내부 모달 디자인, 푸시 알림 메시지 문구, 변경 있음/변경 없음 케이스별 표시 정책을 함께 정리합니다.

📋 구현할 Task

  • 저장 링크 변경 감지 알림의 전체 흐름을 확인했는가?
  • 백엔드에서 전달할 FCM payload 구조를 확인했는가?
  • FCM 메시지 수신 시 필요한 데이터 필드를 정의했는가?
  • 변경 있음/변경 없음 케이스를 구분할 수 있는 status 또는 type 값을 정했는가?
  • 앱 foreground 상태에서 FCM 메시지를 수신했을 때 앱 내부 모달을 표시하는가?
  • 앱 background 또는 종료 상태에서 푸시 알림을 눌렀을 때 적절한 화면으로 이동하는가?
  • 알림을 눌렀을 때 저장 링크 상세 또는 검사 결과 화면으로 이동하는 정책을 정했는가?
  • 변경된 저장 링크가 여러 개인 경우 표시 방식을 정했는가?
  • 변경된 사항이 없는 경우에도 사용자에게 알림을 표시할지 정책을 정했는가?
  • 변경 없음 케이스의 푸시 알림 문구를 정했는가?
  • 변경 있음 케이스의 푸시 알림 문구를 정했는가?
  • 앱 내부 알림 모달의 제목, 본문, 버튼 문구를 정했는가?
  • 앱 내부 알림 모달에서 변경 있음/변경 없음 상태가 시각적으로 구분되는가?
  • 알림 모달의 닫기, 상세 보기 버튼 동작을 구현했는가?
  • 알림 수신 중복 처리 또는 같은 알림 반복 표시 방지 정책을 검토했는가?
  • FCM token 등록 및 갱신 흐름과 충돌하지 않는지 확인했는가?
  • Android 실제 기기 또는 preview 빌드에서 푸시 알림 수신을 확인했는가?
  • 앱 foreground/background/terminated 상태별 알림 동작을 확인했는가?
  • 알림 문구가 LinClean 앱 톤과 어색하지 않은지 확인했는가?

📎 우선 확인 대상

FCM 및 알림 수신 흐름:

  • FCM token 등록 위치
  • push notification listener 등록 위치
  • foreground message handler
  • notification response handler
  • 앱 시작 시 알림으로 진입하는 흐름

앱 내부 알림 UI:

  • 공통 모달 컴포넌트
  • 알림 모달 신규 컴포넌트
  • 변경 있음 상태 UI
  • 변경 없음 상태 UI
  • 상세 보기 버튼
  • 닫기 버튼

관련 화면 후보:

  • app/(tabs)/(home)/saved-links.tsx
  • app/(tabs)/(home)/scan-result.tsx
  • app/(tabs)/(home)/scan-result-caution.tsx
  • app/(tabs)/(home)/scan-result-block.tsx
  • app/(tabs)/(home)/index.tsx
  • app/(tabs)/(folder)/[id].tsx

메시지 데이터 후보:

  • notificationId
  • type
  • status
  • checkedAt
  • savedLinkId
  • url
  • title
  • previousVerdict
  • currentVerdict
  • changedCount
  • summary
  • deepLink

📎 알림 문구 초안

변경 있음 - 푸시 알림:

  • 제목: 저장한 링크에 변경 사항이 있어요
  • 본문: 스케줄러가 이전과 달라진 검사 결과를 감지했어요. 자세한 내용을 확인해보세요.

변경 있음 - 앱 내부 모달:

  • 제목: 변경 사항이 발견됐어요
  • 본문: 저장한 링크의 검사 결과가 이전과 달라졌어요. 변경된 내용을 확인해보세요.
  • 주요 버튼: 변경 내용 보기
  • 보조 버튼: 닫기

변경 없음 - 푸시 알림:

  • 제목: 저장한 링크에 변경 사항이 없어요
  • 본문: 최근 확인 결과, 이전과 달라진 내용은 발견되지 않았어요.

변경 없음 - 앱 내부 모달:

  • 제목: 변경 사항이 없어요
  • 본문: 스케줄러가 저장한 링크를 확인했지만, 이전과 달라진 내용은 발견되지 않았어요.
  • 주요 버튼: 확인

여러 링크 변경 시 문구:

  • 제목: 저장한 링크 {n}개에 변경 사항이 있어요
  • 본문: 스케줄러가 여러 링크의 변경 사항을 감지했어요. 변경된 내용을 확인해보세요.

📎 처리 방향

  • FCM payload에는 화면 표시용 문구만 의존하지 않고, 프론트에서 상태값을 기준으로 문구를 구성할 수 있도록 합니다.
  • 변경 여부는 status: "changed" | "unchanged" 또는 유사한 명확한 값으로 구분합니다.
  • foreground 상태에서는 시스템 푸시만 의존하지 않고 앱 내부 알림 모달을 표시합니다.
  • background 또는 terminated 상태에서는 사용자가 푸시 알림을 눌렀을 때 관련 저장 링크 또는 검사 결과 화면으로 이동하도록 처리합니다.
  • 변경 있음 상태는 사용자가 바로 상세 내용을 확인할 수 있도록 변경 내용 보기 액션을 제공합니다.
  • 변경 없음 상태는 정보성 안내로 처리하고, 사용자의 추가 행동을 강제하지 않습니다.
  • 변경 없음 알림을 실제로 푸시로 보낼지 여부는 백엔드 스케줄러 정책과 사용자 피로도를 고려해 결정합니다.
  • 알림 문구는 너무 기술적인 표현보다 사용자가 이해하기 쉬운 표현을 우선 사용합니다.
  • FCM payload 원문이 비어 있거나 예상과 다른 값이어도 앱이 깨지지 않도록 fallback 문구를 제공합니다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions