← 글 목록

notes

FireBase 푸시 가이드

Firebase 푸시 알림의 React Native 설정·토큰 처리와 수신 흐름 가이드.


프론트 && 애플 환경설정 참고

1. https://velog.io/@mayinjanuary/React-Native-Firebase-로-푸쉬-알림-구현하기-2-IOS-앱-세팅하기#53-여기까지-했는데-푸쉬-알림-테스팅에-실패했다면

(최초 설정, 처음 적용시 아래 애플설정, 안드로이드 설정 필요. 견적주세요는 이미 설정 된 상태라 생략 가능)

애플 설정

1. iOS 인증서 생성

iOS 세팅도 안드로이드와 기본적으론 같습니다.iOS 앱을 내 Firebase 프로젝트와 안전하게 연결하기 위해선, 인증서 파일을 다운받아야 하고, 그걸 내 iOS 앱 안에 세팅해야 합니다.

1.1. Firebase 콘솔에서 iOS 앱 생성하기

앞서 Firebase 프로젝트를 생성하고, 그 안에 안드로이드 앱을 만들었어요!이번에는 Firebase 콘솔로 가서 iOS 앱을 생성하도록 하겠습니다.위에 보이는 iOS 앱 생성 버튼을 눌러주세요.그러면 아래와 같은 창이 뜹니다.

iOS 번들 ID는 반드시 제 프로젝트의 bundle ID 와 같아야 한다고 합니다.내 프로젝트의 bundle ID 를 알아내는 방법은 다음과 같습니다.

Xcode 에서 내 프로젝트를 켜고, General 탭에 들어가면Bundle Identifier 라는 항목에 com. 으로 시작되는 번들 ID 가 보입니다. 이걸 그대로 복사해서 넣어주시면 됩니다.

1.2. 인증서 다운로드 후 내 앱에 집어넣기

앱을 등록하고 나면 2번으로 넘어가면서, 인증서 파일을 다운받을 수 있는 항목이 보입니다.

GoogleService-Info.plist 를 다운받아주세요.그리고 이걸 Xcode 에 열려 있는 내 프로젝트의 root 에 추가해줍니다.RN Firebase 공식 문서에는 복잡하게 되어있지만 그냥 drag & drop 으로도 됩니다. 위치만 착각하지 마세요!!

GoogleService-Info.plist 파일을 옮겨놓으려 하면 이런 창이 뜹니다.Copy items if needed 과 Create groups 에 체크해주시고 Finish 를 눌러주세요.

맞는 위치에 파일이 잘 들어갔나요?

🔥 2. iOS 인증서 생성

그런데 Firebase 가 내 프로젝트 안에 있는 인증서를 사용할 수 있게 하려면, 프로젝트의 가장 앞단에서 iOS SDK 를 세팅해주어야 합니다.(bootstrap phase 를 가장 처음, 가장 앞단으로 번역했는데 혹시 틀렸다면 알려주세요!)

2.1. firebase SDK 추가 (무시)

무시해도 됩니다. 이미 react native firebase 를 설치하면서 SDK 파일이 들어가있을 거라서요!

4.2. 인증키 생성하기

https://developer.apple.com/ 에 들어가 로그인하고,Account -> Certificates, IDs & Profiles로 들어갑니다.

아래 사진의 Key 로 이동해 제목 옆의 + 버튼을 클릭합니다.

생성할 인증키의 이름을 입력하고, 첫번째 항목인 Apple Push Notification service(APNs)에 체크합니다.체크까지 하셨다면 Continue 를 눌러 진행해주세요!

정보가 일치하는지 확인하시고 Register을 눌러주세요.

아래와 같은 화면이 뜨면, Key ID를 잘 적어두시고,우측 상단 Download 버튼을 통해 안전한 곳에 인증키를 다운받습니다.

노란 경고박스에도 쓰여있듯이, 인증키는 한 번 다운받고 나면 두 번 다시 다운받을 수 없습니다. 따라서 지금 당장 안전한 곳에 인증키를 다운받을 수 있는 상황이 아니라면, Done 버튼을 누르고 추후 다운로드받으세요.

잘 저장되었나요?

4.3. 앱 ID 생성하기

이번엔 App ID를 생성해야 하는데요.다시 https://developer.apple.com/ 로 돌아간 후,Identifiers 메뉴에 들어가 제목 옆의 + 버튼을 누릅니다.

