사람함께에이전트▾
사람 — 직접 정하고 책임지는 비즈니스 규칙과 흐름. 직접 읽어보세요.
함께 — 개념은 알아두고, 세부 규칙은 에이전트가 따릅니다.
에이전트 — 에이전트가 따르는 규칙과 레퍼런스. 필요할 때 찾아보세요.
token이나 같은 deviceId로 다시 등록하면 그 항목을 바꾸므로, 바뀐 토큰이 쌓이지 않습니다.updatedAt은 서버가 씁니다. 토큰을 등록할 때 기록하며, 클라이언트가 보낸 값은 쓰지 않습니다.signoutUser가 설치의 deviceId를 보내므로, 물려받은 폰이 앞 사람의 알림을 받지 않습니다.Notification.Zone.Initialize가 다음 방문 때 기기를 다시 등록합니다.user 시그널에 있는 User 가드 엔드포인트이며, notification 스토어의 registerPushToken, unregisterPushToken, loadPushState가 부릅니다:DeviceToken을 호출한 사용자에게 저장하고, 이전 항목을 바꿉니다.Self가 넘겨줍니다. 그래서 클라이언트가 다른 사람 계정으로 토큰을 등록할 수 없습니다.mcp: false입니다.firebase는 서비스 계정입니다. Firebase Console의 프로젝트 설정 → 서비스 계정에서 받고, 내려받은 JSON에서 위 다섯 필드를 옮겨 적습니다. Android와 웹에 필요합니다.apns는 .p8 키입니다. privateKey는 파일의 텍스트이고(\n 이스케이프도 됩니다), keyId와 teamId는 Apple Developer에서, bundleId는 앱의 native.appId입니다. iOS에 필요합니다.google-services.json이 아닙니다. 그 파일은 Android 앱 설정이고, 이것들은 모든 발송에 서명합니다.pushNoti.apns is not configured 같은 warn 로그 한 줄만 남기고 그 토큰들을 건너뛰며, 실패로 셉니다.NotificationService.accepts입니다. block과 disagree는 전부 막고, fewer는 actionRequired와 essential만 통과시키며, pauseUntil이 미래면 전부 막고, 토큰이 없는 사용자는 건너뜁니다.410이나 BadDeviceToken, FCM의 messaging/registration-token-not-registered를 받으면 같은 호출 안에서 주인에게서 지웁니다.push()는 닿은 범위(targetUserIds, tokenNum, successCount, prunedTokens)를 돌려주고, 발송 실패가 호출한 쪽의 일을 실패시키지 않습니다.type: "all" 알림은 모든 활성 사용자에게 500명씩 나가며, 다른 푸시처럼 accepts를 거칩니다.actionRequired, notice, essential, suggestion, advertise 중 하나입니다. 수신 설정 판정이 읽습니다.libs/shared 없이 쓴다면 @libs/util/srvkit의 PushNotificationServer.sendEach(targets, message)를 { token, provider } 목록으로 부르고, 돌려받은 invalidTokens는 더 이상 저장하지 않습니다.akan.config.ts의 native에 적습니다.google-services.json은 서버 인증 정보가 아닙니다. Android 앱용 Firebase 설정 파일이지, Firebase Admin 서비스 계정 JSON이 아닙니다. 서버 인증 정보는 마지막 섹션처럼 env.server.*에 둡니다.url로 이동합니다.native.android.push로 channel({ id, name, importance? }), smallIcon(앱 폴더 안의 흰색·투명 PNG), 강조 color를 대신 정합니다..p8은 서버에만 둡니다. 이 키는 팀의 모든 앱에 푸시를 서명합니다. env.server.*에 두고, env.client.*나 public/에는 절대 두지 않습니다.