첫 줄에 있는 App IDs를 클릭해 들어갑니다.

App을 선택하고, 다음으로 넘어갑니다.

Description에 이름을 써주시고, Explicit을 선택합니다.Bundle ID엔 뭘 써야 하는지 아시죠? 글 처음에 xCode 의 general 에서 긁어왔던 .com 으로 시작하는 Bundle Identifier 를 집어넣습니다.

그리고 Push Notification에 체크를 한 후 Continue를 누릅니다.

그대로 쭉쭉 Register 까지 진행하시면 앱 ID 생성이 완료됩니다.

4.4. 내 iOS 앱에 APN 인증키 등록

이제 위에서 생성한 인증키를 제 iOS 앱에 등록할 차례입니다.

Firebase 콘솔로 가서, 만들어두었던 iOS 앱으로 이동합니다.

클라우드 메시징 탭으로 이동합니다.그러면 하단에 iOS 앱 구성이라는 항목이 보입니다.

APN 인증 키 라고 되어있는 곳에 저희가 만든 .p8 인증키를 업로드합니다.참고로 아래의 APN 인증서라고 되어있는 곳은 .p12 인증서 설정이라고 하네요.헷갈리지 않고 인증키를 등록합니다.

아까 안전한 곳에 저장해두었던 .p8 인증키 파일을 업로드합니다.그리고 안전한 곳에 적어두었던 key ID도 입력합니다.팀 ID 는 여기에 들어가면 확인할 수 있습니다.

모두 입력했다면 업로드 버튼을 눌러주세요.저는 이 앱에 저장된 팀 ID 가 없습니다 라는 에러가 났습니다. 그런데 다시 한 번 업로드 버튼을 누르니 그냥 등록이 됐어요 ㅇ.ㅇ

정상적으로 등록되었나요?

안드로이드 설정

3. 안드로이드 세팅

이 글 첫 파트에서 Firebase 프로젝트를 만들었죠?그 프로젝트와 내 안드로이드 앱을 연결하는 작업입니다.

일단 Firebase 콘솔 창에서 안드로이드 앱을 생성해야 하고,안드로이드 앱 생성 시 증명서 파일이 발급되는데그 증명서 파일을 내 프로젝트 안에 집어넣어야 합니다.

3.1. 안드로이드 앱 생성

Firebase 콘솔에서 새로운 안드로이드 앱을 생성합니다.아래 사진에 보이는 앱 추가 버튼을 누르고 안드로이드 버튼을 클릭합니다.

그러면 앱을 등록하는 페이지가 나옵니다.

Android 패키지 이름은 반드시 내 프로젝트의 android/app/src/main/AndroidManifest.xml 파일의 첫번째 <manifest> 태그 안에 있는 이름과 동일해야 합니다.

com. 으로 시작되는 바로 저 이름입니다.

나머지 두 항목은 선택사항입니다.

디버그 서명 인증서 SHA-1항목의 경우 선택사항이지만, 동적 링크, 초대, Google 로그인 등의 기능을 구현하려면 필수라고 합니다.필요할 경우, cd android && ./gradlew signingReport 커맨드를 사용한 후 debug 키의 SHA1 를 긁어와 입력하면 된다고 합니다. 전 필요 없어서 패스

3.2. 인증서 다운로드 후 내 프로젝트에 삽입

(이미 앱 생성이 완료된 상태라 참고한 블로그의 사진을 캡쳐해왔습니다. 출처)저처럼 이미 앱을 생성했다면 아래 사진에 보이는 곳에서도 다운로드 받을 수 있습니다.

해당 파일을 다운받으셨다면, /android/app 경로 아래에 해당 파일을 넣어주세요!!

중요!! android 또는 ios 폴더 아래의 항목을 수정하실 땐 반드시 android studio 나 Xcode 를 켜서 작업해주세요.VSCode 같은 IDE 에서 작업을 하게 되면 동기화가 안 됩니다.google-services.json 파일도 android 폴더 아래에 들어가는 파일이기 때문에android studio 를 열어서 진행해주세요!!!!!

/android/app/google-services.json 이 위치에 파일이 잘 들어가 있다면 성공입니다.





xcode 환경설정 (vscode말고 xcode에서 해야함)

Gyunju 폴더 root에 넣을 파일

그리고 이걸 Xcode 에 열려 있는 내 프로젝트의 root 에 추가해줍니다.RN Firebase 공식 문서에는 복잡하게 되어있지만 그냥 drag & drop 으로도 됩니다. 위치만 착각하지 마세요!!

GoogleService-Info.plist 파일을 옮겨놓으려 하면 이런 창이 뜹니다.Copy items if needed 과 Create groups 에 체크해주시고 Finish 를 눌러주세요.

App.Delegate.m

#import "AppDelegate.h"
#import <Firebase.h>

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if ([FIRApp defaultApp] == nil) {
      [FIRApp configure];
    }
RCTAppSetupPrepareApp(application);

알림 설정

xCode 의 개발 소스로 돌아갑니다.

Signing & Capabilities -> + Capability

  • Push Notifications를 추가합니다.
  • Background Modes 를 추가하고 Remote Notifications 에 체크합니다.

이렇게 앱에서 push notification 을 받을 준비는 끝났습니다.

리액트 네이티브 설정

ios - Podfile에 추가

target 'Gyunju' do
  config = use_native_modules!

  pod 'GoogleUtilities', :modular_headers => true
  pod 'FirebaseCore', :modular_headers => true

프론트 라이브러리 설치

안드로이드 화면 깨우기

https://www.npmjs.com/package/react-native-android-wake-screen

yarn add @react-native-firebase/app @react-native-firebase/messaging

yarn add react-native-android-wake-screen → 이건 선택사항

App.tsx

import messaging from '@react-native-firebase/messaging';	

// 앱 실행시 알람 동의창
	async function requestUserPermission() {
    const authStatus = await messaging().requestPermission();
    const enabled =
      authStatus === messaging.AuthorizationStatus.AUTHORIZED ||
      authStatus === messaging.AuthorizationStatus.PROVISIONAL;

    if (enabled) {
      console.log('Authorization status:', authStatus);
    }
		// 유저 토큰
    console.log(await messaging().getToken());
  }
	// 앱 실행상태에서 알람 받을때
  useEffect(() => {
    const unsubscribe = messaging().onMessage(async (remoteMessage) => {
      Alert.alert('A new FCM message arrived!', JSON.stringify(remoteMessage));
    });

    return unsubscribe;
  }, []);

  requestUserPermission();

index.js

import messaging from '@react-native-firebase/messaging';
import AndroidWakeScreen from 'react-native-android-wake-screen';

// 안드로이드에서 알림 수신시 화면 켜는 함수
const MyHeadlessFunction = async () => {
  AndroidWakeScreen.wakeScreen();
};

// 백그라운드 및 종료된 상태에서 알람수신
messaging().setBackgroundMessageHandler(async (remoteMessage) => {
  console.log('Message handled in the background!', remoteMessage);
  MyHeadlessFunction();
});

안드로이드 스튜디오 설정 ( vscode말고 안드로이드 스튜디오에서 해야함.)

Gyunju > app 폴더에 추가 할 파일

android/bundle.gradle (Gradle Scripts > Project: Gyunju)

dependencies{
classpath("com.android.tools.build:gradle:7.2.1")
    // ... other dependencies
    classpath ('com.google.gms:google-services:4.3.8')
    // ^ 이거 한 줄 추가
}

android/app/build.gradle (Gradle Scripts > Module:Gyunju.app)

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services' // <- 추가

...

dependencies {
    ...

    // 아래 두 줄 추가
    // Add the SDK for Firebase Cloud Messaging
    implementation 'com.google.firebase:firebase-messaging:20.2.3'

    ...
}

백엔드 설정

라이브러리 설치

네스트 라이브러리

https://www.npmjs.com/package/nestjs-fcm

yarn add nestjs-fcm

FireBase SDK 파일 추가

백엔드에 카피

core.module.ts 또는 app.module.ts

import * as path from 'path';

import { FcmModule } from 'nestjs-fcm';

imports : [FcmModule.forRoot({
      firebaseSpecsPath: path.join("/home/ubuntu/k1-BE/fcm-sdk.json"),
    }),]

알림 푸시 코드

import { FcmService } from 'nestjs-fcm';

constructor(private readonly fcmService: FcmService) {}

let payload = {
      notification : {
        title:'견주',
        body:'견주바디',
      }
    }
    await this.fcmService.sendNotification([
      'token1', 'token2'],
			payload
      false,
    );